티스토리 뷰

이번 포스팅은 RabbitMQ 가 무엇인지 간단한 예제와 함께 알아보려고 합니다.


1. RabbitMQ 란?

RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 기반으로 한 오픈소스 메시지 브로커(Message Broker)입니다. 애플리케이션 간 비동기 메시지 전송을 지원하며, 시스템 간 느슨한 결합(Loose Coupling)을 가능하게 해 줍니다.

  • 주요 역할: 메시지를 생산자(Producer)로부터 받아 소비자(Consumer)에게 전달
  • 핵심 구성 요소: Exchage(메시지 라우팅), Queue(메시지 저장), Binding(Exchage와 Queue 연결)
  • 사용 사례: 마이크로서비스 간 통신, 작업 큐 관리, 이벤트 기반 아키텍처

참고 : https://www.cloudamqp.com/img/blog/exchanges-topic-fanout-direct.png


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 같은 대안을 고려할 필요가 있습니다.

감사합니다.

최근에 올라온 글
Total
Today
Yesterday