글 작성자: beaniejoy

직전 글에서 단위, 통합테스트 한꺼번에 진행을 위한 구성에 대해서 다루었습니다. 글 작성하고 더 알아보니 잘못된 내용들이 조금 있었더라구요. 이번 글에서는 저번 글에서의 잘못된 내용을 수정하면서 Test 환경과 Dev 환경 분리에 대해서 한 번 정리해보려 합니다.

 

📌 테스트, 개발 환경 분리를 위한 DB 구성

dependencies {
    //...

    runtimeOnly 'mysql:mysql-connector-java'
    runtimeOnly 'com.h2database:h2'

    //...    
}

저는 테스트 환경과 개발 환경 분리를 위한 구성을 해보고자 각각의 환경에서 사용되는 DB를 다르게 설정하였습니다. 저번 글에서는 테스트, 개발 환경 모두 embedded DB(h2)를 사용하다 보니 혼용되어 사용되거나 의도치 않게 다른 환경의 DB 설정을 사용하는 경우가 있었습니다.

이번에는 극명하게 서로 다른 종류의 DB를 사용해서 테스트와 개발 환경 각각 달리 설정된 DB 정보를 잘 사용하는지 보려고 합니다.

spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: jdbc:mysql://localhost/test?autoreconnect=true&characterEncoding=utf8&serverTimezone=Asia/Seoul
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: test
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    defer-datasource-initialization: true
  sql:
    init:
      mode: never
---

spring:
  config:
    activate:
      on-profile: test
  datasource:
    url: jdbc:h2:mem:testdb;MODE=MySQL
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    defer-datasource-initialization: true
  • profile 설정
    Spring 2.4 버전 이후 spring.profiles가 deprecated 되고 spring.config.activate.on-profile로 변경
  • dev profile
    DB로 MySQL을 사용하였습니다. profile dev로 application 실행하기 전에 MySQL DB서버가 활성화된 상태여야 합니다.
  • test profile
    DB로 embedded in-memory db(h2)를 사용하였습니다. 여기서 MySQL문법으로 사용할 것이기에 MODE=MySQL 있어야 합니다.
  • ddl-auto
    기본적으로 둘다 update로 하였습니다. 이는 테스트, 개발 환경에서나 국한된 내용이고 운영 환경에서는 절대 ddl-auto를 create, create-drop, update 같은 설정을 하면 안됩니다.
  • defer-datasource-initialization
    *data.sql를 가지고 스크립트 기반으로 datasource를 초기화할 때 *true
    로 설정하면 됩니다.
  • sql.init.mode
    기본적으로 DB initialization은 embedded db를 사용할 때만 수행합니다. 여기에 always를 설정하면 DB 타입에 관계없이 DB 초기화를 진행합니다. always, embedded(기본값), never 세 종류 설정이 있는데 처음엔 always로 어플리케이션 실행해서 data.sql 기반의 insert 쿼리 실행 후 never로 설정했습니다. 이러면 어플리케이션을 재실행했을 때 데이터 중복 이슈가 발생하지 않습니다.

 

📌 테스트 코드 구성

@SpringBootTest
@ActiveProfiles("test")
class CafeServiceTest {
    //...
}

저번 글에서도 나왔던 테스트 코드 예시입니다.

@ActiveProfiles("test")를 설정하게 되면 default profile에서 test profile를 사용하게 됩니다. 위에 test profile로 설정한 in-memory h2 db를 사용해서 통합테스트를 진행하게 됩니다.

 

모든 테스트가 통과된 것을 확인할 수 있습니다.