[java] TestContainers로 컨테이너 간 의존성 관리하기

프로젝트를 개발하다보면 종종 테스트에 필요한 외부 리소스나 서비스에 의존하는 경우가 있습니다. 이러한 의존성을 관리하고 테스트 환경을 쉽게 구성할 수 있는 도구로 TestContainers를 사용할 수 있습니다.

TestContainers란?

TestContainers는 테스트에 필요한 외부 리소스나 서비스를 다루기 위한 자바 라이브러리입니다. 이 라이브러리를 사용하면 테스트 코드에서 컨테이너를 쉽게 생성하고 관리할 수 있습니다.

컨테이너 간 의존성 관리하기

TestContainers를 사용하면 여러 개의 컨테이너를 동시에 실행하고 각 컨테이너 간의 의존성을 관리할 수 있습니다. 예를 들어, 데이터베이스와 웹서버를 사용하는 테스트를 작성할 때, 데이터베이스 컨테이너와 웹서버 컨테이너를 각각 생성하고 서로의 의존성을 설정할 수 있습니다.

아래는 TestContainers를 사용하여 데이터베이스와 웹서버 컨테이너를 생성하고 의존성을 설정하는 예시 코드입니다.

import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.utility.DockerImageName;

public class MyTest {

    private static final PostgreSQLContainer<?> postgresContainer = new PostgreSQLContainer<>(DockerImageName.parse("postgres:latest"))
            .withDatabaseName("test")
            .withUsername("test")
            .withPassword("test")
            .waitingFor(Wait.forLogMessage(".*database system is ready to accept connections.*\\n", 2));

    private static final GenericContainer<?> webServerContainer = new GenericContainer<>(DockerImageName.parse("nginx:latest"))
            .dependsOn(postgresContainer)
            .withExposedPorts(80);

    @BeforeAll
    public static void setUp() {
        postgresContainer.start();
        webServerContainer.start();
    }

    @AfterAll
    public static void tearDown() {
        webServerContainer.stop();
        postgresContainer.stop();
    }

    @Test
    public void test() {
        // 테스트 로직 작성
    }
}

위 코드에서 PostgreSQLContainer는 데이터베이스를 위한 컨테이너를 생성하고 GenericContainer는 웹서버를 위한 컨테이너를 생성합니다. 데이터베이스 컨테이너는 웹서버 컨테이너에 의존하도록 설정됩니다.

@BeforeAll 어노테이션을 사용하여 테스트 실행 전에 컨테이너를 시작하고, @AfterAll 어노테이션을 사용하여 테스트 실행 후에 컨테이너를 정리합니다. 테스트 메소드에서는 컨테이너를 사용하여 필요한 테스트 로직을 작성할 수 있습니다.

결론

TestContainers는 테스트에 필요한 외부 리소스나 서비스에 쉽게 접근하고 의존성을 관리할 수 있는 강력한 도구입니다. 이를 통해 테스트 코드를 보다 신뢰성있고 효율적으로 작성할 수 있습니다.

더 자세한 내용은 TestContainers 공식 홈페이지를 참고하시기 바랍니다.