티스토리 뷰
이번 포스팅은 RabbitMQ 가 무엇인지 간단한 예제와 함께 알아보려고 합니다.
1. RabbitMQ 란?
RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 기반으로 한 오픈소스 메시지 브로커(Message Broker)입니다. 애플리케이션 간 비동기 메시지 전송을 지원하며, 시스템 간 느슨한 결합(Loose Coupling)을 가능하게 해 줍니다.
- 주요 역할: 메시지를 생산자(Producer)로부터 받아 소비자(Consumer)에게 전달
- 핵심 구성 요소: Exchage(메시지 라우팅), Queue(메시지 저장), Binding(Exchage와 Queue 연결)
- 사용 사례: 마이크로서비스 간 통신, 작업 큐 관리, 이벤트 기반 아키텍처
2. 장점 & 단점
장점
- 확장성: 여러 소비자를 통해 작업을 분산 처리 가능
- 유연성: Direct, Fanout, Topic 등 다양한 Exchage 타입으로 복잡한 라우팅 가능
- 안정성: 메시지 손실 방지를 위한 ACK 메커니즘과 Dead Letter Exchange 지원
- 생태계: Spring AMQP 같은 프레임워크와 통합이 쉬움
- 관리 편의: 웹 기반 관리 콘솔 제공
단점
- 복잡성: 초기 설정(Exchange, Queue, Binding)이 다소 복잡할 수 있음
- 성능: Kafka 같은 스트리밍 플랫폼에 비해 대량 데이터 처리 속도가 느릴 수 있음
- 의존성: RabbitMQ 서버 가동이 필수라 단일 장애점(SPOF) 우려가 있음(클러스터링으로 해결 가능)
3. 예제(Direct Exchange)
3.1. 의존성 설정(build.gradle)
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.3'
id 'io.spring.dependency-management' version '1.1.7'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
repositories {
mavenCentral()
}
dependencies {
// RabbitMQ
implementation 'org.springframework.boot:spring-boot-starter-amqp:3.4.3'
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
// Lombok
annotationProcessor 'org.projectlombok:lombok'
compileOnly 'org.projectlombok:lombok'
}
tasks.named('test') {
useJUnitPlatform()
}
3.2. RabbitMQ 연결 설정(application.yml)
server:
port: 1004
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
3.3. Direct Exchange 설정
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean
public Queue queue() {
return new Queue("direct-queue", false); // 비영속 큐
}
@Bean
public DirectExchange exchange() {
return new DirectExchange("direct-exchange");
}
@Bean
public Binding binding(Queue queue, DirectExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("direct-routing-key");
}
}
3.4. 메시지 생산자(Producer)
import lombok.RequiredArgsConstructor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class MessageProducer {
private final RabbitTemplate rabbitTemplate;
public void sendMessage(String message) {
rabbitTemplate.convertAndSend("direct-exchange", "direct-routing-key", message);
System.out.println("Sent to direct-exchange with key 'direct-routing-key': " + message);
}
}
3.5. 메시지 소비자(Consumer)
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class MessageConsumer {
@RabbitListener(queues = "direct-queue")
public void receiveMessage(String message) {
System.out.println("Received from direct-queue: " + message);
}
}
3.6. 실행 클래스
import com.example.rabbitmq_example.mq.MessageProducer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class RabbitMqExampleApplication {
public static void main(String[] args) {
var context = SpringApplication.run(RabbitMqExampleApplication.class, args);
MessageProducer producer = context.getBean(MessageProducer.class);
producer.sendMessage("Hello, Direct Exchange with Spring Boot!");
}
}
4. 실행
4.1. RabbitMQ 서버 실행
docker run -d -p 5672:5672 -p 15672:15672 rabbitmq:management
- 5672: 서비스 포트
- 15672: 관리자 웹 포트
4.2. 애플리케이션 실행
- mvn spring-boot:run 또는 IDE 에서 애플리케이션 실행
4.3. 결과 확인
- Spring Boot 애플리케이션 실행 후 MessageProducer를 호출하면 메시지가 큐로 전달되고, MessageConsumer 가 이를 수신합니다.
5. 마무리
RabbitMQ는 비동기 통신과 시스템 확장을 위한 강력한 도구입니다. Spring Boot 와의 통합은 AMQP 스타터 덕분에 간편하며, 설정만 잘하면 빠르게 미시지 기반 애플리케이션을 구축할 수 있습니다. 소규모 프로젝트라면 기본 설정으로 충분하지만, 대규모 트래픽이라면 클러스터링이나 Kafka 같은 대안을 고려할 필요가 있습니다.
감사합니다.
'프레임워크 > SpringBoot' 카테고리의 다른 글
[SpringBoot] RestErrorAdvice 설정하는 방법(SpringSecurity+JWT) (0) | 2025.01.16 |
---|---|
[SpringBoot] Docker 배포 가이드 (2) | 2024.12.30 |
[SpringBoot] JPA + GraphQL 연동 예제 (2) | 2024.12.23 |
[Spring] AOP 의 주요 사용처 (1) | 2024.12.03 |
[Spring] 스프링 어노테이션 동작 원리 (2) | 2024.12.03 |
최근에 올라온 글
- Total
- Today
- Yesterday