[RabbitMQ] - 2. Spring boot로 RabbitMQ 사용하기(hello world!)

[RabbitMQ] - 2. Spring boot로 RabbitMQ 사용하기(hello world!)

개요

스프링 공화국의 자바 왕자님을 모시는 충신으로써 오늘은 스프링 부트를 사용해서 RabbitMQ 공식 사이트의 첫 번째 예제 프로젝트, hello world!를 진행하려고 합니다.

RabbitMQ를 설치한 것을 전제로 진행합니다.

https://primayy.tistory.com/74

아직 설치하지 않았다면 위 링크부터 차근차근 진행합시다!

RabbitMQ 핵심부터 알자!

RabbitMQ 핵심!

RabbitMQ 예제를 작성하기 전에 우선 위 이미지가 무얼 의미하는지 알아봅시다.

위 이미지에는 P, C로 이루어진 타원과 다수의 직사각형으로 이루어진 덩어리가 존재합니다.

구조만 보자면 P가 직사각형을 보내면 직사각형 덩어리에 저장되고 그 덩어리에 저장된 직사각형을 다시 C가 전달받는 구조로 보입니다.

RabbitMQ에서는 P를 Producer, C를 Consumer 그리고 직사각형 하나를 message, 직사각형들로 이루어진 덩어리를 Queue라고 합니다.

Producer는 메시지를 produce(생산)하는 주체입니다. produce는 생산보다는 메시지를 전송한다는 의미로 생각하면 쉽습니다.

Consumer는 메시지를 consume(소모)하는 주체이고 consume은 반대로 메시지를 전달받는다라고 생각하면 되겠습니다.

Queue는 RabbitMQ내에 메시지들이 저장되는 공간입니다. 호스트의 메모리, 디스크에 바인딩되어 있습니다.

실제 세상과 비교하자면 RabbitMQ는 우체국과도 굉장히 비슷합니다.

편지를 써서 우편함에 넣으면 각 우편함에 존재하는 우편들이 분류되어서 목적지로 전달되는 것처럼 P(우편을 보내는 사람)가 메시지를 보내면 Queue(우편함)에 넣어지고 메시지(우편)는 C(우편을 받는 사람)에게 전달됩니다.

그리고 실제로도 우체국에서 P와 C가 같은 사람일 필요가 없는 것처럼, RabbitMQ의 Producer와 Consumer도 마찬가지입니다.

같은 호스트 내에서 Producer, Consumer를 구성할 수도 있지만, 다른 호스트로 구성하여 메시지를 보낼 수도 있습니다.

다른 호스트로 구성하는 예시는 Hello World 예제부터 작성해보고 나중에 진행해보도록 하겠습니다.

RabbitMQ로 Hello World!

첫번째로 RabbitMQ를 사용해볼 프로젝트는 Producer가 Hello World라는 메시지를 1초에 1개씩 produce하고 Consumer가 consume해서 메시지를 로그로 남기는겁니다.

실습을 진행하기 위해 우선 스프링부트로 RabbitMQ를 사용할 수 있는 프로젝트를 만들어봅시다.

저는 빌드 관리도구는 maven, 언어는 java 왕자님을 사용하겠습니다.

https://start.spring.io/ 에 접속하셔서 spring for RabbitMQ를 추가하고 하단에 generate를 눌러서 프로젝트를 다운로드합시다.

그리고 resources 패키지를 열어서 application.properties를 야무지게 삭제하고 application.yml을 추가해주세요.

저는 yaml을 선호하기 때문이에요.

다음과 같이 rabbitmq 설정을 추가하는걸로 rabbitmq 서버와 연결하는걸 간단하게 끝낼 수 있습니다.

더욱 자세한 설정을 원한다면 rabbitmq 설정을 위한 configuration 빈을 추가해서 설정할 수 있지만, 이번 단계에서는 넘어가도록 하겠습니다.

spring: rabbitmq: host: # 호스트 아이피 - localhost port: # 포트 기본은 5672 username: # 아이디 password: # 비밀번호 virtual-host: # vhost가 있다면 설정

연결할 서버 설정을 모두 마쳤으니 이제 저희가 구성해야 할 것은 3가지 남았습니다.

