Study/Spring Boot

SpringBoot(4) 2.4.x application.yaml(yml) 설정

이번에 여러 방식으로 테스트들을 진행해보고 있는데,

특히 H2 DB를 이용한 In-Memory 테스트를 진행하는 중에 기존에 사용하던 profile의 datasource 설정을 그대로 놔두고

test용 profile을 작성하여 실제 db와 테스트용 H2 DB 설정을 분리하는 작업을 진행해봤다.

(H2 DB 설정 및 H2를 이용한 테스트는 다음에...)

 

그러면서 기존에 작성한 application 설정 파일의 구동 방식이 Spring Boot 2.4 버전에 들어서 변경된 것을 알게 되어

기존 profile의 migration도 같이 진행하게 되었다.

 

Migration

 

1. spring.profile

2.4.x 이전 버전에서는 ---를 구분자로 사용하여 하나의 application 설정 파일에 profile별로 분리하고 profile을 명시하고

include: 를 사용해 추가적인 profile을 주입했을 것이다.

spring:
  profiles: local
    include:
      - localdb
---

spring:
  profiles: test
    
---

spring:
  profiles: localdb

---

spring:
  profiles: testdb

---

 

하지만 2.4.x 이상의 버전에서는 spring.profile 는 deprecated 처리되어서, 아마 이후의 버전에선 안 쓰이게 것이다.

또한 구분자 --- 는 동작하지만 profile 별 설정 분리는 새로운 방식을 따라야 한다. 

include: 는 이제 특정 profile 이 적용된 곳에서는 사용할 수 없고, 아래의 방식으로만 사용이 가능하다.

spring:
  profiles:
    include: localdb

---

spring:
  config:
    activate:
      on-profile: local
      

 

2. profile 설정 분리

하지만 위처럼 application을 구성하면 activate 된 profile과는 무관하게 모든 상황에서 include: 가 된다는 문제가 있다.

개별 profile 별로 include가 달라야 하는 필요가 있는 설정의 경우 2.4.x 버전에서 새롭게 추가된 

spring.profiles.group 속성을 사용하면 기존의 include: 방식과 같은 효과를 볼 수 있다.

spring:
  profiles:
    group:
      local: localdb
      test: testdb
 
---

spring:
  config:
    activate:
      on-profile: local

---

spring:
  config:
    activate:
      on-profile: localdb

---

spring:
  config:
    activate:
      on-profile: test

---

spring:
  config:
    activate:
      on-profile: testdb

 

3. Test용 yaml 파일 분리

하나의 application 설정 파일에 필요한 모든 profile 정보를 구분자 --- 로 나누어 작성할 수도 있지만

보통 profile을 나누는 이유는 local, prod, live, test 등 개발환경별로 설정을 다르게 하기 위함일 것이다.

 

나의 경우도 local과 test 환경의 db설정을 다르게 사용하기 위함이었는데, 

testCompile로 선언한 h2 dependency로 인해 main 디렉터리에서는 DB Driver를 잡을 수 없어 

test 디렉토리에 resources 폴더 생성 후 새로운 yaml 파일을 만들어 설정을 분리하여 사용하게 됐다.

(이에 관한 자세한 글은 H2 DB Test 관련 글에서 작성하려 함)

 

프로젝트 패키지 일부

IntelliJ 2.3 + gradle 6.7.1

test 디렉터리 아래엔 resources 폴더가 없는 걸 확인할 수 있다.

이 상태에서 디렉터리를 새로 생성해주면

 

아래처럼 resources 폴더가 존재하지 않으니 이 폴더를 만들라고 추천 set이 올라온다.

 

 

난 IntelliJ 2.3 + gradle 6.7.1을 사용했는데

혹시 다른 IDE나 maven을 사용한다면 이대로 나오지 않을 수 있다.

이점을 염두하면서 위의 추천대로 resources 폴더를 만들면 된다.


 

이 뒤는 main 디렉터리와 동일하다.

원하는 이름으로 yaml 파일을 만들고 자신이 원하는 test 설정들을 입력해주면 된다.

 

작성한 test 환경 일부

 

이렇게 test 디렉터리에서 작성한 profile은 

테스트 클래스에서 @ActiveProfiles("프로필 네임")으로 사용할 수 있으며 만약 아무런 설정을 해주지 않으면

main 디렉터리에 작성한 application.yaml을 default설정으로 알아서 잡아서 실행한다.

적용할 profile 설정
설정한대로 active된 profile

 

#  2021. 06. 02추가

1. main - test 디렉토리 간 yaml 연동가능

이것저것 해보다 발견한건데

test 디렉터리에 작성한 profile을 main 디렉터리에 있는 yaml에서도 grouping 하여 사용이 가능하다.

어디다 어떻게 사용하기 위함인지는 아직 잘 모르겠다. 그냥 편리하겠다 정도?

 

main 디렉터리에 있는 yaml 설정파일에 test 설정을 grouping

 

grouping 설정대로 적용된 profiles