스프링 부트에서 래빗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/

좋은 웹페이지 즐겨찾기