[java] TestContainers로 데이터베이스 컨테이너를 시작하는 방법

TestContainers는 자바 애플리케이션의 통합 테스트를 위해 도커 컨테이너를 사용하는 라이브러리입니다. 이를 사용하여 테스트 시에 데이터베이스 컨테이너를 시작하고 사용할 수 있습니다. 이 방법을 통해 실제 데이터베이스 서버를 사용하지 않고도 통합 테스트를 수행할 수 있습니다.

1. 의존성 추가

먼저, 프로젝트의 의존성에 TestContainers를 추가해야 합니다. Maven을 사용하는 경우 pom.xml 파일에 다음과 같이 의존성을 추가합니다.

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers</artifactId>
    <version>1.15.3</version>
    <scope>test</scope>
</dependency>

Gradle을 사용하는 경우 build.gradle 파일에 다음과 같이 의존성을 추가합니다.

testImplementation 'org.testcontainers:testcontainers:1.15.3'

2. 데이터베이스 컨테이너 시작

TestContainers를 사용하여 데이터베이스 컨테이너를 시작하기 위해 다음과 같은 단계를 따릅니다.

2.1. 컨테이너 설정

먼저, 사용할 데이터베이스에 맞는 TestContainer를 선택하고 설정해야 합니다. 예를 들어, MySQL 데이터베이스를 사용한다면 다음과 같이 설정할 수 있습니다.

import org.testcontainers.containers.MySQLContainer;

public class MyTestClass {

    private static final MySQLContainer mysqlContainer = new MySQLContainer()
                .withUsername("test")
                .withPassword("test")
                .withDatabaseName("test");

    // ...
}

위의 예시에서는 MySQL 데이터베이스 컨테이너를 생성하고 test라는 사용자명과 비밀번호, 그리고 test라는 데이터베이스를 설정하였습니다. 실제 사용하는 데이터베이스에 맞게 설정해주어야 합니다.

2.2. 컨테이너 실행

테스트 클래스의 @BeforeAll 또는 @Before 어노테이션을 사용하여 데이터베이스 컨테이너를 시작할 수 있습니다. 다음은 예시입니다.

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
public class MyTestClass {

    @Container
    private static final MySQLContainer mysqlContainer = new MySQLContainer()
                .withUsername("test")
                .withPassword("test")
                .withDatabaseName("test");

    @BeforeAll
    public static void setup() {
        mysqlContainer.start();
    }

    @Test
    public void myTest() {
        // 테스트 코드 작성
    }
}

setup() 메서드에서 mysqlContainer.start()를 호출하여 데이터베이스 컨테이너를 시작합니다.

2.3. 컨테이너 종료

테스트가 끝나면 데이터베이스 컨테이너를 종료해야 합니다. @AfterAll 또는 @After 어노테이션을 사용하여 컨테이너를 종료하는 메서드를 작성합니다.

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
public class MyTestClass {

    @Container
    private static final MySQLContainer mysqlContainer = new MySQLContainer()
                .withUsername("test")
                .withPassword("test")
                .withDatabaseName("test");

    // ...

    @AfterAll
    public static void teardown() {
        mysqlContainer.stop();
    }
}

teardown() 메서드에서 mysqlContainer.stop()을 호출하여 데이터베이스 컨테이너를 종료합니다.

참고 자료