Simple Queue Service 소개 및 사용법(2/3)
앞서 AWS Simple Queue Service(SQS)에 대해 알아보았다.
이제 Spring Boot에 적용해보겠다.
IAM 권한 추가
AWS 콘솔에 로그인 후 IAM 서비스로 이동한다.
생성된 사용자가 없다면 생성 후 AmazonSQSFullAccess 권한을 추가한다.
해당 사용자의 access key와 secret key를 코드상에 적용해야 하므로 복사해둔다.
SQS 대기열 생성
AWS 콘설에서 SQS로 이동해 대기열을 생성해보자.
대기열 구성은 전 글을 참고 바란다.
build.gradle
plugins {
id 'org.springframework.boot' version '2.3.3.RELEASE'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
// REST
implementation 'org.springframework.boot:spring-boot-starter-web'
// SQS
implementation 'org.springframework.cloud:spring-cloud-aws-messaging:2.2.3.RELEASE'
implementation 'org.springframework.cloud:spring-cloud-aws-autoconfigure:2.2.3.RELEASE'
// lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
application.yml
SQS 대기열을 생성한 리전과 위에서 설정한 사용자의 Access Key와 Secret Key를 기재해준다.
물론 배포할 EC2에 자격 증명을 직접 부여하는 것이 권장 사항이지만 배포까지 하지 않을것이기 때문에 property 파일에 자격 증명 정보를 기재해주겠다.
cloud:
aws:
stack:
auto: false
region:
static: ap-northeast-2
credentials:
access-key: [Access Key]
secret-key: [Secret Key]
SqsMessageSender
@Service
public class SqsMessageSender {
private final QueueMessagingTemplate queueMessagingTemplate;
@Autowired
public SqsMessageSender(AmazonSQS amazonSQS) {
this.queueMessagingTemplate = new QueueMessagingTemplate((AmazonSQSAsync) amazonSQS);
}
public void send(String message) {
Message<String> sendMessage = MessageBuilder.withPayload(message).build();
queueMessagingTemplate.send("testQueue", sendMessage);
}
}
SqsMessageListener
@Slf4j
@Component
public class SqsMessageListener {
@SqsListener(value = "testQueue", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void listen(@Payload String message,
@Headers Map<String, String> headers) {
log.info("message : " + message);
log.info("{}", headers);
}
}
SqsMessageDeletionPolicy은 메시지를 받은 이후 삭제 정책을 설정한다.
- SqsMessageDeletionPolicy.ALWAYS : 메시지를 받으면 무조건 삭제 요청을 보낸다.
- SqsMessageDeletionPolicy.NEVER : 삭제 요청을 보내지 않는다.
- SqsMessageDeletionPolicy.NO_REDRIVE : DLQ가 설정되어있지 않으면 삭제 요청을 보낸다.
- SqsMessageDeletionPolicy.ON_SUCCESS : SqsListener 메서드에 오류가 발생하지 않으면 삭제 요청을 보낸다.
만약 삭제 정책을 SqsMessageDeletionPolicy.NEVER로 설정하고 삭제 요청을 하지 않는다면 메시지는 삭제되지 않고 설정한 폴링 기간마다 계속해서 메시지를 받게된다.
그러므로 SqsMessageDeletionPolicy.NEVER로 설정 시 Acknowledgment를 매개변수로 받아 특정한 유효성을 거친 후 삭제 요청을 보내야 한다.
만약 폴링 기간을 0으로 설정하게 되면 엄청난 요금 폭탄을 맞을 수 있으니 주의하자.
SqsController
@RestController
@RequiredArgsConstructor
public class SqsController {
private final SqsMessageSender sqsMessageSender;
@GetMapping(value = "sqs/send")
public String send(@RequestParam String message) {
sqsMessageSender.send(message);
return "Success";
}
}
Send Test
Postman을 통해 생성한 컨트롤러로 테스트를 해보겠다.
정상적으로 메세지가 보내지고 받아지는 것을 확인 할 수있다.
전체 코드는 아래 GitHub에서 확인하실 수 있습니다.