스프링 부트 환경 설정과 우선순위

스프링 부트의 환경 설정과 우선순위

스프링 부트 가이드 문서에선 스프링 부트의 환경설정에 대해 이와 같이 설명하고 있다.

Spring Boot lets you externalize your configuration so that you can work with the same application code in different environments. You can use properties files, YAML files, environment variables, and command-line arguments to externalize configuration. Property values can be injected directly into your beans by using the @Value annotation, accessed through Spring’s Environment abstraction, or be bound to structured objects through @ConfigurationProperties.

스프링 부트는 환경설정을 외부화 하므로써 같은 어플리케이션을 다른 환경에서도 사용할 수 있게한다. Properties 파일, YAML 파일, 환경변수 그리고 커맨트 라인 인수를 환경 설정을 외부화 한다. 설정 된 Property 값은 @Value 어노테이션을 통해 빈 객체에 직접 주입하며 스프링의 Environment 추상화를 통해 접근하거나 @ConfigurationProperties를 통해 객체를 구조화 할 수 있다.

스프링 부트는 알맞게 재정의 할 수 있도록 매우 독특한 PropertySource의 우선 순위를 이용한다.

  1. 홈 디렉토리에 위치한 Devtools 전역 프로퍼티 세팅 파일(devtools가 동작 중)
  2. @TestPropertySource 어노테이션(테스트)
  3. @SpringBootTest과 테스트 어노테이션을 이용한 어플리케이션의 일부분(?)
  4. 커맨트 라인 인수
  5. Properties 파일 내 SPRING_APPLICATION_JSON(환경변수 혹은 시스템 프로퍼티에 내장 된 inline JSON)
  6. ServletConfig에 설정된 파라미터(web-dd 내 init-param)
  7. ServletContext에 설정된 파라미터(web-dd 내 init-param)
  8. java:comp/env의 JNDI 속성
  9. JAVA 시스템 프로퍼티스(System.getProperties())
  10. 운영체제 환경변수
  11. random.* 형태만 가지는 RandomValuePropertySource 프로퍼티
  12. jar 패키지 외부의 특정 프로파일 Properties(application-{profile}.propreties와 YAML)
  13. jar 패키지 내부의 특정 프로파일 Properties(application-{profile}.propreties와 YAML)
  14. jar 패지키 외부의 Properties(application.properties와 YAML)
  15. jar 패키지 내부의 Properties((application.properties와 YAML)
  16. @Configuration 클래스에 선언한 @PropertySource 어노테이션
  17. 기본 Properties (SpringApplication.setDefaultProperties로 정의)

이와 같이 Properties, YAML, 시스템 환경변수, 커맨드 라인 인수등을 이용하여 설정을 관리한다.
주로 스프링이 XML 파일을 통해 관리한 반면 스프링 부트는 Properties 파일과 YAML 파일을 이용한다.
초기 스프링부트는 Properties 파일만을 지원했지만 현재는 YAML을 지원 및 권장한다.

YAML에 대한 설명은 별도 포스트 참고


설정 파일 위치의 우선순위

SpringApplication은 해당 경로에 따라 application.properties 파일을 읽어들이며 이로부터 프로퍼티를 가져와 Spring Enviroment에 추가한다.

  1. 현 위치 하위 /config 디렉토리
  2. 현 위치 디렉토리
  3. 클래스패스 내 /config 패키지
  4. 루트 클래스패스

해당 우선순위를 기준으로 상위 경로는 하위 경로에 오버라이드 된다.
Properties 파일은 YAML 파일로 대신할 수 있다.

파일명은 application.properties을 기본으로 spring.config.name 인수를 통해 변경할 수 있다.
경로 또한 spring.config.location 인수를 이용하여 변경한다.
디렉토리 혹은 파일이 여러 개인 경우 ,(쉼표)를 구분자로 명시한다.

어플리케이션 내 설정 파일의의 파일명 및 위치에 대한 설정은 파일이 로드 되기 전에 결정되어야 하는 부분이므로 커맨드 라인 인수, 운영체제 환경변수, 시스템 프로퍼티로 설정한다.

설정 인수가 1개인 경우

1
java -jar demo.jar --spring.config.name=demo

설정 인수가 2개 이상인 경우(쉼표 단위로 구분)

1
java -jar demo.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties


프로파일 프로퍼티스(Profile-specific Properties)

application.properties와 더하여 프로파일 프로퍼티스는 application-{profile}.properties으로 네이밍 하는 것이 관행이다. 프로파일이 설정 되지 않은 경우 기본 프로파일(default) 가지고 있다. 만약 프로파일을 명시 하지 않은 경우 application-default.properties로 부터 읽어들인다. 프로파일 프로퍼티스 파일은 표준 application.properties와 같은 위치에서 읽어들인다. 프로퍼티 파일들은 언제나 jar 패키지 내부이든 외부이든 디폴트 프로퍼티보다 프로파일 프로퍼티를 오버라이딩하여 읽어들인다.

만약 프로파일이 여러 개일 경우, 최종 쟁취 전략(last-wins strategy)를 따른다. 예를 들어 spring.profiles.active 명시 된 프로파일은 SpringApplication API 이후에 추가되어진다.

spring.config.location을 통해 파일을 추가한 경우, 프로파일 관련 관련 파일들은 대상이 되지 않는다. 프로파일 프로퍼티를 사용하고자 한다면 spring.config.location에 디렉토리를 명시해야한다.


임의 값을 설정하는 방법(Configuring Random Values)

RandomValuePropertySource은 임의 값을 주입할 때 유용하다.(예를 들어 보안이나 테스트 관련하여)
이러한 방법으로 integer, long, uuid 혹은 string 값을 만들 수 있다.

1
2
3
4
5
6
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

random.int* 표현식은 OEPN value (, max) CLOSE이다.
OPEN, CLOSE는 어떠한 문자든 될 수 있으며 value, max는 정수이다.
만약 max를 포함한다면 value는 최소 값이 되고 max는 최대 값이 된다.

Share