[Spring Boot] 5. Profiles

참조: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-profiles

개발 서버, 테스트 서버, 운영 서버 3곳에 CI/CD를 하고 있다고 가정했을때
동일한 어플리케이션에서 설정만 조금만 달라지는 경우가 있을 것이다.
이때 프로퍼티파일이나 별도의 설정파일을 만들 수도 있지만 이 경우
각각의 설정을 관리하는 것도 어려움이 따른다.

스프링 프로파일은 스프링 3.1부터 포함된 기능으로 환경에 알맞는 프로파일을 사용할 수
있게 하는 기능이다. 미리 프로파일을 정의해놓고 필요시 적절한 프로파일만 활성화하면
된다. 그러면 특정 프로파일에 따라 각 프로퍼티의 값을 다르게 적용하는 것이 가능하며
프로파일에 따라서 특정 빈을 등록하고 등록하지 않는 것도 가능하다.

@Profile 타겟은?

  • @Configuration
  • @Component

프로파일 활성화 => spring.profiles.active

2개의 프로파일을 선택하는 예제를 만들어 보자.

prod 프로파일의 BaseConfiguration.java
1
2
3
4
5
6
7
8
9
10
11
@Profile("prod")
@Configuration
public class BaseConfiguration {
# 프로파일

@Bean
public String hello(){
System.out.println("base bean executed");
return "hello prod";
}
}
test프로파일의 TestConfiguration.java
1
2
3
4
5
6
7
8
9
10
@Profile("test")
@Configuration
public class TestConfiguration {
@Bean
public String hello(){
System.out.println("test bean executed");
return "hello test";
}
}

프로파일을 선택하기 위해서는 spring.profiles.active라는 Environment프로퍼티를
사용한다.

application.properties
1
spring.profiles.active=prod

IDE에서 application.properties에 작성시 메타정보로 인해서 위의 해당 프로퍼티
의 키값과 밸류값도 자동완성된다. 이것도 결국 프로퍼티이므로 예전에 봤던 우선 순위도
동일하다 이는 커맨드라인의 프로그램 아규먼트로 --spring.profiles.active=test식으로
주면 우선순위에 따라서 아규먼트로 들어간 프로파일이 활성화된다.

마찬가지로의 우선순위로 프로파일용 프로퍼티가 application.properties보다
우선순위이다. 프로파일용 프로퍼티의 이름은 application-{profile}.properties이다.
위의 경우 application-prod.properties,application-test.properties 2개의
프로파일용 프로퍼티파일을 만들어 놓으면 활성화된 프로파일 이름이 들어간
프로퍼티 파일만이 읽혀지며 이는 application.properties보다 우선순위이다.

프로파일 추가 => spring.profiles.include

한 프로파일에서 다른 프로파일을 추가 할때 사용할 수 있다.
예를 들어서 위의 예제 같은 경우 DB 프로파일을 prodDB, testDB를 만들고 각각 prod,
test 프로파일에 적용하고 싶을때 사용할 수 있다.

application-prod.properties
1
spring.profiles.include=prodDB
application-test.properties
1
spring.profiles.include=testDB

이를 사용해서 프로파일의 계층 구조를 만들 수도 있을 것이다.
잘쓰면 좋고 잘못쓰면 약간 고생할 수 있을 수 있는 소재다 ㅋ

Related POST

공유하기