spring.config.import 내에서 원하는대로 override 가 이루어질까?
Spring Boot application 을 구성하다보면 여러 yaml 이나 properties 파일들을 이용해 properties 를 정의한다.
또한 프로젝트 구성에 따라 분리된 여러 파일에 나누고 조합하며, 여러 서브 모듈에 properties 가 분리 되는 구성을 가져가기도 한다.
그리고 이 경우 불러오는 순서는 꽤 복잡하지만 대부분 익숙하게 알고 있는 범위는
- external application-{profile} properties
- internal application-{profile} properties
- external application properties
- internal application properties
이 순서이다.
이 외에도 spring.config.import
를 사용하게 되면 properties 설정값들을 list 로 지정할 수 있는데
spring.config.import
값 내의 순서가 있을지, ordering 및 override 가 정상적으로 동작하는지 확인해보았다.
Test data
- a.yml
test-value: a
- b.yml
test-value: b
- application.yml
spring:
config:
import:
- classpath:/a.yml
- classpath:/b.yml
test-value: application
Test
@Value("${test-value}")
private String testValue;
위와 같이 value 를 property 로 부터 주입받도록 하고 값을 찍어보았다.
결과는 아래와 같다.
testValue: b
import 의 마지막 순서의 property 로 지정된 b
로 찍혔다.
import 순서를 변경하여 다시 테스트 해보았다.
- application.yml
spring:
config:
import:
- classpath:/b.yml #
- classpath:/a.yml # Order changed
test-value: application
testValue: a
import 의 마지막 순서의 property 로 지정된 a
로 찍혔다.
결과적으로 import 내에는 순서가 있다는 것을 알 수 있다.
Why?
Spring documentation 내에 있는 2.3.4. Importing Additional Data
항목에 나와있는 내용이다.
Application properties may import further config data from other locations using the
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config.files.importingspring.config.import
property. Imports are processed as they are discovered, and are treated as additional documents inserted immediately below the one that declares the import.
문맥에서 가장 중요한 부분은 아래이다.
- Imports are processed as they are discovered
- application.yaml
spring:
config:
import:
- classpath:/b.yml #
- classpath:/a.yml # Order changed
test-value: application
따라서 이 경우
- application.yml 에 정의 된
application
이 불러와지고 - b.yml 에 있는
b
가 불러와지고 - a.yml 에 있는
a
가 불러와져서 - 최종적으로 a 가 test-value 키의 값이 된다.
TL; DR
- spring.config.import 내에 정의되는 properties 값들은 순서를 가진다.
- property 들은 override 를 하기 때문에 늦게 호출 할 수록 높은 우선순위를 갖게된다.
0개의 댓글