본문 바로가기
Spring

Spring Profile과 외부설정 파일, 그리고 단위 테스트

by Ramos 2024. 7. 20.

보통 Spring 외부설정 파일을 하나로 통합하여 파일 내에서 profile 별로 구분짓곤 한다.

필자의 회사에선 local, dev, alpha, beta, staging, real 의 단계로 서비스 개발 및 배포 스테이지를 구분한다.

한 파일로 통합하여 관리하기엔, 가독성이 떨어진단 생각이고 우리 팀 내에서도 스테이지에 따라 application-dev.yml, application-alpha.yml 등과 같은 형식으로 파일을 분리하곤 한다.

 

Unit Test를 위한 환경에 대한 고민이 필요하긴 하다. 특히나 DB의 경우 H2와 같은 인메모리 기반 DB로 테스트를 수행하기 보단 개발 자원에 여유가 충분하다면 Real DB 환경과 동일하게 구성하여 맞추는게 좋다고 생각한다.

 

그렇다고, src/main/resource 하위에 test용 파일을 만들기보단, 아래와 같이 test 경로 상에 추가하는게 어떨까 한다.

몇 가지 테스트를 해보면서 정리를 해보고자 한다.

 

src/main/resource/application.yml이 존재하고, 추가적으로 application.yml 파일이 src/test/resource 하위에 다음과 같이 있을 때, 테스트는 통과한다.

 

단, spring.profiles.active는 deprecated 됐으니 최신 Spring Boot를 사용한다면 spring.config.activate.on-profile을 사용해야 한다.

spring:
  profiles:
    active: test

  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    open-in-view: false
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://{path}
    username: postgres
    password: {password}

 

그렇다면, 같은 조건에서 src/test/resource/application.yml을 아래와 같이 수정한다면 어떤 일이 발생할까?

spring:
  config:
    activate:
      on-profile: test

  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    open-in-view: false
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://{path}
    username: postgres
    password: {password}

 

다음과 같이 test 실행 시 에러가 발생한다.

 

image

 

spring.config.activate.on-profile는 한 propreties나 yml 파일로 설정 데이터를 합체 할 때, local, dev, prod 등의 profile을 구분짓기 위해 사용되므로 위와 같은 조건에선 기대한 대로 datasource가 적절하게 설정되어 테스트 코드가 실행되지 않는다.

 

src/test/resource/application.yml를 제거하고 src/main/resource/application.yml 파일 상에 위 포맷으로 test profile을 지정하는 형태로 설정 데이터를 통합해야 기대한 대로 동작한다.

 

취향 차이겠지만, 개인적으론 main 경로에서 모든 profile을 통합하여 구분짓기엔 가독성이 떨어질 것이라 판단하여 별도로 두는 것을 선호한다. 따라서 src/test/resource/application.yml를 사용하고 해당 파일에선 profile을 구분짓지 않고 오직 test 용도로만 사용할 것이기 때문에 아래와 같이 수정해서 사용하고자 한다.

spring:
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    open-in-view: false
  datasource:
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://{path}
    username: postgres
    password: {password}

 

그 결과 test 환경에선 default profile로만 실행되며 아래와 같이 테스트 코드가 통과한다.

 

image