본문 바로가기
📕 Spring Framework/Spring 개념 정리

[@DataJpaTest] h2 인메모리 db를 이용한 테스트 설정 방법

by GroovyArea 2022. 12. 21.

서론

테스트 코드를 작성하는 것은 매우 중요하다고 익히 들었고, 필수적인 영역이기 때문에 이에 항상 만전을 기하고 있다.

 

모든 케이스를 테스트할 이유는 없기 때문에, 

크게 경우를 나누어 필요하다고 생각하는 부분만 시나리오, 통합, 단위 테스트를 나누어 진행하는 것이 효율적이라고 들었다.

 

배포를 계속 해오면서 jar 파일을 빌드하는 도중 테스트를 제외하는 것은 무의미하다고 판단했기 때문에, 모든 테스트를 어떤 환경에서든 돌아 갈 수 있게 고민을 했던 기억이 있다.

이렇게 하나하나 완성도 있게 쌓아나가는 공부를 하는 것이 속도는 느리지만, 유의미한 발전 과정이라 느낀다.

 

이번에 대규모 리팩토링을 실시하면서 코드 수정 및 구조가 크게 개편되었고, 테스트 코드도 변경 사항이 많이 생겨서 다 수정했다.

 

persistence 계층 테스트는 동적 쿼리 부분만 테스트를 하는 것이 유의미하다고 생각했기에, 수정한 코드를 실행했는데 전과 달리 계속 실패했다. 

 

if you want an embedded database please put a supported one on the classpath or tune the replace attribute of @autoconfiguretestdatabase.

 

원인은 테스트 환경에서 인메모리 db에 커넥션을 연결하려는데 설정 정보가 없어서 실패한다는 아주 간단한 에러메시지이다.

이번에는 인메모리 db를 이용해서 실제 db로 테스트가 아닌 환경에 구애 받지 않는 환경을 만드는 것에 초점을 맞추는 과정 중 문제에 봉착한 것이다.

 

인터넷을 검색해보니까 다 실제 db로 변경해서 테스트 하는 방법 밖에 없었기에, 내가 직접 인메모리 h2 db 설정을 하는 방법을 포스팅해보겠다.

 

 

설정 방법

 

1. Gradle 기준 Test 환경 db 빌드

implementation 'mysql:mysql-connector-java'
testImplementation 'com.h2database:h2'

나 같은 경우는 실제 DB는 Mysql

테스트 환경에서는 인메모리 DB 인 h2를 사용

 

 

2. test 소스 폴더에 database configuration 

테스트 환경에서 Database Configuration 이 필요하다.

test 폴더 내에 yaml 파일을 하나 생성해서 알맞은 datasource를 설정해야 한다.

이렇게 Test 폴더 내에 별도의 yaml 파일을 생성한다.

이렇게 하면 테스트를 실행할 때 Main Resource 내의 yaml 대신 Test Resource의 yaml 이 우선순위를 가진다.

 

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password:
    driver-class-name: org.h2.Driver

  h2:
    console:
      enabled: true
      path: /h2

  jpa:
    hibernate:
      ddl-auto: create-drop
    properties:
      hibernate:
        default_batch_fetch_size: 1000
        format_sql: true
    defer-datasource-initialization: true
    database-platform: org.hibernate.dialect.H2Dialect
    show-sql: true
    generate-ddl: true

logging:
  level:
    org.hibernate.SQL: debug

각자 기호에 맞게 설정을 빼거나 변경해도 될 것 같다.

H2 DB 기준.

 

테스트 실행

@DataJpaTest
@Import(QuerydslConfig.class)
class UserCustomQueryRepositoryImplTest {

@DataJpaTest 애노테이션을 붙이면 기본적으로 내장 DB를 Datasource로 취급하여 커넥션을 얻는다.

 

정상적으로 test용 h2 DB와 connection을 얻은 모습
테스트가 정상적으로 성공했다.

 

반응형