본문으로 바로가기

[SpringBoot] SpringBoot 에 RabbitMQ 연동하기

category Java/Spring 2022. 8. 5. 17:41

RabbitMQ 사용할 일이 있어서 간단하게 설치부터 사용까지 작성해본 글 입니다. 

 

 

 

 

1. 설치

brew update
brew install rabbitmq

 

터미널을 열고 위 명령어로 rabbitmq 를 설치할 수 있다. 

 

 

 

2. 실행

/usr/local/opt/rabbitmq/sbin/rabbitmq-server

명령어 입력 후 server를 실행시킬 수 있다. 

 

 

기본 포트는 15672 이다. 

 

서버 실행 후 localhost에 접속하면 위 사진처럼 RabbitMQ 로그인 화면이 나타난다. 

 

초기 Username 및 Password 는 guest/guest 로 접속할 수 있고 후에 설정을 통해 변경할 수 있다. 

 

 

접속 시 나타나는 화면.

 

 

위 화면에서 직접 Exchange / Queue 를 추가할 수 있지만 Spring과 연동해서 Producer, Consumer를 연동해 보겠습니다. 

 

 

 

3. Producer 모듈 

SpringBoot 2.7.2버전을 사용하였고 Spring에서 RabbitMQ를 사용하기위해 프로젝트 생성 시 RabbitMQ dependency를 찾아 체크해줍니다. 

 

 

application.properties 작성

 

 

포트 및 rabbitmq 접속 정보를 작성합니다. 

 

설정파일 작성 후 실행하면 rabbitmq 가 연결되었다는 문구가 뜹니다. 

 

 

Config 파일 작성

rabbitmq 빈에 필요한 configuration 파일을 작성합니다. 

 

@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;
    
    @Bean
    Queue queue() {
        return new Queue("hello.queue", false);
    }
    
    @Bean
    DirectExchange directExchange() {
        return new DirectExchange("hello.exchange");
    }
    
    @Bean
    Binding binding(DirectExchange directExchange, Queue queue) {
        return BindingBuilder.bind(queue).to(directExchange).with("hello.key");
    }
    
    @Bean
    RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(messageConverter);
        return rabbitTemplate;
    }
    
    @Bean
    ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(host);
        connectionFactory.setPort(port);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        return connectionFactory;
    }
    
    @Bean
    MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

 

위 코드에서는 exchange, queue, key를 각각

 

hello.exchange // hello.queue // hello.key 라고 명칭하였습니다. 

 

Exchange종류에도 여러가지 종류가 있는데 단순 실행 목적이라서 아무렇게나 선택했습니다. (위에서는 DirectExchange)

 

 

 

 

Service 작성

 

Producer라는 클래스를 생성한 후 RabbitTemplate 을 사용해 Exchange에 메세지를 보내도록 작성했습니다. 

 

/send라는 api를 생성해서 테스트해보면 

 

 

rabbitMQ 페이지에 Exchanges 메뉴에 아까 지정했던 exchange가 생성된 걸 볼 수 있고

 

Overview에 메시지 카운트가 +1 되는걸 확인할 수 있습니다. 

Receiver를 통해 생성된 메세지를 Consumer 모듈을 통해 소비합니다.

 

 

 

 

4. Consumer

@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;
    
    @Bean
    MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
    
    @Bean
    SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
        final SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(messageConverter());
        return factory;
    }
    
    @Bean
    ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(host);
        connectionFactory.setPort(port);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        System.out.println("host: "+host);
        return connectionFactory;
    }
}

 

properties 및 configuration 파일 입니다. 

Producer와 달리 특별한 설정은 없고 메세지 컨버터만 설정해 주었습니다. 

 

 

Receiver(Consumer)

Receiver는 아까 생성한 hello.queue에 있는 메세지를 받아 처리하는 서비스입니다. 

 

@RabbitListener 어노테이션을 통해 consumer를 지정할 수 있습니다. 

 

 

실행 후 로그를 확인해 보면 message 가 정상적으로 소비됨을 볼 수 있습니다.