스프링 부트 개념과 활용 - 인프런
스프링 부트의 원리 및 여러 기능을 코딩을 통해 쉽게 이해하고 보다 적극적으로 사용할 수 있는 방법을 학습합니다.

스프링 부트 2.4에서 외부 설정 파일 관련된 변화가 있을 예정이다. 아직은 정식 버전 배포 전이기 때문에 미리 구체적으로 알아둘 필요까지는 없지만 몇가지 요점만 짚어보자면:

  • .properties 파일도 마치 .yaml 파일에서처럼 다중 문서를 지원한다.
  • 한 설정 파일 내에 있는 하위 문서가 상위 문서 내용을 덮어쓴다.
  • spring.config.activate.on-profile 로 해당 문서가 어떤 프로파일용 문서인지 지정한다.
  • 프로파일 지정(spring.config.activate.on-profile)과 사용할 프로파일(spring.profiles.active)을 한 문서 내에서 같이 사용할 수 없다. (혼란을 줄이고자.)
  • 프로파일 그룹 기능 지원. (특정 프로파일을 활성화 했을 때 같이 활성화 해야 하는 세부 프로파일을 설정하는 기능)

이런것들 기반으로 더 중요한 기능들이 2.4에 추가되지만 그건 나중에 정식으로 배포됐을 때(M 버전 말고 GA 버전) 살펴보기로 하고 이번 글에서는 스프링 부트가 지원하는 다양한 설정 파일과 그들의 우선 순위를 살펴보자.

스프링 부트 2의 현시점 GA 버전인 2.3을 기준으로 17가지 형태의 외부 설정 파일을 지원한다.

프로퍼티라고 하는 것들은 단순한 키(key)와 값(value) 형태로 제공하는 데이터를 말하는데 스프링 부트는 그러한 키/값을 설정할 수 있는 파일로 .properties 또는 .yaml 파일을 지원하며 시스템 프로퍼티 또는 환경 변수와 Java 실행시 커맨드 라인 아규먼트로 제공하는 키와 값도 지원한다.

다양한 형태의 프로퍼티를 지원하다보니 같은 키에 우선순위가 필요하고 각 우선순위에 따라 가장 우선 순위가 높은 순위에 정의한 프로퍼티가 그보다 낮은 순위에 있는 프로퍼티를 덮어쓴다.

  1. spring-boot-devtools를 활성화 시켰을 때 $HOME/.config/spring-boot 디렉토리에 안에서 제공하는 프로퍼티
  2. 테스트에 사용한 @TestPropertySource가 제공하는 프로퍼티
  3. @SpringBootTest 또는 슬라이스 테스트용 애노테이션의 properties 속성으로 제공하는 프로퍼티
  4. 커맨드 라인 아규먼트
  5. SPRING_APPLICATION_JSON 환경 변수 또는 시스템 프로퍼티에 인라인 JSON으로 정의되어 있는 프로퍼티
  6. ServletConfig 초기 매개변수
  7. ServletContext 초기 매개변수
  8. java:comp/env에 들어있는 JNDI 애트리뷰트
  9. 자바 시스템 프로퍼티 (System.getProperties())
  10. 운영체제 환경 변수
  11. RandomValuePropertySource. random 접두어를 가지고 있는 프로퍼티, random.* 에 무작위 값을 제공하는 프로퍼티 소스.
  12. JAR 패키지 외부에 있는 특정 프로파일용 애플리케이션 프로퍼티. (application-{profile}.properties 또는 YAML
  13. JAR 패키지 내부에 있는 특정 프로파일용 애플리케이션 프로퍼티. (application-{profile}.properties 또는 YAML
  14. JAR 패키지 외부에 있는 애플리케이션 프로퍼티. (application.properteis 또는 YAML)
  15. JAR 패키지 내부에 있는 애플리케이션 프로퍼티. (application.properteis 또는 YAML)
  16. @Configuration 클래스에 사용한 @PropertySource로 읽어들인 프로퍼티
  17. SpringApplication.setDefaultProperties()로 설정할 수 있는 기본 프로퍼티

start.spring.io 또는 인텔리J에서 스프링 부트 애플리케이션을 만들면 기본적으로 application.properties 파일을 src/main/resources 디렉토리에서 찾아볼 수 있는데 그 파일이 바로 15순위에 해당하는 프로퍼티를 정의할 수 있는 곳이다.

따라서 15순위에 정의한 프로퍼티는 얼마든지 그보다 높은 우선순위를 가진 프로퍼티를 사용해 재정의 할 수 있다. 가령 application.properties에 app.role을 test로 정의했다고 가정해보자.

application.properties

app.role=test

그럼 스프링 부트 애플리케이션 안에서 이 값을 @Value, Environment 또는 @ConfigurationProperties 등을 통해 사용할 수 있는데 결과적으로 test라는 값을 사용하게 된다.

그러나, 만약 운영체제 환경 변수에 APP_ROLE=env 라고 설정해 두었다면

export APP_ROLE=env

애플리케이션에서 읽어들이는 app.role의 값은 application.properties에 정의한 test라는 값이 아니라 우선 순위가 더 높은 운영체제 환경 변수에 정의한 값인 env가 된다.

이런 우선 순위를 활용하면 개발할 때 사용하는 기본 설정에서 제공하는 프로퍼티를 운영 환경 또는 개발 환경에 필요한 값으로 손쉽게 다양한 방법으로 재정의 할 수 있다.

참고