✅Repository의 테스트 환경에 대한 단위테스트 전략
2025. 7. 3. 09:41

1. @DataJpaTest를 활용하여  Repository의 테스트코드 작성하기

  • JPA 관련 bean만 로딩하여 Repository, EntityManager, JPA 관련 설정만 테스트하는데 사용됩니다.
  • 해당 어노테이션을 사용하면, Spring Boot가 자동으로 H2같은 임베디드 DB를 사용하여 빠르게 테스트 환경을 구성합니다.
  • @Transactional이 기본으로 적용되어, 테스트가 끝나면 롤백되어 DB에 영향이 없습니다.
  • 전체 애플리케이션 컨텍스트보다 빠르고 가볍게 실행됩니다.

이러한 이유로 Repository를 단위테스트 하기 위하여 @DataJpaTest를 사용하였습니다.

2. 테스트 환경용으로 H2 DB를 사용할지, Test container를 사용할지

현재 프로젝트는 도커 컨테이너에 MYSQL을 띄워서 사용하여 운용되고 있습니다.

테스트 DB환경을 구축해주기 위하여

H2 인메모리 DB를 사용하거나, DOCKER에 MYSQL을 띄워서 TEST CONTAINER를 사용하는 방법이 있습니다.

1️⃣ H2 인메모리 DB를 통하여 DB 환경을 구축하는 경우

@DataJpaTest
@ActiveProfiles("test") // 테스트 환경용 H2 DB 사용
class PaymentCancelHistoryRepositoryTest {
spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password:
  jpa:
    hibernate:
      ddl-auto: create-drop
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect

이와 같이 `application-test.yml` 파일에 H2 DB에 대한 설정을 합니다.

H2 인메모리 DB를 사용하여 DB 환경을 구축하면, 어떤 상황에서도 테스트 코드가 성공할 수 있습니다.

또한 단위테스트의 목적에 맞게 빠르게 진행됩니다.

MYSQL과 구문이 살짝 다르나, 미국 국제 표준 ANSI를 따르면 어떤 DB에서도 오류가 나지 않습니다. 

2️⃣ DOCKER에 MYSQL를 띄워서 TEST CONTAINER를 사용하는 경우

dependencies {
	testImplementation "org.testcontainers:junit-jupiter"
	testImplementation "org.testcontainers:mysql"
}
@DataJpaTest
@Testcontainers
@ActiveProfiles("test")
class PaymentCancelHistoryRepositoryTest {

    @Container
    private static MySQLContainer<?> mysql = new MySQLContainer<>("mysql:8.0")
        .withDatabaseName("testdb")
        .withUsername("testuser")
        .withPassword("testpass");

    @DynamicPropertySource
    static void overrideProps(DynamicPropertyRegistry registry) {
        registry.add("spring.datasource.url", mysql::getJdbcUrl);
        registry.add("spring.datasource.username", mysql::getUsername);
        registry.add("spring.datasource.password", mysql::getPassword);
        registry.add("spring.datasource.driver-class-name", mysql::getDriverClassName);
    }

테스트 클래스에 Test Container에 대해 설정을 하면, 운영 DB와 동일한 환경에서 테스트가 진행됩니다.

다만 이 방법은 H2에 비해 느리고, Docker가 설치되어야 한다는 단점이 있습니다.

3️⃣ 테스트환경에서 어떤 DB를 사용할지 유동적으로 판단하기

빠르게 테스트를 진행하는게 중요할 때는 H2 DB를,

시스템 안정성과 정확성이 중요할 때는 운영 DB와 완전히 동일하게 돌아가는 Testcontainers를 사용해야 한다고 판단했습니다.

현재 우리 프로젝트는 B2B 서비스로 실사용 될 것을 목적으로 하고 있으며, 결제 서비스를 포함하고 있기 때문에 안정성에 초점을 맞추고자 Docker의 Testcontainers를 사용하기로 하였습니다.

하지만 이후에 실운영 중에 빠른 테스트가 필요한 경우, H2 DB로 전환하여 테스트를 진행할 수도 있다고 유연하게 생각하고 있습니다.

LIST