환경 분리가 왜 필요한가?
애플리케이션은 로컬, 개발, 운영, 테스트 등 다양한 환경을 지원하고 싶을 수 있다.
각 환경마다 다른 자원, 스팩을 사용하는 일은 생각보다 자주 마주친다.
SpringBoot 는 이를 지원하기 위한 매커니즘으로 Profile 을 제공한다.
yaml 파일로 환경 분리하기
사전 준비
SpringBoot 앱이 로드되자마자 Yaml 파일을 읽어 로깅하도록 지정했다.
어노테이션은 주석을 참고하자.
(1) 하나의 application.yaml 에 때려박기
(2) 환경별 yaml 파일 분리하기
profile 을 환경별로 분리하여 정의하고 `application.yaml` 에서 `spring.profiles.active` 값만 지정해줘야한다.
해당 값 미지정시 어느 프로파일로 실행할지 결정하지 못해 Runtime 에러가 발생할 수 있다.
환경별로 파일을 분리할 때
application-{env-name}.yaml 네이밍을 따르면
spring.config.activate.on-profile 속성은 생략 가능하다.
그럼 반드시 application.yaml 의
`spring.profiles.active` 값이 우선되나요?
아니다.
CLI 로 수동 설정하거나
Configuration class 로 profile active 값을 주입할 수 있다.
기타 Profile 지정 방법
CLI 로 profile 지정하기
gradle 을 사용한다고 가정한다.
# application.yaml 설정값보다 CLI arguments 가 우선순위가 높다.
$ gradlew bootRun --args='--spring.profiles.active=prod'
@ActiveProfiles 어노테이션 사용하기
어느 Profile 의 property 를 읽어올 것인지 ApplicationContext (Spring Bean Container ) 초기화시 결정한다.
우선순위가 높다. `spring.profiles.default` `spring.profiles.active` 값이 달라도 어노테이션 값으로 읽어온다.
SpringBootUnitTest 클래스를 상속받은 모든 유닛테스트 클래스에서 SpringBoot 를 로드할 때 'test' 프로파일 즉, application-test.yaml 설정을 따라간다.
@ActiveProfiles 어노테이션은 오로지
`test` 패키지 하위 클래스에서만 사용 가능하다.
Profile 적용 우선순위
CLI arguments > environment variables > @ActiveProfiles 또는 application properties > default properties
Profile 적용 방법
(1) default profile
`spring.profiles.default` 에 명시된 항목.
기본값은 `default` profile
(2) Active profile
application.yaml 에 명시가 가능하다.
- CLI arguments
- application.yaml 명시
`spring.profiles.active`
Application,yaml 의 `spring.profiles.active` 의 마지막 원소가
어느 application-{profile}.yaml 를 load할지 결정한다.
'JVM > Spring' 카테고리의 다른 글
[Spring] DataJpa - Query methods, @Query (0) | 2024.12.14 |
---|---|
[Spring] Servlet Container, Servlet (0) | 2023.03.19 |
[Spring] logback-spring.xml (0) | 2023.02.21 |
[Spring] ConfigurationProperties + ConfigurationPropertiesScan (0) | 2023.02.13 |
[SpringBoot] Naming methods in each layer (0) | 2023.02.09 |