한국어로 된 블로그 중에 공식문서대로 설정한 사람이 거의 없는 것 같고 버전이 많이 달라져서 최신화된 글을 위해 작성합니다.
이 글은 2024-8월에 동작이 확인된 글 입니다.
SQS설정
build.gradle
//sqs
implementation platform("io.awspring.cloud:spring-cloud-aws-dependencies:3.0.1")
implementation 'io.awspring.cloud:spring-cloud-aws-starter-sqs:3.2.0-M1'
application.yml
cloud:
aws:
region:
static: ap-northeast-2
credentials:
access-key: 엑세스 키
secret-key: 시크릿 키
sqs:
queue-name: 큐 이름
stack:
auto: false
가 공식 문서인데 저는 설정이 제대로 안되서 설정을 바꿔줬습니다.
이게 저만 겪는 문제가 아니라 대부분의 사용자가 겪는 문제더라고요.
cloud:
aws:
region: ap-northeast-2
access-key: 엑세스
secret-key: 시크릿
sqs:
queue:
url: SQS URL
stack:
auto: false
awsProerties.java
@Getter
@Setter
@ConfigurationProperties(prefix = "cloud.aws")
public class AwsProperties {
private String accessKey;
private String secretKey;
private String region;
}
SqsConfig
@Configuration
@RequiredArgsConstructor
public class SqsConfig {
private final AwsProperties awsProperties;
@Bean
public SqsAsyncClient sqsAsyncClient() {
return SqsAsyncClient.builder()
.region(Region.AP_NORTHEAST_2) // 리전 설정
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create(awsProperties.getAccessKey(), awsProperties.getSecretKey()))) // AWS 자격 증명 설정
.build();
}
}
여기서 key 발급 받는 방법은 IAM 계정 사용해서 이렇게 권한 설정 해주시고.
보안 자격 증명 누르셔서 엑세스키 만들기 -> 외부 어플리케이션으로 진행해주시면 됩니다.
Aws에서 SQS를 쓸거긴 하지만 개발은 로컬에서 하는게 편하기 때문에 개발할 때만 이렇게 사용하고 실제 prod 모드에서는 다른 방식으로 SQS를 사용할 예정입니다.
tip: SQS는 여러개 만들어도 돈 더나오는게 아니라 사용량 기준으로 부과되니까 개발용 SQS랑 Prod 용 SQS 분리해서 사용하시면 좋을 듯 합니다.
MessageSender
@Service
@RequiredArgsConstructor
public class MessageSender {
private final SqsTemplate sqsTemplate;
public void sendMessage(String queueName, String message) {
sqsTemplate.send(queueName, message);
}
}
postMan안 쓰고 swagger로 테스트 하기 위해서 컨트롤러는 다음과 같이 만들어서 메시지를 보내봅시다.
@RestController
@RequiredArgsConstructor
@Tag(name = "SQS", description = "SQS 테스트")
public class SqsController {
private final MessageSender messageSender;
@GetMapping("/sqs-test")
@Operation(summary = "SQS 테스트", description = "SQS 메시지 전송 테스트")
public String test() {
messageSender.sendMessage("mejai-renewal-sqs", "Hello, SQS!");
return "success";
}
}
다음과 같이 스웨거에 테스트가 생깁니다.
리스너도 설정을 따로 진행해줍니다.
SqsListenerConfig
@Configuration
public class SqsListenerConfig {
@Bean
public SqsMessageListenerContainerFactory<Object> sqsListenerContainerFactory(SqsAsyncClient sqsAsyncClient) {
return SqsMessageListenerContainerFactory.builder()
.sqsAsyncClient(sqsAsyncClient)
.configure(options -> options
.maxConcurrentMessages(10) // 최대 동시 메시지 처리 수
.pollTimeout(Duration.ofSeconds(10))) // 폴링 타임아웃 설정
.build();
}
}
package mejai.mejaigg.messaging.sqs.listener;
import org.springframework.stereotype.Component;
import io.awspring.cloud.sqs.annotation.SqsListener;
@Component
public class MessageListener {
@SqsListener(value = "mejai-renewal-sqs", factory = "sqsListenerContainerFactory")
public void listen(String message) {
System.out.println("Received message: " + message);
// 메시지 처리 로직
}
}
역시나 잘 동작합니다.
다음과 같이 잘 나왔습니다.
리스너를 끄고 콘솔에서 확인해보면 다음과 같이 API를 통해 보낸 메시지가 SQS에 들어가 있음을 확인 할 수 있습니다.
이번에는 일부러 Exception을 발생시켰습니다.
@Component
public class MessageListener {
@SqsListener(value = "mejai-renewal-sqs", factory = "sqsListenerContainerFactory")
public void listen(String message) {
System.out.println("Received message: " + message);
throw new RuntimeException("Test Exception");
}
}
계속해서 SQS에서 에러가 발생됩니다.
완전히 성공해야 메시지가 사라진다는 것을 확인 했습니다.
'Backend' 카테고리의 다른 글
Spring Boot에서 Swagger를 통한 API 문서화 설정 가이드 (2) | 2024.09.13 |
---|---|
Aws SQS Spring으로 Listener Stop Start하기 (0) | 2024.08.13 |
[문제해결] Spring webSocket Test 삽질 일기 (생성자 직렬화 문제) (0) | 2024.08.07 |
Spring Security 단위 테스트 (0) | 2024.08.07 |
[문제 해결] github Action + AWS CodeDeploy 배포 환경변수 삽질일기. (2) | 2024.08.07 |