Search
Duplicate
🔫

Spring Boot profile active 삽질하기

분야
BE
주제
Spring
DB
심각도
중간😵
제보자
sanan
담당자
작성자
상태
처리 완료
이슈링크(optional)
작성일자
2023/06/04 00:00
공개여부
공개
글감

문제 상황

현재 자바 스프링 포팅 중에 있습니다.
테스트를 위한 Mock SQL을 작성, 테스트용 컨테이너를 띄워놓았습니다.
이를 datasource(DB)로 연결하는 application-test.yml을 작성하였습니다.
application-test.yml을 profile로 테스트 애플리케이션이 구동되는 것을 예상하였습니다.
하지만 application-test.yml이 아닌 application-local.yml의 datasource를 참조하는 문제가 발생하였습니다.

원인

추정 원인 application.yml을 통해서 특정 환경에 따른 profile을 active하도록 구성하였는데, 기본적인 구성인 application-test.yml과 application-local.yml이 원활하게 적용되지 않는 것으로 추정했습니다.
실제 원인 문제 상황의 application.yml과 application-local.yml, application-test.yml의 간략한 구성은 다음과 같습니다.
#application.yml spring: profiles: active: local config: import: classpath:application-auth.yml #application-local.yml spring: datasource: driver-class-name: org.mariadb.jdbc.Driver url: jdbc:mariadb://localhost:3307/cabi_local?serverTimezone=Asia/Seoul&characterEncoding=UTF-8 username: [이름] password: [비밀번호] #application-test.yml spring: datasource: driver-class-name: org.mariadb.jdbc.Driver url: jdbc:mariadb://localhost:3310/test_db username: root password: test_password
YAML
복사
1.
기본적으로 Spring Boot에서 profiles.active 옵션을 확인할 때, 가장 마지막의 active 옵션을 on 합니다. → 위에서 어떤 프로필을 active하든, 결국 마지막의 active가 적용됩니다!!
2.
“test”라는 profile 이름은 Spring Boot가 알아 듣기는 합니다.
3.
하지만, active 되어 있는 것이 있다면 그것을 우선시하기에, application-test.yml이 있더라도, application.yml에서 active한 profile이 적용되어버립니다.

최종 해결

어떻게 해야할까? 결론적으로, spring.profiles.active(일단 켜버리기) 옵션을 잘 모르고 쓴 것이고, 또한 의도했던 동작(환경에 따라 prod-dev-local의 구분)을 원한다면, spring.config.activate.on-profile(지정된 profile 이름에 따른 사용) 옵션을 사용해야 합니다.
yml 파일 바꾸기
#변경 전 application.yml spring: profiles: active: local config: import: classpath:application-auth.yml #변경 후 application.yml spring: config: import: classpath:application-auth.yml activate: on-profile: local
YAML
복사
기존의 application-test.yml을 “/src/test/resources”에 application.yml로 두기
해당 테스트 시에 사용하는 외부 프로퍼티들을 명시한 yml은 config.import를 통해서 사용합니다(IDE에서는 뻘겋게 뜨는데 잘 작동함).
application-test.yml로 두어도, test/resources에 application.yml로 두어도 Spring Boot가 잘 적용하여 사용합니다.
실행 환경에서 기본적으로 profile 지정해주기 - Intellij local 환경
실제 배포시(dev, prod)에는 VM 옵션을 이용하거나 구동 시의 플래그(-D spring.profile.active)를 통해서 직접 지정해주도록 설정하면 될 것 같습니다.

참고자료