그 외 공부/트러블 슈팅

Spring Boot의 Multi-Document file 방식의 yml이 정상적으로 작동하지 않은 이슈 해결하기 (feat. use-legacy-processing)

SeongOnion 2025. 5. 21. 21:41
728x90

환경

  • JDK 11
  • Spring Boot 2.6.8

 

문제상황

Spring은 Profile별로 다른 프로퍼티 값을 주입하기 위해 yml 혹은 properties 파일을 사용한다.

 

일반적으로 application-{profile}.yml 파일을 profile 마다 만들어 따로따로 값들을 관리하거나, 혹은 단일의 application.yml 파일을 두고 Multi-Document file 형식으로 값들을 관리한다.

 

3개의 하이픈("-")을 경계로 두고 spring.config.activate.on-profile 옵션을 통해 특정 profile에서만 프로퍼티 값들이 사용되도록 하는 방식이다.

 

아래는 문제 발생 당시 yml 파일의 예시이다.

// applcation-local.yml

my-property: local-property

---

// profile이 dev일 때만 적용!
spring:
  config:
    activate:
      on-profile: dev

my-property: dev-property

profile을 분명 local로 적용하였으나, my-property 값이 예상과 다르게 dev-property로 주입되었다.

상황 재현

profile이 정확하게 안먹은건가 싶었지만 디버거로 찍어봐도 profile은 local로 잘 먹고 있었다.

 

그러다 actuator를 사용해 property 값을 확인해보니, document가 총 2개 적용된 것을 볼 수 있었다!

GET /actuator/env/my-property

이 말은 즉 profile은 local로 정상적으로 먹었으나, dev profile의 값이 함께 적용되어버린 매우 이상한 상황이었다.

 

두 값 모두 적용이 되었으나, application-local.yml에서 위치상 dev profile에서의 dev-property 값이 가장 나중에 작성되었으므로 local-property 값을 덮어씌워진 것으로 추측했다.

 

해결

해결은 다소 허무하게도 application.yml 에 디폴트로 설정된 spring.config.use-legacy-processing: true 값 때문이었다.

// application.yml
spring:
  config:
    use-legacy-processing: true

https://spring.io/blog/2020/08/14/config-file-processing-in-spring-boot-2-4#using-legacy-processing

해당 값은 Spring Boot 2.4 버전 릴리즈에 추가된 값으로, spring config 방식을 릴리즈 이전 버전인 2.3 버전의 방식으로 강제하는 값이다.

 

그러나 Multi-document file 방식의 config 설정은 2.4 버전에 추가된 값으로, 만약 use-legacy-processing 옵션이 켜져 2.3 버전 방식으로 config가 돌아간다면 당연히 해당 방식은 정상적으로 작동하지 않게 된다.

 

해당 값을 제거한 후에는, 예상했던대로 local-property 값만 주입되는 것을 확인할 수 있었다.

참고로 use-legacy-processing 옵션은 Spring Boot 3.0 버전부터 deprecate 과정 없이 바로 remove 되어버리니 큰 문제가 되지 않는다면 + Spring Boot 버전업 예정이 있다면 적극적으로 제거할 수 있도록 하자.

https://spring.io/blog/2022/05/24/preparing-for-spring-boot-3-0#migrate-from-legacy-applicationproperties-and-applicationyaml-processing