티스토리 뷰

Overview

스프링 부트에서 사용할 수 있는 설정 값들의 우선 순위를 알아봅니다.

설정

Spring Boot를 사용하면 설정을 외부화(externalize)하여 다른 환경에서 동일한 애플리케이션 코드로 작업할 수 있습니다.

설정의 종류는 다음과 같습니다.

  • 자바 속성 파일(properties)
  • yaml 파일
  • 환경 변수
  • 커맨드 라인 인수(command line argument)

속성 값은 @Value를 통해 주입하거나 Environment 추상 클래스를 통해 접근하거나 @ConfigurationProperties를 이용해 객체에 바인딩 할 수 있습니다.

우선순위

설정 값을 우선순위에 의해 오버라이드하는 방식으로 사용할 수 있습니다.

우선순위는 낮은 순에서 높은 순으로 오버라이드되므로, 공통으로 사용할 값일 수록 우선순위가 낮아지고, 프로파일이나 특정 환경별로 사용할 값일 수록 우선순위가 높아집니다.

우선순위는 다음과 같습니다.

No Priority Property
1 Low 기본 속성(SpringApplication.setDefaultProperties)
2   @Configuration 클래스
3   application.properties 파일
4   OS 환경 변수
5   자바 시스템 변수(System.getProperteis())
6   JNDI attributes(java:comp/env)
7   ServletContext 초기화를 위한 매개변수
8   ServletConfig 초기화를 위한 매개변수
9   SPRING_APPLICATION_JSON(환경 변수 또는 시스템 변수에 포함된 인라인 JSON)
10   Command Line Arguments
11   @SpringBootTest와 함께 사용된 properties
12   @TestPropertySource
13 High devtools 활성 상태일 때 $HOME/.config/spring-boot 디렉토리 내 devtools 전역 설정

보통 우리가 개발할 때 가장 많이 사용하는 설정은 2~3번 정도, 운영시 배포를 위해 사용하는 설정까지 포함하면 2~5번 정도로 설정파일을 사용합니다.

따라서 환경에 의존성이 있는 설정들을 우선순위에 맞게 사용할 필요가 있습니다.

특히 3번(application.properties)의 경우 파일 위치와 프로파일에 따른 우선순위가 적용됩니다.

  1. classpath 내부에 존재하면서 .config 디랙토리에 위치한 application.properties
  2. classpath 내부에 존재하면서 .config 디랙토리에 위치한 application-{profile}.properties
  3. classpath 내부에 존재하는 application.properties
  4. classpath 내부에 존재하는 application-{profile}.properties
  5. classpath 외부에 존재하면서 config 디렉토리에 위치한 application.properties
  6. classpath 외부에 존재하면서 config 디렉토리에 위치한 application-{profile}.properties
  7. classpath 외부에 존재하는 application.properties
  8. classpath 외부에 존재하는 application-{profile}.properties

보통 src/main/resources 내에 설정 파일을 위치시키는데 해당 경로는 classpath로 설정되어있으므로 3, 4번에 해당하고, application.properties를 기준으로 현재 활성화 된 프로파일의 속성을 오버라이드 시킵니다.

좀 더 우선순위가 낮은 설정파일을 추가하고 싶다면 resources/.config 내에 위치시키면 됩니다.

5~8번의 경우 classpath 외부에 위치하는데 애플리케이션을 실행하는 위치에 있는 설정파일입니다.

gradle이나 java 명령어로 스프링 부트 애플리케이션을 실행시킬 때 보통 .jar 파일이 있는 곳에서 실행하게 되는데 그 위치에서 config 디렉토리 하위에 위치한 설정 파일이 classpath에 있는 설정파일을 오버라이드 합니다.

그리고 .jar 파일과 동일한 디렉토리 내에 있는 설정 파일이 가장 높은 우선순위를 가집니다.

따라서 빌드 없이 외부 설정 파일만 바꾼 뒤 애플리케이션을 재시작하면 설정을 바꿔서 실행시킬 수 있습니다.

특히 로컬에서 IDE 등을 이용하는 경우 프로젝트 루트 디렉토리 또는 루트 디렉토리 내 config 디렉토리에 설정 파일을 따로 사용하고 .gitignore에 추가하게 되면, 암호 등과 같은 민감한 정보를 git에 같이 포함시키지 않고 공유할 수 있습니다.

Reference

Spring Boot Reference Document

댓글