Queue, Producer, Consumer!

저는 Queue부터 생성하고 Consumer, Producer를 차례대로 작성해보려고 합니다.

Queue 생성

queue는 gui로 추가해봅시다.

http://localhost:15672에 접속해서 queue 탭으로 이동해주세요.

그리고 hello라는 queue를 추가해봅시다.

위 이미지처럼 큐의 이름을 정한뒤 add queue 버튼을 클릭하면 queue가 생성됩니다.

이제 hello queue로 보내는 메시지는 모두 여기로 저장되고 consume 할 수 있겠네요.

Consumer 추가

다음으로 consumer를 작성해봅시다.

package com.example.demo.messaging; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @Component public class Consumer { private static final Logger log = LoggerFactory.getLogger(Consumer.class); // hello 큐의 메시지가 컨슘되는지 확인하기위해 로그 추가 @RabbitListener(queues = "hello") public void consume(Message message){ log.info("consumer consumes message: {}",message); } }

Consumer를 작성하는건 굉장히 쉽습니다. @RabbitListener 어노테이션을 추가해서 사용할 queue를 설정해주면 되기 때문이죠.

queues라는 네이밍을 보아 짐작할 수 있듯이, queue는 리스트 형식으로 여러개 입력할 수도 있습니다. ex) queues={"hello","world"}

queues에 추가한 큐가 rabbitmq 서버에 존재하지 않으면 콘솔에 오류 메시지가 출력되니 큐가 존재하는지 꼭 확인해주세요.

자 이 상태로 서버를 실행시켜봅시다

콘솔에 이렇게 출력된다면 저희가 실행시켜놓은 rabbitmq 서버와 정상적으로 연결된 것입니다.

그리고 gui 페이지로 이동해서 connections 탭을 보면 연결된 서버가 목록에 추가된 걸 확인할 수 있습니다.

서버도 잘 붙었으니 큐로 메시지를 보냈을 때, Consumer가 잘 받는지 확인해봅시다.

Queues탭으로 이동해서 메시지를 Publish(Produce)해주세요.

payload는 hello world로 작성해봅시다.

메시지를 전송하고 다시 콘솔로 돌아오면 다음과 같이 메시지가 컨슘된 로그를 확인할 수 있습니다.

hello world!

여기까지 왔다면 Consumer를 추가하는 것까지 완료했습니다.

남은건 gui로 produce한 메시지를 자바 코드로 작성하는겁니다.

Producer 추가

package com.example.demo.messaging; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class Producer { private static final Logger log = LoggerFactory.getLogger(Producer.class); @Autowired RabbitTemplate rabbitTemplate; @Scheduled(fixedDelay = 1000, initialDelay = 500) public void sendMessage(){ rabbitTemplate.convertAndSend("hello", "hello world"); } }

producer는 RabbitTemplate 빈을 주입해서 사용하도록 작성했습니다.

그리고 메시지를 produce하는 sendMessage 메소드에 @Scheduled 어노테이션을 추가했는데 이는 메시지를 1초 간격으로 큐로 전송하면서 컨슘되는것을 확인하기 위함입니다.

@Scheduled 어노테이션이 제대로 스케줄링 되기 위해서는 main 메소드가 정의된 클래스에 @EnableScheduling을 추가해줘야합니다.

package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @EnableScheduling public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }

이 상태로 어플리케이션을 실행시켜봅시다.

어플리케이션을 실행시킨 상태로 gui 관리 페이지에서 hello큐를 보면 초당 1개의 메시지가 publish되는 것을 볼 수 있고 consumer가 소모하는 것을 알 수 있습니다.

콘솔을 확인해보면 컨슈머도 메시지를 전달받고 로그에 출력하는 것을 확인할 수 있네요.

오늘은 spring boot로 RabbitMQ를 사용해서 producer, consumer를 구성하고 메시지를 produce, consume하는 방법을 알아봤습니다.

다음에는 다수의 consumer를 구성하고 consumer가 여러개일 때는 큐에 있는 메시지를 어떻게 소모하는지 알아보도록 하겠습니다.

안뇽~

728x90

from http://primayy.tistory.com/76 by ccl(A) rewrite - 2021-12-01 00:01:06