1. 글을 작성하게 된 계기
AWS SNS/SQS 를 사용하며 테스트 코드를 어떻게 작성하는지에 대해 기록하기 위해 글을 작성하게 되었습니다.
2. LocalStack 의존성 및 도커 설정 추가
먼저 의존성을 추가해줍니다.
1
2
testImplementation("org.testcontainers:junit-jupiter:1.19.3")
testImplementation("org.testcontainers:localstack:1.15.3")
이후 도커 컴포즈에 AWS SNS/SQS에 대한 설정을 추가합니다. 포트는 기본 4566으로, 자신이 원하는 번호를 넣어도 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: "3.7"
services:
localstack:
image: localstack/localstack
ports:
- "4566:4566"
environment:
- SERVICES=sns,sqs
- AWS_DEFAULT_REGION=ap-northeast-2
initializer:
image: amazon/aws-cli
depends_on:
- localstack
environment:
- AWS_DEFAULT_REGION=ap-northeast-2
- AWS_ACCESS_KEY_ID=test
- AWS_SECRET_ACCESS_KEY=test
command: >
/bin/sh -c "
while ! nc -z localstack 4566; do
sleep 1;
done;
echo LocalStack started;
aws --endpoint-url=http://localstack:4566 sns create-topic --name ${EVENT_DIVIDER_TOPIC};
aws --endpoint-url=http://localstack:4566 sns create-topic --name ${USER_SEARCH_EVENT_TOPIC};
aws --endpoint-url=http://localstack:4566 sqs create-queue --queue-name ${EVENT_DIVIDER_QUEUE};
aws --endpoint-url=http://localstack:4566 sqs create-queue --queue-name ${USER_SEARCH_EVENT_QUEUE};
"
이때, Topic과 Queue를 생성해야 하는데, 이는 다음과 같이 설정할 수 있습니다.
1
2
3
4
aws --endpoint-url=http://localstack:4566 sns create-topic --name ${EVENT_DIVIDER_TOPIC};
aws --endpoint-url=http://localstack:4566 sns create-topic --name ${USER_SEARCH_EVENT_TOPIC};
aws --endpoint-url=http://localstack:4566 sqs create-queue --queue-name ${EVENT_DIVIDER_QUEUE};
aws --endpoint-url=http://localstack:4566 sqs create-queue --queue-name ${USER_SEARCH_EVENT_QUEUE};
.env 파일에 각 값들을 관리하면 한 곳에서 편하게 이를 컨트롤할 수 있습니다.
이후 테스트를 진행하면 다음과 같이 컨테이너가 메시지를 수신을 하는 것을 볼 수 있습니다.
1
2
3
4
5
6
localstack-1 INFO --- AWS sqs.CreateQueue => 200
localstack-1 INFO --- AWS sqs.CreateQueue => 200
localstack-1 INFO --- AWS sqs.ReceiveMessage => 200
localstack-1 INFO --- AWS sqs.ReceiveMessage => 200
localstack-1 INFO --- AWS sqs.ReceiveMessage => 200
localstack-1 INFO --- AWS sqs.ReceiveMessage => 200
3. 정리
LocalStack를 활용해 SNS/SQS 테스트를 어떻게 하는지에 대해 살펴보았습니다. 외부 의존성이 들어가면 테스트 및 빌드가 정말 까다로워지는데요, LocalStack을 통해 이런 의존성 문제를 해결해줍시다.