spring.config.import 내에서 원하는대로 override 가 이루어질까?

글쓴이 Engineer Myoa 날짜

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 가 정상적으로 동작하는지 확인해보았다.

Table of Contents
  1. Test data
  2. Test
  3. Why?
  4. TL; DR

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 spring.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.

https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config.files.importing

문맥에서 가장 중요한 부분은 아래이다.

  • 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 를 하기 때문에 늦게 호출 할 수록 높은 우선순위를 갖게된다.
카테고리: JAVA

0개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다