백엔드

Spring Boot 독립된 test DB 구성 (MySQL, H2)

cottoncover 2023. 9. 15. 20:17
728x90
반응형
SMALL

현재 MySQL을 이용해 프로젝트를 구성하고 있습니다. 또한, 테스트를 계속 진행할 예정이기 때문에 테스트에는 h2 DB를 활용해보려고 시도해보았습니다.

서버 실행할 때와 테스트를 실행할 때 다른 DB 환경에서 구동할 수 있도록 설정하는 과정에 대해 글을 남겨보도록 하겠습니다.

 

 

환경

application.yml

spring:
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
    generate-ddl: true
    hibernate:
      ddl-auto: validate
  datasource:
    url: <jdbc mysql url>
    username: <username>
    password: <password>
server:
  port: 8080

현재 DB로 mysql을 연결해서 사용하고 있는 상태입니다.

이 환경에 테스트를 할 때에는 h2 DB를 활용하도록 변경해보도록 하겠습니다.

 

profile

profile은 활성화됐을 때 컨테이너에 등록된 빈 정의들의 논리적인 묶음입니다. 배포 환경이나 개발 환경에 따라 DataSource가 달라져야 하는데, 이런 환경을 미리 등록해서 쉽게 필요한 설정들을 바꿀 수 있게 해줍니다.

application.yml 파일에서 profile을 구분해서 설정을 할 수 있습니다.

만약, 배포 환경과 테스트 환경을 구분해서 설정해주고 싶다면 한 application.yml안에서 구분선을 통해 각 설정을 분리해주고 spring.config.activate.on-profile에 어떤 profile인지 설정해주면 됩니다.

 

예시)

// 배포 환경
spring:
  config:
    activate:
      on-profile: prod
   ...
   
---

// 테스트 환경
spring:
  config:
    activate:
      on-profile: test
  ...

--- 를 통해 profile마다 구분을 해줄 수 있습니다.

 

그리고 가장 위에 spring.profiles.active 를 통해 서버 구동 시 어떤 profile을 active해서 사용할 것인지 지정해 줄 수 있습니다.

spring:
  profiles:
    active: prod

이와 같이 설정되어 있다면 prod profile을 사용하겠다는 뜻입니다.

 

 

profile을 통해 mysql을 활용하는 local 환경과 h2 DB를 활용하는 test 환경을 구분해주었습니다.

spring:
  profiles:
    active: local

---

spring:
  config:
    activate:
      on-profile: local
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
    generate-ddl: true
    hibernate:
      ddl-auto: validate
  datasource:
    url: <jdbc mysql url>
    username: <username>
    password: <password>
server:
  port: 8080

---

spring:
  config:
    activate:
      on-profile: test
  h2:
    console:
      enabled: true
  jpa:
    show-sql: true
    generate-ddl: true
    hibernate:
      ddl-auto: create-drop
    properties:
      hibernate:
        format_sql: true
        dialect: org.hibernate.dialect.H2Dialect
        globally_quoted_identifiers: true
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb;MODE=MySQL;DATABASE_TO_UPPER=false
    username: hbs
    password:

H2 SQL 문법을 MySQL 문법으로 변경해서 사용하기 위해 MODE=MySQL을 추가해주었습니다.

 

 

@ActiveProfiles

테스트의 ApplicationContext에게 어떤 프로필을 사용할 것인지 정해주는 어노테이션입니다.

 

H2Test

@SpringBootTest
@ActiveProfiles("test")
public class H2Test{}

test profile을 사용하는 테스트 클래스를 선언해줍니다. H2Test 클래스는 테스트 시 H2 DB를 활용하도록 되어있습니다. 다른 테스트 클래스에서 이를 상속 받아 사용하면 H2 DB를 활용한 테스트 환경을 조성할 수 있습니다.

public class userRepositoryTest extends H2Test{
    @Test
    void test(){
        ...
    }
}

 

+ @Profile

프로필을 구분해서 해당 프로필일 경우 빈을 로드할 수 있도록 해줍니다.

@Profile("prod")
@Configuration
public class TestConfiguration{
    @Bean
    public String hello(){
        return "this is prod profile";
    }
}

위의 hello는 prod 환경에서만 빈으로 등록이 됩니다.

 

 

+ 파일 이름으로 profile 구분

application-{profile명}.yml 파일 이름에 profile 명을 붙여서 profile을 구분할 수 있습니다.

application.yml 상에서 서버 구동 시 활용할 profile 환경에 대한 정의를 해주고 각 application-{profile명}.yml마다 환경에 대한 설정을 해주면 됩니다.

파일명으로 profile 구분
파일명으로 profile 구분

 

 

 

오늘은 독립적인 H2 DB 테스트 환경을 구축했습니다. 위와 같이 local과 test환경을 구분했을 경우 다음과 같은 장점과 단점이 있을 수 있습니다.

 

장점

- 외부의 영향이 없는 독립적인 테스트 환경을 만들 수 있습니다.

- 테스트 데이터의 구성을 마음대로 할 수 있습니다.

- 테스트 수행 후 롤백에 대한 부담이 없습니다.

- 임베디드 DB의 활용으로 빠르게 실행 가능합니다.

 

단점

- 항상 스키마를 초기화해서 사용해야 합니다.

- 실제 쿼리 수행이 정확하지 않을 수 있습니다. (MySQL -> h2)

 

단점이 존재하는 환경이긴 하지만, 외부 DB와의 연결 문제가 없고 테스트 데이터를 구성하기 간편하도록 테스트 환경을 만들었다는 것에 만족할 수 있었던 것 같습니다.

 

 

 

출처 : https://taes-k.github.io/2021/04/05/spring-test-isolation-datasource/

 

Spring H2를 이용한 독립 테스트환경 구축

독립된 테스트 전용 DB 구성의 필요성 통합테스트 혹은 DB 데이터를 사용하는 테스트를 수행할때, 개발환경 전용 DB를 사용한다 하더라도 아래와 같은 문제가 발생 할 수 있습니다. 여러 개발자들

taes-k.github.io

 

반응형
LIST