Spring Boot 환경변수 오버라이드 이슈

Albert·2025년 8월 4일

이슈

공통 DTO 의존성을 최신화하였는데, AWS Parameter Store 환경변수를 가져오지 못하는 이슈가 발생하였습니다.
그래서 개발환경에서 테스트 해보니 서버가 부팅되지 않는 이슈를 발견하였습니다.

배경

  • 최신화한 라이브러리는 공통으로 사용하기 위한 DTO 라이브러리 였습니다.
  • 해당하는 레파지토리는 멀티 모듈로 되어 있었고, DTO 와 공통 설정 파일들을 묶어서 하나의 모듈로 만들었습니다.

원인 파악

./gradlew bootRun --args='--logging.level.root=TRACE'
위의 명령어를 통해서 TRACE 로그를 통해, 자세한 환경변수 설정값을 볼 수 있습니다.

해당 설정을 확인해보면 application-local.yaml, application-local.yml 이 중복으로 imported 된 것을 확인할 수 있습니다.

즉, 레파지토리의 사용하는 환경변수의 확장자가 yaml, yml 이 달라서 문제가 발생하는 것이었습니다.

해결방안

  1. 공통 DTO 라이브러리에 환경변수 설정하는 부분을 드러내고 DTO 에는 DTO 만 포함되도록 처리한다.
  2. yaml 확장자를 yaml, yml 둘 중에 하나로 맞춘다.

결론적으로, 1번 방법이 중복으로 이슈가 발생하지 않는 방법이라 생각되어 1번 방법을 선택하기로 했습니다.

참고사항

Spring Boot 환경변수 로딩 과정

SpringApplication run() 메서드를 통해서 기본적으로 SpringApplication 이 실행됩니다.
이때, META-INF/spring.factories 값 들의 클래스들을 등록하게 됩니다.

spring.factories

# PropertySource Loaders  
org.springframework.boot.env.PropertySourceLoader=\  
org.springframework.boot.env.PropertiesPropertySourceLoader,\  
org.springframework.boot.env.YamlPropertySourceLoader

spring.factories 를 보면, env 값을 위와 같이 불러옵니다. 우선순위는 아래로 갈수록 높아집니다.

환경변수를 등록하는 과정을 간단하게 보면 아래와 같습니다.

  1. SpringApplication.envrionmentPrepared() 로 이벤트 발행
void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) {
	doWithListeners("spring.boot.application.environment-prepared", 
    	(listener) -> listener.environmentPrepared(bootstrapContext, environment));
}
  1. ApplicationListener 를 상속받은EnvironmentPostProcessorApplicationListener 에서 이벤트를 consume

  2. ConfigDataEnvironmentPostProcessor

  3. ConfigDataEnvironmentContributors

  4. ConfigDataImporter

  5. YamlPropertySourceLoader

를 거치면서 Yaml 환경변수(application.yaml, application.yml) 값을 읽어 옵니다.

yaml, yml 무엇이 더 대중적인가?

YAML 파일에 대해 권장되는 공식 파일 이름 확장자는 2006년부터 .yaml 입니다. 2024년에는 MIME 유형 application/yaml 완성되었습니다.
https://en.wikipedia.org/wiki/YAML

profile
개발 블로그

0개의 댓글