본문 바로가기
Backend

sqs spring boot 사용법

by 뜨거운 개발자 2024. 8. 13.

한국어로 된 블로그 중에 공식문서대로 설정한 사람이 거의 없는 것 같고 버전이 많이 달라져서 최신화된 글을 위해 작성합니다.

이 글은 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에서 에러가 발생됩니다.

완전히 성공해야 메시지가 사라진다는 것을 확인 했습니다.

 

 

728x90