스프링 RabbitMQ 연동하기

2024. 11. 17. 23:44· Spring
목차
  1. 본 포스팅에서 다루는 내용
  2. RabbitMQ 도커 컴포즈 파일 작성하기
  3. 관련 의존성 추가하기
  4. 프로퍼티 파일 작성하기
  5. RabbitMQConfig 작성하기
  6. Message Model 및 Producer/Consumer 작성하기
  7. 사용 예시

스프링 RabbitMQ 연동하기

 

작성 일자 : 2024년 11월 17일


 

LEGO Rabbit illustrated by Dalle3

 

본 포스팅에서 다루는 내용

  1. RabbitMQ 도커 컴포즈 파일 작성하기
  2. 관련 의존성 추가하기
  3. 프로퍼티 파일 작성하기
  4. RabbitMQConfig 작성하기
  5. Message Model 및 Producer/Consumer 작성하기
  6. 사용 예시

 


 

RabbitMQ 도커 컴포즈 파일 작성하기

 

rabbitmq:4.0.3-management 이미지를 사용하여 RabbitMQ를 도커 컨테이너로 실행하기 위한 docker-compose.yml 파일을 작성합니다.

 

management 는 RabbitMQ의 Management Plugin을 사용할 수 있도록 합니다.

 

version: '3.8'
services:
  rabbitmq:
    image: rabbitmq:4.0.3-management
    ports:
      - "5672:5672"
      - "15672:15672"
    environment:
      RABBITMQ_DEFAULT_USER: guest
      RABBITMQ_DEFAULT_PASS: guest

 


 

 

관련 의존성 추가하기

 

build.gradle에 RabbitMQ 관련 의존성을 추가합니다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-amqp'
}

 


 

 

프로퍼티 파일 작성하기

 

application.yml에 RabbitMQ 관련 프로퍼티를 작성합니다.

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

 


 

 

RabbitMQConfig 작성하기

 

RabbitMQ와 연동하기 위한 RabbitMQConfig 클래스를 작성합니다.

@Configuration
public class RabbitMQConfig {

    public static final String MESSAGE_QUEUE = "message-queue";
    public static final String MESSAGE_EXCHANGE = "message-exchange";
    public static final String MESSAGE_ROUTING_KEY = "chat.message";


    @Bean
    public AmqpTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter());
        return rabbitTemplate;
    }

    @Bean
    public MessageConverter jackson2JsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }


    @Bean
    public Queue messageQueue() {
        return new Queue(MESSAGE_QUEUE);
    }

    @Bean
    public TopicExchange messageExchange() {
        return new TopicExchange(MESSAGE_EXCHANGE);
    }

    @Bean
    public Binding messageBinding(Queue messageQueue, TopicExchange messageExchange) {
        return BindingBuilder
                .bind(messageQueue)
                .to(messageExchange)
                .with(MESSAGE_ROUTING_KEY);
    }

}

 

  • Jackson2JsonMessageConverter를 사용하여 메시지를 JSON 형태로 직렬화 또는 역직렬화합니다.
  • rabbitTemplate 빈을 생성할 때, overriding is disabled 에러가 발생할 수 있습니다.

 


 

 

Message Model 및 Producer/Consumer 작성하기

 

큐로 전달할 메시지 모델과 Producer / Consumer 서비스를 작성합니다.

// Message Model
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Message {
    private String id;
    private String message;
    private Date messageDate;
}

// Publisher/Producer Service
@Slf4j
@Service
public class RabbitMQProducer {

    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void sendMessage(Message message) {
        rabbitTemplate.convertAndSend(
            RabbitMQConfig.EXCHANGE,
            RabbitMQConfig.ROUTING_KEY,
            message
        );
        log.info("Message sent: " + message);
    }
}

// Consumer Service
@Slf4j
@Service
public class RabbitMQConsumer {

    @RabbitListener(queues = RabbitMQConfig.QUEUE)
    public void receiveMessage(Message message) {
        log.info("Message received: " + message);
    }
}

 


 

 

사용 예시

@RestController
@RequestMapping("/api/messages")
@AllArgsConstructor
public class MessageController {

    private final RabbitMQProducer producer;

    @PostMapping("/send")
    public ResponseEntity<Message> sendMessage(@RequestBody String input) {
        Message message = new Message(
            UUID.randomUUID().toString(),
            input,
            new Date()
        );

        producer.sendMessage(message);

        return ResponseEntity.ok(message);
    }
}

 

저작자표시 (새창열림)
  1. 본 포스팅에서 다루는 내용
  2. RabbitMQ 도커 컴포즈 파일 작성하기
  3. 관련 의존성 추가하기
  4. 프로퍼티 파일 작성하기
  5. RabbitMQConfig 작성하기
  6. Message Model 및 Producer/Consumer 작성하기
  7. 사용 예시
'Spring' 카테고리의 다른 글
  • 스프링 - Redission 분산락으로 동시성 문제 해결하기 예시
  • 스프링 - Redis CacheManager ClassCastException 해결하기
  • 스프링 - LLM Response를 Redis Streams와 SSE로 스트리밍 해보자
  • 스프링에서 각기 다른 Base URL의 WebClient 인스턴스 사용하기
gerrymandering
gerrymandering
gerrymandering
gerrymandering
gerrymandering
전체
오늘
어제
  • 분류 전체보기 (81) N
    • SOLID 원칙 (6)
    • 번역 (4)
    • Nginx (1)
    • Tailwind CSS (1)
    • AWS (7)
      • DMS를 사용한 RDS to OpenSearch .. (3)
      • ECS를 이용한 Blue-Green 무중단 배포 .. (7)
    • NextJS (5)
    • 기타 (12) N
    • Prompt Engineering (6)
    • 읽어볼만한 글 (3)
      • 기술 (0)
      • 쓸만한 툴 (0)
      • 아이템 (0)
      • 웹 디자인 (0)
      • 기타 (3)
    • Cloud Architecture (4)
    • Trouble Shooting (9)
    • Spring (11)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

글쓰기 / 관리자
hELLO · Designed By 정상우.v4.2.1
gerrymandering
스프링 RabbitMQ 연동하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.