본문 바로가기
spring boot/환경설정

[spring] yml파일 인식 못할 경우

by junjunjun 2023. 2. 9.
반응형

본 글은 정확하지 않을 수 있습니다. 참고용으로만 봐주시면 감사하겠습니다.

 

yml파일들

현재 폴더 구조는 대략 이렇다. backend-security폴더는 서브모듈이며 배포환경에 맞는 환경파일들을 모아놓았다.

 

# application.yml
spring:
  profiles:
    active: prod

평소와 같이 application.yml에서 profiles를 prod로 지정해 주면 backend-security/application-prod.yml이 설정될 줄 알았는데 안 되었다.

원인은 간단했다. spring에서 환경파일을 인식해 주는 범위가 resources 바로 아래이거나 resources/config 이기 때문이다.
정확한 정보는 아래 링크에 있다.

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

해결법

가장 간단한 방법은 backend-security 폴더명을 config로 바꿔주기만 하면 된다. 폴더명이 config이면 spring에서 알아서 환경파일로 인식해 준다.

 

우리 프로젝트의 경우 이 방법으로 처리하면 한 가지 문제가 발생하게 된다.

config/application-test.yml과 /application-test.yml 둘 다 있을 경우 config 폴더 내의 파일이 우선순위를 더 높게 쳐준다. 따라서 로컬 환경에서 테스트를 진행할 경우에도 config/application-test.yml(배포환경) 설정을 불러온다.

 

본인은 다른 방법으로 backend-security폴더 안에 파일들을 import 해주도록 설정하였다.

# application.yml
spring:
  config:
    import:
      - classpath:/backend-security/application-prod.yml
      - classpath:/backend-security/application-test.yml # 우선순위 높음
  profiles:
    active: prod

말 그대로 해당 파일들의 내용물을 가져온다고 생각하면 된다.

이렇게 설정하고 프로그램이 잘 동작하기에 문제가 없는 줄 알았는데 직접 api요청을 보내보니 test환경의 db에 요청을 보내는 것을 확인하였다.

 

import를 통해 prod랑 test의 내용물을 둘 다 가져오는 과정에서 db관련 로직이 충돌하는 문제가 발생하였다. 따라서 한 줄 아래에 있는 test환경설정이 우선시 되어 설정되었다.

 

이 방법을 해결하기 위해 prod와 test 파일 각각에 on-profile을 설정해 주었다.

spring:
  config:
    activate:
      on-profile: prod
      
      
spring:
  config:
    activate:
      on-profile: test

따라서 active에 설정될 경우에만 파일이 활성화되므로 충돌이 나지 않는다.

 

반응형

댓글