스프링 RabbitMQ 연동하기
작성 일자 : 2024년 11월 17일
본 포스팅에서 다루는 내용
- RabbitMQ 도커 컴포즈 파일 작성하기
- 관련 의존성 추가하기
- 프로퍼티 파일 작성하기
- RabbitMQConfig 작성하기
- Message Model 및 Producer/Consumer 작성하기
- 사용 예시
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);
}
}