이전에 학습한 @Async는 간단한 비동기 처리를 가능하게 하지만, 몇 가지 한계점을 가집니다.
@Async의 한계:
@Async는 다른 서버 인스턴스와 작업을 공유할 수 없어, MSA(Microservice Architecture)와 같은 분산 환경에서는 사용하기 어렵습니다.메시지 큐 (Message Queue, MQ): 이러한 문제들을 해결하기 위해, 애플리케이션 간에 메시지를 안정적으로 비동기 통신할 수 있도록 도와주는 별도의 미들웨어 시스템입니다.
생산자 (Producer):
소비자 (Consumer):
메시지 큐 (Message Queue):
의존성 추가: build.gradle에 spring-boot-starter-amqp를 추가합니다.
application.yml 설정: RabbitMQ 서버의 접속 정보를 설정합니다.
메시지 생산자 (Producer) 구현:
RabbitTemplate이라는 Spring이 제공하는 템플릿 클래스를 주입받습니다.rabbitTemplate.convertAndSend("exchange-name", "routing-key", messageObject) 메서드를 호출하여 메시지를 발송합니다.메시지 소비자 (Consumer) 구현:
@RabbitListener 어노테이션을 사용하여, 특정 큐를 리스닝하는 메서드를 간단하게 만들 수 있습니다.// Producer (Service)
@Service
@RequiredArgsConstructor
public class OrderService {
private final RabbitTemplate rabbitTemplate;
public void createOrder(OrderRequest request) {
// ... 주문 생성 로직 ...
// 주문 완료 이벤트를 메시지로 발송
rabbitTemplate.convertAndSend("order.exchange", "order.created", new OrderEvent(orderId));
}
}
// Consumer (Listener)
@Component
public class NotificationListener {
@RabbitListener(queues = "notification.queue")
public void handleOrderCreatedEvent(OrderEvent event) {
// 주문 생성 이벤트를 받아 이메일 발송 등의 후처리 작업 수행
System.out.println("주문 생성 알림: " + event.getOrderId());
}
}
RabbitTemplate으로 메시지를 쉽게 생산하고, @RabbitListener 어노테이션으로 메시지를 간편하게 소비하여, Spring Boot 애플리케이션에 RabbitMQ를 손쉽게 통합할 수 있습니다.