Development/Daily Error

일간에러) application.yml 파일을 못읽을때 spring.config.location

📝 작성 : 2022.04.05  ⏱ 수정 : 
반응형

문제

최근 프로젝트의 Spring Boot 버전을 1.5 에서 2.5로 마이그레이션을 진행 한 후 로컬에서 수많은 테스트를 거쳤습니다.

최근에는 개발 서버에도 올려서 정상적인 작동을 확인 하였고 이제 운영 서버에 반영을 시도 할 때가 되었습니다.

스프링부트 버전을 업그레이드 한 7개의 패키징을 갈아 끼우고, docker-compose up -d 을 외칩니다.

도커 컨테이너가 하나 둘 씩 문제없이 뜨기 시작합니다. status를 보니 UP, UP, UP, UP, UP, 그 가운데 슬며시 껴있는 Restarting 하나.

어플리케이션이 딱 하나 구동되지 못하고 계속 재 시작 되고 있습니다. 로그를 확인 해 보니

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'something' in value "${something}"

application.yml 파일에 해당 값을 설정해두고 @Value로 불러오고 있었는데, 읽어오지를 못합니다.

원인

흔한 상황

보통 application.yml 파일을 읽지 못하는 경우는

  1. pom.xml의 packaging이 올바르지 않을 때
  2. applicatiom.yml 처럼 파일명에 오타가 있을때
  3. application-dev.yml 처럼 특정 profile에 작성한 설정값의 경우에는 profile 설정이 되지 않아서

등이 있습니다. 그런데 위에 언급한 모든 상황에 해당 하지 않아서 찾느라 굉장히 고생을 했습니다.

진짜 원인

Spring Boot 버전 변경이 직/간접적인 원인이 되었습니다.

운영 서버에서는 환경변수로 spring.config.location에 추가적인 yml 파일을 등록 해서 사용하고 있었는데요, spring.config.location 환경변수 설정을 삭제 하면 기존의 application.yml 파일을 정상적으로 잘 읽는 것이 확인 되었습니다.

spring.config.location 설정이 이전에는 추가적인 설정 파일을 등록 해 주었지만 지금은 기존의 application.yml 파일을 무시하며 덮어 쓰고 있었습니다.

기존 docker-compose.yml 파일

user:
  environment:
    - SPRING_CONFIG_LOCATION=file:///etc/additional.yml
  volume:
    - ./additional.yml:/etc/additional.yml  

볼륨으로 매핑한 additional.yml 파일을 SPRING_CONFIG_LOCATION 환경변수 설정을 통해 외부 설정 파일로 등록하였습니다. 이전에는 기존의 application.yml 파일과 additional.yml 파일 모두 불러왔는데 지금은 additional.yml만 불러오는 상황 입니다.

Spring Boot Release note를 2.0 부터 2.5까지 싹 찾아도 관련 내용을 못찾았는데 엉뚱한 곳에서 힌트를 얻었습니다.

image-20220405174140971

https://docs.spring.io/spring-boot/docs/current/reference/html/features.html

spring.config.location 설정을 할 때, 해당 파일이 있다고 확신 할 수 없는 상황에서는 optional: 전치사를 붙이라는 내용이 담긴 문서인데, spring.config.additional-location이라는 설정이 눈에 띕니다.

해당 키워드들로 검색 하니 2.0.0. M 버전 릴리즈 노트에서 관련 내용을 간신히 찾을 수 있었습니다.

note

원래는 spring.config.additional-location 쓰여야 하는 상황에 spring.config.location이 사용되어도 차이가 없었지만, M5 버전 부터는 그렇지 못하도록 변경되었다고 합니다.

이 패치 부터는 spring.config.additional-location을 사용하면 기존의 설정 파일을 덮어버리니, 해당 설정을 잘못 사용하고 있는 경우에는 additional-location을 대신 사용하도록 하라고 하네요.

해결

변경 전 docker-compose.yml 파일

user:
  environment:
    - SPRING_CONFIG_LOCATION=file:///etc/additional.yml
  volume:
    - ./additional.yml:/etc/additional.yml  

변경 후

user:
  environment:
    - spring.config.additional-location=file:///etc/additional.yml
  volume:
    - ./additional.yml:/etc/additional.yml  

spring.config.location을 Spring Boot 문서에 나온 대로 spring.config.additional-location으로 변경 하자 두개의 설정 파일을 모두 읽어들이는걸 확인 할 수 있었습니다.

SpringBoot 버전이 2.X로 올라오며 변경사항이 워낙에 많았기 때문에 꼼꼼하게 문제 있는 부분이 없는지 확인 하여야 하겠습니다. 이상입니다.

반응형