Springboot + RabbitMQ 연동해서 간단하게 사용해보기
먼저 RabbitMQ 를 깔아볼게요.
내 Mac에 설치해도 되지만, 저는 그게 싫어서 docker로 RabbitMQ를 관리해볼게요.
1.Mac에서 설치할 경우
brew update
brew install rabbitmq
Homebrew를 이용하여 간단하게 설치가 가능합니다.
2.docker에서 설치할 경우
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 --restart=unless-stopped -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=root rabbitmq:management
설치가 되었고 rabbitMQ는 기본포트가 15672 입니다.
http://localhost:15672 접속하시면
이렇게 메인페이지가 뜰거에요.
처음 rabbitMQ를 시작하셨으면, 기본적인 아이디와 비밀번호가 주어집니다.
Username : guest
Password : guest
로 접속합니다.
이런식으로 접속이 되었나요?
기본적으로 제공되는 guest계정말고 개인 계정을 만들어 봅시다.
우선 오른쪽 메뉴를 보시면 Virtual Hosts 라는 메뉴가 보입니다.
여기서 Name 항목에 virtual host 가상 호스트를 생성합니다. (저는 youngVH 라는 이름으로 가상 호스트를 생성하였습니다.)
그리고 Admin 탭으로 가서 원하는 이름으로 계정을 만들어줍니다. (Tags 도 필수입니다.)
이렇게 하고 Add user 버튼을 클릭하면 access refused 라는 문구와 함께 접근이 거절됐다고 경고창이 뜨네요.
저희는 docker 로 rabbitMQ 를 띄어놨기 때문에 도커 컨테이너 내부에 접속을 합시다.
docker exec -it <container Id> /bin/bash 로 접속하시면됩니다.
rabbitmqctl set_permissions -p "youngVH" "young" ".*" ".*" ".*"
Visual Host 가 youngVH 인 young 계정에 모든 권한을 위임하겠다. 라는 뜻입니다.
설정이 되었다면 docker rabbitMq를 다시 실행 해줍시다.
그리고 다시 위에 화면으로 돌아가 Add User 를 하게 되면 정상적으로 추가가 됩니다.
이제 계정도 완료 되었으니, 코드를 짜보러 갈까요?
일단 그전에 RabbitMQ 구조에 대해 간단하게 집고 넘어가겠습니다.
RabbitMQ는
Producer : 메세지를 생산하여 전송하는 역할
Cosumer : 메세지를 전달받는 역할
message : 말그대로 전송되어지는 메세지 그 자체
Queue : 메세지들이 저장되는 공간
이 네가지를 기본적으로 알고 있으시면 됩니다.
먼저 application.yml 에서
spring:
rabbitmq:
host: <rabbitmq 띄운서버>
port: <rabbitmq 설정한 포트>
username: <아이디>
password: <비밀번호>
virtual-host: <가상호스트이름>
RabbitMQ 연동을 위한 설정들을 입력 해 줍니다.
다시 RabbitMQ GUI 로 돌아가서 queue 를 만들어 봅시다. (메세지를 저장할 공간을 생성해야하기 때문)
저는 이런식으로 만들었습니다. (*참고해서 만드세요)
작성을 다 하셨으면 Add queue 버튼을 클릭하시면 queue 생성이 완료 됩니다.
Cosumer 작성 (메세지를 전달받는 역할)
@Component
@Slf4j
public class Consumer {
@RabbitListener(queues = "hello")
public void consume(Message message){
log.info("message : {}",message);
}
}
위에 @RabbitListener가 핵심입니다.
queues = "hello" (아까 GUI 에서 만들어줬던 queue 네임과 동일합니다.)
queue = hello 로 메세지를 다 받겠다 라는 뜻입니다.
서버 실행 시켜볼까요?
그리고 다시 GUI로 가서 테스트로 메세지를 보내봅시다.
Queues 목록에 생성해논 hello를 클릭합니다.
그러면 이런 화면이 열리고 payLoad 에 hello world 라는 문구를 작성 후 publish message 버튼을 눌러 줍시다.
로그가 찍혀있네요.
정상적으로 메세지를 잘 전달받은겁니다.
방금 저희는 GUI 로 Producer 역할을 하였고, 자바로 Producer 역할을 코드로 작성해봅시다.
@Component
@Slf4j
@RequiredArgsConstructor
public class Producer {
private final RabbitTemplate rabbitTemplate;
@Scheduled(fixedDelay = 1000, initialDelay = 500)
public void sendMessage() {
rabbitTemplate.convertAndSend("hello", "hello world");
}
}
스케줄러를 돌려 1초 간격으로 메세지를 전송하도록 해보겠습니다.
그전에! 스케줄러를 돌리기 위해
@EnableScheduling 아시죠?ㅋㅋ
자 이제 다 끝났습니다.
서버를 돌려보죠.
로그에 1초마다 정상적으로 메세지 수신했다는 로그와 함께 GUI 를 확인해보시면 그래프가 일정 초 간격으로 변화가 일어나고 있습니다.
지금까지 springboot와 rabbitMQ 를 연동해보고 간단하게 테스트해보았습니다.
감사합니다.
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.