spring:
# Spring Boot RabbitMQ 설정
rabbitmq:
host: localhost
port: 5672
username: admin
password: admin
💡 [참고] spring.rabbitmq 속성
속성 명
설명
spring.rabbitmq.host
RabbitMQ 호스트 주소
spring.rabbitmq.port
RabbitMQ 포트 번호
spring.rabbitmq.username
RabbitMQ 연결에 사용되는 사용자 이름
spring.rabbitmq.password
RabbitMQ 연결에 사용되는 비밀번호
spring.rabbitmq.virtual-host
RabbitMQ 가상 호스트 이름
spring.rabbitmq.listener.simple.concurrency
간단한 리스너의 동시성 수준
spring.rabbitmq.template.exchange
RabbitMQ 템플릿의 기본 교환기 이름
spring.rabbitmq.template.routing-key
RabbitMQ 템플릿의 기본 라우팅 키
2) PRODUCER 구성
💡 RabbitMQ 생산자(Producer) 구성
- 메시지를 ‘생성’하고 메시지 브로커에 ‘전송’하는 구성요소를 의미합니다.
1. 전체 프로세스 확인
💡 프로세스 구성
💡[ 실제 호출이 발생한 경우 수행 ]
1. Client → ProceduerController - Client에서는 api/v1/producer/send로 메시지 타이틀, 메시지에 대해서 담아서 API로 요청을 합니다.
2. ProceduerController → ProceduerService - Controller는 인터페이스를 호출하여 메시지 정보를 전달한다.
3. ProceduerService → ProceduerServiceImpl - 서비스의 구현체에서는 RabbitTemplate을 호출하여서 메시지를 전달하여 실제 메시지를 전송합니다. (* 해당 부분에서는 브로커와 Jackson2JsonMessageConverter를 이용하여 데이터를 전송하기로 지정하여 JSON 타입으로 파싱 하여 브로커로 전달한다) - exchange name과 Router Key 값을 기반으로 지정합니다.
💡 [ API 서버가 로드될 때 구성 ]
1. RabbitMqConfig - API 서버가 로드될 때 수행이 됩니다.
2. Exchange, Queue - 각각 지정한 Exchange Name, Queue Name을 지정합니다.
3. Binding - 지정한 Exchange, Queue에 따라서 바인딩을 하여 Routing Name을 지정합니다.
4. ConnectionFactory - Application.properties 파일 내에서 지정한 값을 불러와서 연결에 대한 구성을 수행합니다.
5. MessageConverter - 메시지 전송 타입을 지정합니다. 전송은 JSON 타입으로 데이터를 주고받기로 지정하였습니다.
6. RabbitTemplate - 구성한 Connection Factory, MessageConvert를 기반으로 통신을 위한 템플릿을 구성합니다.
7. RabbitMqConfig → ProceduerServiceImpl - RabbitMq에 대한 구성한 RabbitTemplate을 기반으로 메시지를 보낼 수 있는 구현체를 구성합니다. - exchange name과 Router Key 값을 기반으로 지정합니다.
[ 더 알아보기 ] 💡 MessageConverter
- MessageConverter를 사용하면 AMQP 메시지를 다른 형식으로 변환하거나, 다른 시스템과의 통신에 필요한 형식으로 변환할 수 있습니다. 이를 통해 메시지를 효과적으로 송수신하고 처리할 수 있습니다. 💡 MessageConverter의 종류
구현체
설명
Jackson2JsonMessageConverter
Jackson JSON 라이브러리를 사용하여 메시지 직렬화 및 역직렬화
SimpleMessageConverter
기본적인 직렬화 및 역직렬화를 수행하는 간단한 메시지 컨버터
MarshallingMessageConverter
Marshaller와 Unmarshaller를 사용하여 XML 메시지 처리
ByteArrayMessageConverter
바이트 배열 형식의 메시지를 처리하는 메시지 컨버터
MappingJackson2MessageConverter
Jackson JSON 라이브러리를 사용하여 메시지 직렬화 및 역직렬화
2. RabbitMQ 환경 파일 구성
💡 RabbitMQ 환경 파일 구성
- Spring Boot 환경에서 RabbitMQ와의 연결을 구성하고, 큐, 익스체인지, 바인딩, RabbitTemplate, ConnectionFactory, MessageConverter 등을 설정하는 클래스를 의미합니다. 💡 RabbitMQ 환경 파일 구성 순서
1. Direct Exchange 구성
2. 큐 구성
3. 구성한 큐와 Direct Exchange를 바인딩
4. ConnectionFactory 구성
5. 데이터 통신을 위한 messageConverter 구성
6. 템플릿을 통하여 구성한 환경 내의 통신을 수행하도록 합니다.
[ 다시 알아보기 ] 💡 Direct exchange
- ‘라우팅 키(Routing Key)’를 기반으로 메시지를 큐로 라우팅 합니다. 바인딩 키가 메시지의 라우팅 키와 정확히 일치하는 큐로 메시지가 라우팅 됩니다.
package com.adjh.multiflexapi.config;
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.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* RabbitMQ의 설정파일 입니다.
*
* @author : jonghoon
* @fileName : RabbitmqConfig
* @since : 10/15/23
*/
@Configuration
public class RabbitmqConfig {
@Value("${spring.rabbitmq.host}")
private String host;
@Value("${spring.rabbitmq.username}")
private String username;
@Value("${spring.rabbitmq.password}")
private String password;
@Value("${spring.rabbitmq.port}")
private int port;
/**
* 1. Exchange 구성합니다.
* "hello.exchange" 라는 이름으로 Direct Exchange 형태로 구성하였습니다.
*
* @return DirectExchange
*/
@Bean
DirectExchange directExchange() {
return new DirectExchange("hello.exchange");
}
/**
* 2. 큐를 구성합니다.
* "hello.queue"라는 이름으로 큐를 구성하였습니다.
*
* @return Queue
*/
@Bean
Queue queue() {
return new Queue("hello.queue", false);
}
/**
* 3. 큐와 DirectExchange를 바인딩합니다.
* "hello.key"라는 이름으로 바인딩을 구성하였습니다.
*
* @param directExchange
* @param queue
* @return Binding
*/
@Bean
Binding binding(DirectExchange directExchange, Queue queue) {
return BindingBuilder.bind(queue).to(directExchange).with("hello.key");
}
/**
* 4. RabbitMQ와의 연결을 위한 ConnectionFactory을 구성합니다.
* Application.properties의 RabbitMQ의 사용자 정보를 가져와서 RabbitMQ와의 연결에 필요한 ConnectionFactory를 구성합니다.
*
* @return ConnectionFactory
*/
@Bean
ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
return connectionFactory;
}
/**
* 5. 메시지를 전송하고 수신하기 위한 JSON 타입으로 메시지를 변경합니다.
* Jackson2JsonMessageConverter를 사용하여 메시지 변환을 수행합니다. JSON 형식으로 메시지를 전송하고 수신할 수 있습니다
*
* @return
*/
@Bean
MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
/**
* 6. 구성한 ConnectionFactory, MessageConverter를 통해 템플릿을 구성합니다.
*
* @param connectionFactory
* @param messageConverter
* @return
*/
@Bean
RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(messageConverter);
return rabbitTemplate;
}
}