[java] TestContainers를 사용하여 12-factor 애플리케이션 테스트하기

12-factor 애플리케이션은 클라우드 환경에서의 원활한 배포와 확장을 지원하기 위한 지침을 제공합니다. 이러한 애플리케이션을 개발하고 테스트하는 과정에서 데이터베이스나 다른 외부 서비스에 대한 의존성을 관리하는 것이 중요합니다.

TestContainers는 도커 컨테이너를 사용하여 테스트 시에 다양한 종류의 외부 서비스를 구동할 수 있는 도구입니다. 이를 사용하여 12-factor 애플리케이션의 테스트를 보다 쉽게 작성할 수 있습니다.

TestContainers란?

TestContainers는 자바용 테스트 프레임워크로, 테스트 중에 도커 컨테이너를 시작하여 외부 서비스를 실행하고 테스트에서 사용할 수 있습니다. 데이터베이스, 메시지 브로커, 웹 서버 등 다양한 종류의 서비스에 대한 컨테이너를 시작할 수 있으며, 테스트가 끝난 뒤에는 자동으로 해당 컨테이너를 종료합니다.

TestContainers를 사용한 12-factor 애플리케이션 테스트

  1. TestContainers를 프로젝트에 추가합니다. Maven을 사용하는 경우 pom.xml에 다음 의존성을 추가합니다.
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers</artifactId>
    <version>1.15.1</version>
    <scope>test</scope>
</dependency>
  1. 테스트 클래스에서 @Rule 어노테이션과 GenericContainer 클래스를 사용하여 도커 컨테이너를 정의합니다. 예를 들어, 데이터베이스 서비스에 대한 테스트를 작성한다면 다음과 같이 할 수 있습니다.
import org.junit.Rule;
import org.junit.Test;
import org.testcontainers.containers.GenericContainer;

public class DatabaseIntegrationTest {

    @Rule
    public GenericContainer databaseContainer = new GenericContainer("postgres:13.1")
        .withExposedPorts(5432)
        .withEnv("POSTGRES_USER", "test")
        .withEnv("POSTGRES_PASSWORD", "password");

    @Test
    public void testDatabaseConnection() {
        // 테스트 코드 작성
        String ipAddress = databaseContainer.getContainerIpAddress();
        Integer port = databaseContainer.getMappedPort(5432);
        // 데이터베이스 연결 및 테스트 수행
    }

}
  1. 테스트 코드에서 컨테이너의 IP 주소와 포트를 사용하여 외부 서비스에 연결하고 필요한 테스트를 구현합니다. 테스트가 종료되면 TestContainers가 컨테이너를 자동으로 종료합니다.

결론

TestContainers를 사용하면 12-factor 애플리케이션을 개발하고 테스트하는 과정에서 외부 서비스에 대한 의존성을 쉽게 관리할 수 있습니다. 도커 컨테이너를 사용하여 필요한 서비스를 시작하고 테스트 코드에서 이를 활용할 수 있습니다. 이를 통해 더욱 확장 가능하고 격리된 테스트 환경을 구축할 수 있습니다.

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