Spring-Cloud

RabbitMQ - 2: 메시지 발신자

  • -

이번 포스트에서는 Spring Cloud에서 RabbitMQ에 메시지를 보내는 발신자를 구성해보자.

 

프로젝트 구성

 

의존성

Spring에서 RabbitMQ를 사용한 웹 애플리케이션을 구성해보자. 의존성에는 다음을 추가한다.

의존성 추가

더보기
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>4.0.2</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.quietjun</groupId>
	<artifactId>rabbit</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>rabbitMQ</name>
	<description>Demo project for Spring Boot</description>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>21</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webmvc</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-amqp-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-webmvc-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<annotationProcessorPaths>
						<path>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</path>
					</annotationProcessorPaths>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

 

application.properties

application.properties에는 접속할 RabbitMQ 서버에 대한 정보를 추가해줄 수 있는데 사실 모두 default 이므로 생략해도 무방하다.

server.port=7077

# default 내용으로 생략 가능
#spring.rabbitmq.host=localhost
#spring.rabbitmq.port=5672
#spring.rabbitmq.username=guest
#spring.rabbitmq.password=guest

 

기본 코드

 

환경 설정

RabbitMQ에 대한 기본적인 설정은 spring-boot-starter-amqp를 의존성에 추가하는 순간 거의 끝난다. 바로 auto configuration 때문이다.

https://docs.spring.io/spring-boot/appendix/auto-configuration-classes/spring-boot-amqp.html

 

spring-boot-amqp :: Spring Boot

Preview

docs.spring.io

AutoConfiguration은 참 대단하고, 무섭고..필요하면 수정하자.

 

MessageService

RabbitMQ에 메시지를 보내기 위해서는 RabbitTemplate를 사용한다. RabbitTemplate은 RabbitAutoConfiguration에 의해 빈으로 등록된다. 따라서 서비스에서는 빈을 주입 받고 convertAndSend 메서드를 통해 메시지를 전달하면 된다.

convertAndSend는 다음의 3가지를 파라미터로 받는다.

  • String exchange: exchange 이름
  • String routingKey: routing key 이름
  • Object object: 전달할 메시지
package com.quietjun.example.service;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
public class MessageService {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendDirectMessage(String str) {
        log.debug("amq.direct 보낸 메시지 : {}", str);
        rabbitTemplate.convertAndSend("amq.direct", "quietjun", str);
    }
    
    public void sendFanoutMessage(String str) {
        log.debug("amq.fanout 보낸 메시지 : {}", str);
        rabbitTemplate.convertAndSend("amq.fanout", null, str);
    }
    
    public void sendTopicMessage(String str) {
        log.debug("amq.topic 보낸 메시지 : {}", str);
        rabbitTemplate.convertAndSend("amq.topic", "sports.baseball", str);
    }
}

 

MessageSendController

다음으로 사용자의 요청을 받아 서비스를 호출하는 MessageSendController이다. 특별한 내용은 없다.

@RestController
@RequestMapping("/send")
public class MessageSendController {
    @Autowired
    private MessageService messageService;
    @GetMapping("/direct")
    public ResponseEntity<?> sendDirectMessage(@RequestParam("name") String name) {
        messageService.sendDirectMessage(name+"님이 RabbitMQ 브로커에게 메시지를 보내요");
        return ResponseEntity.ok(name+"님!! RabbitMQ 브로커에게 메시지(이벤트)를 보냈어요!!!🐇");
    }
    
    @GetMapping("/fanout")
    public ResponseEntity<?> sendFanoutMessage(@RequestParam("name") String name) {
        messageService.sendFanoutMessage(name+"님이 RabbitMQ 브로커에게 메시지를 보내요");
        return ResponseEntity.ok(name+"님!! RabbitMQ 브로커에게 메시지(이벤트)를 보냈어요!!!🐇");
    }
    
    @GetMapping("/topic")
    public ResponseEntity<?> sendTopicMessage(@RequestParam("name") String name) {
        messageService.sendTopicMessage(name+"님이 RabbitMQ 브로커에게 메시지를 보내요");
        return ResponseEntity.ok(name+"님!! RabbitMQ 브로커에게 메시지(이벤트)를 보냈어요!!!🐇");
    }
}

 

index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form method="get">
		<input name="name" value="hong">
		<button formaction="./send/direct">direct</button>
		<button formaction="./send/fanout">fanout</button>
		<button formaction="./send/topic">topic</button>
	</form>
	
	<a href="http://localhost:15672/">rabbit mq</a>
</body>
</html>

 

동작 확인

 

메시지 발송

먼저 index.html을 이용해 direct, fanout, topic 메시지를 각각 전송하자.

여기서 발생시킨 메시지는 RabbitMQ의 Queue로 전달된다.

 

RabbitMQManager에서의 확인

다음으로 RabbitMQManager의 Queue and Streams 메뉴를 살펴보자. Messages의 Ready에 있는 숫자가 각각의 큐가 전달받은 메시지의 개수이다.(테스트 삼아 7개를 보낸 상태)

Queue의 메시지 수신

다음 포스트에서는 Queue에서 메시지를 꺼내가는 서비스를 만들어보자.

'Spring-Cloud' 카테고리의 다른 글

RabbitMQ - 1:기본  (0) 2026.02.01
01. OpenFeign 1  (0) 2026.01.24
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.