스프링 부트에서 래빗MQ 사용하기
프로젝트 생성
https://start.spring.io/
로 접속해서 다음과 같은 디펜던시들을 추가하고 프로젝트를 생성한다.
Spring for RabbitMQ만 있어도 되겠지만 웹, 데브 툴즈, 롬북은 그냥 필수다.
코드 작성
접속 정보 설정
래빗MQ 접속정보는 기본값으로 설정이 돼있으므로 할 필요는 없지만, 다음과 같이 application.properties
파일에 설정할 수 있다.
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
래빗MQ 설정
프로젝트에 래빗MQ 관련 설정을 하자. RabbitMqConfiguration.java
라는 파일을 만들고 코드를 다음과 같이 작성한다.
package com.jongwon.rabbitmq;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMqConfiguration {
static final String QUEUE_NAME = "spring-boot";
static final String ROUTING_KEY = "foo.bar.#";
static final String TOPIC_EXCHANGE_NAME = "spring-boot-exchange";
@Bean
Queue queue() {
return new Queue(QUEUE_NAME, false);
}
@Bean
TopicExchange exchange() {
return new TopicExchange(TOPIC_EXCHANGE_NAME);
}
@Bean
Binding binding(Queue queue, TopicExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
}
@Bean
MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
@Bean
RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(messageConverter);
return rabbitTemplate;
}
}
설정은 원래 하라는 대로 하는 것이므로 특별히 덧붙일 말은 없지만, 메세지 컨버터로 잭슨을 사용했음에 유의하자.
리시버 작성
이제 메세지를 수신할 클래스를 작성하자. Receiver.java
파일을 만들고 다음과 같이 작성한다.
package com.jongwon.rabbitmq;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class Receiver {
@RabbitListener(queues = "spring-boot")
public void receiveMessage(String message) {
System.out.println(message);
}
}
위 코드와 같이 메세지를 수신할 메서드에 @RabbitListener
애노테이션을 붙이고 수신할 큐 이름을 넣어주면 된다. 그리고 리스너 메서드가 있는 클래스에 @Component
애노테이션을 붙여 빈으로 등록하면 끝이다.
센더 작성
메세지를 수신할 리시버를 작성했으니, 이어서 메세지를 보낼 센더를 작성하자. 그런데 특별히 센더라는 것은 없다. 그냥 send() 메서드를 호출하는 것이 전부다. 따라서 컨트롤러를 만들어 메세지가 잘 가는지, 잘 받아지는데 확인해보자. WebController.java
라는 파일을 만들고 다음과 같이 작성한다.
package com.jongwon.rabbitmq;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.AllArgsConstructor;
@RestController
@AllArgsConstructor
public class WebController {
private final RabbitTemplate rabbitTemplate;
@GetMapping
public void send() {
String message = "Hello, RabbitMQ!";
rabbitTemplate.convertAndSend(
RabbitMqConfiguration.TOPIC_EXCHANGE_NAME,
RabbitMqConfiguration.ROUTING_KEY,
message
);
}
}
특별할 것 없는 레스트 컨트롤러다. 위와 같이 작성했으므로 http://localhost:8080/
주소로 접속하면 send() 메서드에서 래빗 템플릿 인스턴스의 converAndSend() 메서드를 호출할테다.
테스트
스프링 부트 프로젝트를 실행하고 http://localhost:8080/
주소로 접속하면 콘솔에 Hello, RabbitMQ!
메세지가 출력되는 것을 볼 수 있다.
참고로 래빗MQ 관리툴에서도 확인할 수 있다. http://localhost:15672/
로 접속해서 Exchanges
탭을 보면 코드에서 생성한 토픽인 spring-boot-exchange
가 있는 것을 볼 수 있다.
또한 Queues
탭을 보면 코드에서 생성한 큐 이름인 spring-boot
가 있는 것도 볼 수 있으며, 메세지를 수신하지 않도록 주석처리하고 메세지를 보내면 다음과 같이 큐에 메세지가 쌓여 있는 것도 확인할 수 있다.
이 포스트에서 작성한 프로젝트는 다음 주소에 올려두었다.
https://github.com/yu-jongwon/com.jongwon.rabbitmq
자세한 내용은 공식 홈페이지를 참고하자.
https://spring.io/guides/gs/messaging-rabbitmq/
Author And Source
이 문제에 관하여(스프링 부트에서 래빗MQ 사용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yu-jongwon/스프링-부트에서-래빗MQ-사용하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)