ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot 독립된 test DB 구성 (MySQL, H2)
    백엔드 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

    '백엔드' 카테고리의 다른 글

    Gradle이란?  (0) 2023.09.21
    Spring swagger 적용 방법 (springdoc-openapi)  (0) 2023.09.18
    Rest Template으로 Server(Client) to Server 통신하기  (0) 2023.09.15
    Spring filter, interceptor  (0) 2023.09.14
    Spring Validation  (0) 2023.09.13

    댓글

Designed by Tistory.