[java] TestContainers를 사용하여 SQL 쿼리 테스트하기

TestContainers는 자바 개발자들이 로컬 환경에서 SQL 쿼리를 테스트 할 수 있도록 도와주는 도구입니다. 이 글에서는 TestContainers를 사용하여 SQL 쿼리 테스트를 수행하는 방법에 대해 알아보겠습니다.

1. TestContainers 설치

먼저, TestContainers를 사용하기 위해 Maven 또는 Gradle 프로젝트에 다음 의존성을 추가해야 합니다.

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

// Gradle
testImplementation 'org.testcontainers:testcontainers:1.15.3'

2. 테스트 클래스 작성

다음으로, 테스트 클래스를 작성해보겠습니다. 이 테스트 클래스에서는 TestContainers를 사용하여 임시로 MySQL 컨테이너를 실행하고, 해당 컨테이너에 연결하여 SQL 쿼리를 실행하는 예제를 보여줍니다.

import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
import org.testcontainers.containers.MySQLContainer;
import org.testcontainers.containers.wait.strategy.Wait;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class SQLQueryTest {

    @ClassRule
    public static MySQLContainer<?> mySQLContainer = new MySQLContainer<>("mysql:latest")
            .withUsername("test")
            .withPassword("test")
            .withDatabaseName("testdb")
            .waitingFor(Wait.forListeningPort());

    @Before
    public void setUp() throws Exception {
        // MySQL 컨테이너가 실행되면 해당 컨테이너에 연결하여 필요한 스키마 및 데이터를 초기화할 수 있습니다.
        String jdbcUrl = mySQLContainer.getJdbcUrl();
        Connection connection = DriverManager.getConnection(jdbcUrl, mySQLContainer.getUsername(),
                mySQLContainer.getPassword());
        Statement statement = connection.createStatement();
        
        // 스키마 및 데이터 초기화 작업 수행
        
        statement.close();
        connection.close();
    }

    @Test
    public void testSQLQuery() throws Exception {
        // MySQL 컨테이너에 연결하여 SQL 쿼리를 실행하는 테스트 코드 작성
        String jdbcUrl = mySQLContainer.getJdbcUrl();
        Connection connection = DriverManager.getConnection(jdbcUrl, mySQLContainer.getUsername(),
                mySQLContainer.getPassword());
        Statement statement = connection.createStatement();
        
        // SQL 쿼리 실행 및 결과 검증 작업 수행

        statement.close();
        connection.close();
    }
}

위의 예제에서는 MySQL을 사용하였지만, 다른 데이터베이스도 동일한 방식으로 사용할 수 있습니다.

3. 테스트 실행

테스트 클래스를 실행하면 TestContainers가 MySQL 컨테이너를 자동으로 생성하고 초기화 작업을 수행한 후에 SQL 쿼리를 실행하게 됩니다. 이렇게 생성된 임시 컨테이너는 테스트가 완료되면 자동으로 종료되고 삭제됩니다.

테스트 실행 후에는 로컬 환경에서 SQL 쿼리가 올바르게 동작하는지 확인할 수 있습니다.

결론

TestContainers를 사용하면 로컬 개발 환경에서 SQL 쿼리를 테스트하는 과정을 편리하게 수행할 수 있습니다. 이 도구를 활용하여 테스트 코드를 작성하면, 데이터베이스와의 상호작용에 대한 안정성을 확보할 수 있고, 버그를 신속하게 발견하고 수정할 수 있습니다.

더 자세한 내용은 TestContainers 공식 문서를 참고하시기 바랍니다.