Spring Boot와 RabbitMQ로 비동기 처리 구현
Spring Boot와 RabbitMQ를 이용해 비동기 작업 흐름을 구성하는 방법과 핵심 설정, 코드 예제를 단계별로 정리한 설명
목차
개요
비동기 처리 구조는 요청 응답을 분리해 시스템 확장성과 응답성을 높인다. 이 글은 spring boot rabbitmq 연동을 통해 메시지 기반 비동기 작업을 구성하는 방법을 처음 접하는 개발자도 이해하기 쉬운 흐름으로 정리한다.
무엇을 준비해야 하나
필수 요소
- Java 11 이상
- Spring Boot (Spring AMQP 포함)
- 로컬 또는 원격 RabbitMQ 브로커
- 간단한 빌드 도구(Maven 또는 Gradle)
의존성 추가
Spring AMQP는 RabbitMQ와의 연동을 쉽게 한다. Maven을 사용할 때 pom.xml에 다음 의존성을 추가한다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
설정 예시
application.yml
기본 연결 설정과 큐 이름을 정의한다. rabbitmq spring boot 설정 관점에서 필수 항목을 명확히 둔다.
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
listener:
simple:
concurrency: 2
max-concurrency: 10
myapp:
queue: task.queue
exchange: task.exchange
routing-key: task.key
RabbitMQ 구성 클래스
큐, 익스체인지, 바인딩을 코드로 선언하면 배포 시 자동 생성된다.
package com.example.messaging;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
@Configuration
public class RabbitConfig {
@Bean
public Queue taskQueue() {
return new Queue("task.queue", true);
}
@Bean
public TopicExchange taskExchange() {
return new TopicExchange("task.exchange");
}
@Bean
public Binding binding(Queue taskQueue, TopicExchange taskExchange) {
return BindingBuilder.bind(taskQueue).to(taskExchange).with("task.key");
}
}
메시지 모델과 생산자
메시지 구조는 단순한 DTO로 정의한다. 생산자는 RabbitTemplate을 사용해 메시지를 전송한다.
package com.example.messaging;
public class TaskMessage {
private String id;
private String payload;
// getters, setters, constructors
}
package com.example.messaging;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
@Service
public class TaskProducer {
private final RabbitTemplate rabbitTemplate;
public TaskProducer(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
public void send(TaskMessage msg) {
rabbitTemplate.convertAndSend("task.exchange", "task.key", msg);
}
}
소비자(Listener)
@RabbitListener를 사용하면 메시지 수신과 처리를 간단히 구현할 수 있다. spring amqp 예제에서 확인되는 기본 패턴이다.
package com.example.messaging;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class TaskListener {
@RabbitListener(queues = "task.queue")
public void receive(TaskMessage msg) {
// 메시지 처리 로직
System.out.println("Received: " + msg.getId());
// 처리 중 예외 발생 시 재시도 또는 DLQ로 보낼 정책 적용 가능
}
}
운영 시 고려사항
- Ack 모드와 재시도 정책: 수동 Ack로 안정적인 처리 보장
- Prefetch 설정: 소비자별 처리량 조절
- DLQ(Dead Letter Queue): 처리 실패 메시지 분리
- 모니터링: RabbitMQ 관리 UI와 로그 감시
간단한 실행 흐름
- 1. RabbitMQ 브로커 실행
- 2. Spring Boot 애플리케이션 기동
- 3. Producer가 메시지 전송
- 4. Listener가 메시지 수신 후 처리
- 5. 실패 시 재시도 또는 DLQ로 이동
성능 및 확장 팁
비동기 처리 설계 시 큐 설계, 메시지 크기, 직렬화 방식(예: JSON 혹은 바이너리) 등이 성능에 영향을 준다. 컨슈머 인스턴스를 수평 확장하면 처리율을 높일 수 있으나 메시지 순서를 보장해야 하면 별도 설계가 필요하다.
마무리
지금까지 spring boot rabbitmq 연동 기본 흐름과 rabbitmq spring boot 설정, spring amqp 예제 패턴을 살펴봤다. 단순한 큐 기반 비동기 처리부터 운영 환경에서의 고려사항까지 실무에 바로 적용 가능한 구성과 코드 예제를 중심으로 정리한 설명.