[spring] yml파일 인식 못할 경우
본 글은 정확하지 않을 수 있습니다. 참고용으로만 봐주시면 감사하겠습니다.
현재 폴더 구조는 대략 이렇다. backend-security폴더는 서브모듈이며 배포환경에 맞는 환경파일들을 모아놓았다.
# application.yml
spring:
profiles:
active: prod
평소와 같이 application.yml에서 profiles를 prod로 지정해 주면 backend-security/application-prod.yml이 설정될 줄 알았는데 안 되었다.
원인은 간단했다. spring에서 환경파일을 인식해 주는 범위가 resources 바로 아래이거나 resources/config 이기 때문이다.
정확한 정보는 아래 링크에 있다.
해결법
가장 간단한 방법은 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에 설정될 경우에만 파일이 활성화되므로 충돌이 나지 않는다.