티스토리 뷰

 Unit Test를 진행하다 보면 다양한 문제에 봉착하게 되는데 가장 해결하기 힘든 문제 중 하나가 외부 DB와의 연결이 아닌가 싶습니다. 우리는 CI를 통해 배포를 수행하며 자동 테스트를 하는데 외부 DB와 연결하는데 애로사항이 생기기 마련이기 때문입니다. 

 

 개발 DB나 운영 DB나 마찬가지로 우리는 보안상 문제로 외부에서 접속을 못하도록 내부망에서만 접속이 가능하게 설정합니다. 이때 문제는 빌드를 수행할 환경이 내부망에 없다면 우리는 자동 테스트 과정에서 DB접속 문제를 해결해야 합니다.

 

 이때 우리는 Mocking을 이용해 Repository를 새로 주입하는 등 여러 대안을 사용하지만 Entity가 많아 지고 데이터가 쌓이다 보면 극악의 생산성을 보여주기 시작합니다. 그래서 이런 문제를 해결하기 위해 DB자체를 Mocking할 필요가 있습니다.

 

 H2 DB를 이용하면 해당 문제를 해결할 수 있습니다. h2 DB는 Embeded DB로 스프링 컨테이너가 올라가면서 함께 실행되고 2mb라는 작은 용량으로 가볍게 테스트하기 편리합니다. 복잡한 Mocking없이 서비스 / 레포지토리 레이어를 테스트 할 수 있으며 Mocking으로 인한 부분적 오류와 가짜성공(실 서비스에서는 오류가 발생하나 Mocking에 의해 성공으로 표기)을 사전에 방지할 수 있습니다.

 

기존 Database대신 H2DB에 연결

 이런 방법이 가능한 이유는 H2 DB가 다양한 DB와 상호호환하기 때문입니다. 각 DB는 방언이 있는데 H2는 대부분의 방언을 허용합니다. 때문에 JPA를 사용하더라도 별도의 설정없이 DB Url을 변경해주는 것 만으로 사용이 가능합니다. 그럼 세팅 방법을 보러가볼까요?

 

1. gradle 세팅

    testImplementation 'com.h2database:h2:2.1.214'

testImplementation으로 종속성을 추가해줍니다. 이는 테스트 환경에서만 해당 종속성을 이용하기 위해서입니다. 개발 중 또는 운영 중에 포함되지 않게할 수 있습니다.

 

2. application 세팅

  jpa:
    database-platform: org.hibernate.dialect.MySQL5Dialect
    database: h2
    show-sql: true
    open-in-view: false
    properties:
      hibernate:
        show_sql: true
        format_sql: true
    generate-ddl: true
    hibernate:
      ddl-auto: update
      
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb;MODE=MySQL;
    username: SA
    password:

 제가 설정한 application 세팅입니다. jpa의 방언은 기존 서비스에 사용하는 방언을 그래로 사용합니다. ddl-auto를 이용해 테스트 실행과 함께 DB 테이블을 생성할 수 있도록 도와줍니다.

 datasource는 h2를 사용하고 username은 위와 같이 맞춰야 별도의 세팅없이 이용 가능합니다.

 

  @Test
  void registerMobile() {
    RegisterMobileDto mobileDto = new RegisterMobileDto();
    mobileDto.setIdfAccount(1L);
    mobileDto.setMobile("01033245654");
    authService.registerMobile(mobileDto);

    Account account = accountRepo.findById(1L).orElse(null);
    assertThat(account).isNotNull();
    assertThat(account.getMobile()).isEqualTo("01033245654");
  }

 간단하게 전화번호 변경해주는 service를 테스트하는 코드입니다. 불필요한 mocking으로 인해 데이터의 정합성을 의심할 필요도 없고 추가적인 코드를 작성할 필요도 없어집니다. DB통신으로 인해 발생될 Service의 로직실패를 함께 확인하고 데이터 조합등 여러 상황을 테스트 할 수 있습니다.

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함