환경
- 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개 적용된 것을 볼 수 있었다!
이 말은 즉 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
해당 값은 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 버전업 예정이 있다면 적극적으로 제거할 수 있도록 하자.
'그 외 공부 > 트러블 슈팅' 카테고리의 다른 글
왜 @TransactionalEventListener에서 커밋이 안될까? (0) | 2024.04.24 |
---|---|
Spring Batch - Caused by: java.lang.IllegalArgumentException: Job name must be specified in case of multiple jobs 오류 (4) | 2024.01.08 |
Spring Boot 3 버전 도입 후 NoSuchBeanDefinition 오류 발생 원인과 해결 (1) | 2024.01.06 |
SecurityFilterChain 적용 후 @WebMvcTest 테스트 실패하는 문제 (feat: @WebMvcTest 까보기) (1) | 2023.11.04 |
데이터베이스 트리거에 의한 Deadlock 발생 이슈 (0) | 2023.09.22 |