[java] TestContainers를 사용하여 AWS S3 테스트하기

이번에는 TestContainers를 사용하여 AWS S3를 테스트하는 방법에 대해 알아보겠습니다. TestContainers는 테스트 코드에서 컨테이너 환경을 구축하는 데 사용되는 도구로, AWS S3 역시 포함되어 있습니다. 이를 활용하여 테스트 환경에서도 실제 AWS S3를 사용하는 것처럼 테스트할 수 있습니다.

1. 의존성 추가

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

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

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

testImplementation 'org.testcontainers:testcontainers:1.14.3'

2. AWS S3 테스트 코드 작성

이제 아래와 같이 AWS S3 테스트 코드를 작성합니다:

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.testcontainers.containers.GenericContainer;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.Bucket;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class S3Test {

    private static final int S3_PORT = 4572;
    private static final String BUCKET_NAME = "test-bucket";

    private static GenericContainer<?> s3Container;
    private static S3Client s3Client;

    @BeforeAll
    public static void setUp() {
        s3Container = new GenericContainer<>("adobe/s3mock")
                .withExposedPorts(S3_PORT);
        s3Container.start();

        String endpoint = String.format("http://%s:%d", s3Container.getContainerIpAddress(), s3Container.getMappedPort(S3_PORT));

        s3Client = S3Client.builder()
                .endpointOverride(endpoint)
                .region(Region.US_WEST_2)
                .credentialsProvider(() -> AwsBasicCredentials.create("accessKey", "secretKey"))
                .build();
    }

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

    @Test
    public void testCreateBucket() {
        s3Client.createBucket(builder -> builder.bucket(BUCKET_NAME));
        Bucket bucket = s3Client.listBuckets().buckets().get(0);
        assertEquals(BUCKET_NAME, bucket.name());
    }
}

위의 코드는 adobe/s3mock 이미지를 사용하여 S3의 로컬 모의 개발 환경을 구축합니다. 테스트 실행 시, S3 컨테이너가 시작되고 테스트가 수행됩니다. testCreateBucket 메소드에서는 버킷을 생성하고 생성된 버킷을 확인합니다.

3. 테스트 실행

이제 테스트를 실행해보겠습니다. IDE에서 테스트 클래스(S3Test)를 실행하거나, 터미널에서 다음과 같은 명령어를 실행합니다:

mvn test

혹은

gradle test

테스트가 실행되면서, S3 컨테이너가 시작되고 S3 작업이 수행됩니다. 테스트 결과를 확인하여 예상한대로 동작하는지 확인할 수 있습니다.

4. 결론

TestContainers를 사용하여 AWS S3를 테스트하는 방법에 대해 알아보았습니다. TestContainers를 사용하면 테스트 환경에서도 실제 AWS S3와 같은 환경을 구성하여 테스트할 수 있습니다. 이를 통해 테스트의 정확성과 신뢰성을 높일 수 있습니다.