2024년 3월 22일에 작성되었고, 블로그를 이전하며 옮겨온 포스트입니다.
여기에서 원본을 확인할 수 있습니다.
RabbitMQ를 도입하게 된 배경
현재 개발 중인 사이드 프로젝트에서 회원가입을 진행할 때 이메일 인증 기능이 사용된다. 인증번호를 담은 메일을 발송하는 API에 요청을 보내면, 응답시간이 상당히 길게 소요된다. 대충 얼마나 소요되냐면..

정확하게 4.68초, 약 5초 정도 소요된다. 이메일 요청을 보내게 되면, 아래와 같은 로직을 수행하게 된다.
- 이메일 정규식에 일치하는가?
- 이미 서비스에 등록된 회원이 있는가?
- 이전 이메일 인증 요청을 발송한 후 1분이 경과되었는가? (Redis 사용)
- 새 이메일 인증 번호 생성
- 이메일 인증 번호를 담은 템플릿 생성
- 메일 발송
이 과정을 수행해야 사용자가 입력한 메일로 인증 메일이 발송된다. 근데 문득 생각이 들었다.
이메일 인증 번호를 담은 메일이 발송되는 과정을 사용자가 기다려야 할 필요가 있을까?
사용자 입장에서 이메일 인증 번호를 입력 란에 넣고 인증을 완료하는 단계까지 정리해 보았다.
- 이메일 입력 란에 이메일 주소를 적음
- 이메일 인증 번호 발송 버튼을 누름
- 발송 요청이 완료될 때까지 기다림 (5초..)
- 이메일을 확인하러 이동함
- 이메일에서 인증번호를 확인함
- 이메일 인증번호 입력
- 이메일 인증번호 검증
이 정도인데, 어차피 이메일 인증 요청 버튼을 누르고, 이메일을 확인하러 다른 웹 페이지로 이동하는 시간이 있다. 그냥 정리하면, 굳이 이메일이 지금 발송되었어요!를 알릴 필요가 없고, 인증 번호를 담은 이메일 발송이 요청되었어요! 정도면 충분한 것이다.
이메일 요청을 보내는 로직 중에 제일 시간이 많이 소요되는 것이, 마지막 단계인 6번(메일 발송) 과정이다. 그래서 아래와 같이 로직을 변경하고 싶었다.
- 이메일 정규식에 일치하는가?
- 이미 서비스에 등록된 회원이 있는가?
- 이전 이메일 인증 요청을 발송한 후 1분이 경과되었는가? (Redis 사용)
- 메일 발송 요청
이렇게만 하면 메일 발송에 제일 시간을 많이 잡아먹는 과정을 싹 없앨 수 있다. (없애기 보다는 사용자 몰래 처리하는 것이 더 정확할 수도?) 그래서 이 로직을 구현할 방법을 강구해 보았는데, 이 과정에서 찾은 방법이 RabbitMQ를 사용하는 것이다.
RabbitMQ란?
AMQP(Advanced Message Queuing Protocol)를 구현한 오픈 소스 메시지 브로커이다. Producers에서 Consumers로 메시지(요청)를 전달할 때 중간에서 브로커 역할을 수행한다. 이를 사용하는 케이스는 다음과 같다.
- 요청을 많은 사용자에게 전달할 때
- 요청에 대한 처리 시간이 길 때
- 많은 작업이 요청되어 순차적으로 처리를 해야할 때
AMQP(Advanced Message Queing Protocol)란?
메시지 지향 미들웨어(Message Oriented Middleware: MOM) 시스템 간 통신을 위한 개방형 네트워크 프로토콜이다.
AMQP의 개념
AMQP는 Queue, Exchange, Binding 이 세 개념으로 구성된다.
Queue
- 메시지를 수신하고 처리를 대기하는 대기열
- 큐는 메시지를 안전하게 저장하고, 필요에 따라 소비자에게 전달
Exchange
- Producer가 메시지를 큐로 보내기 위한 진입점
- 바인딩 규칙에 따라 어떤 큐에게 메시지를 전달할지 결정
Binding
- Exchange와 Queue 간 연결을 나타냄
- 메시지가 어떤 큐로 전달되어야 하는지 결정
왜 사용하는가?
한 대규모 서비스가 있으면, 여러 서버를 구성하고 서로 상호 작용하는 방식으로 서비스를 구성하게 된다. 이 방식이 MSA(Micro Service Architecture) 방식이다. 이런 상황에서 서버들은 서로 정보를 주고 받아야 하는 상황이 발생된다. 일반적인 HTTP 통신을 이용해 요청을 보내면 응답을 받을 때까지 요청을 보낸 서버의 수행이 중단되게 된다. 이렇게 되면 여러 서버에 동시에 정보를 전달하기 어려워 지기 때문에 이런 상황에서 AMQP를 이용한다. 이를 이용하면 Message Brokder라는 미들웨어를 활용해 비동기식으로 메시지를 전달한다.
RabbitMQ 필수 개념 & 아키텍쳐

- Producer: 요청을 보내는 주체, 보내고자 하는 메시지를 Exchange에 Publish (Producer는 Queue에 직접 접근 X, 항상 Exchange를 통해 접근)
- Exchange: Producer에게 전달받은 메시지들을 어떤 Queue에게 발송할지 결정 후 Binding
- Binding: Exchange와 Queue의 관계.
- Queue: Consumer가 메시지를 consume하기 전까지 보관하는 장소
- Consumer: Producer로 부터 전달된 메시지를 Queue로부터 메시지를 받아 처리하는 주체
RabbitMQ 도입하기
로컬에 설치하여 RabbitMQ를 사용할 수도 있지만, 간단하게 CloudAMQP라는 사이트에서 회원가입만 진행하여 사용할 수 있다! 나는 CloudAMQP 사이트를 이용했고, Spring Boot를 사용하여 개발하였다. 이 글에서 코드를 이용한 개발 과정은 담지 않았고, 여기를 참고하여 개발을 진행하였다. 코드에 관련해서는 다음 글에서 다뤄보도록 하겠다.

RabbitMQ의 아키텍쳐처럼 위 사진과 같이 로직을 구현하였다. 사진에 있는 순서에 따르면,
- 인증 번호 요청: 사용자가 이메일을 입력하고, 인증 번호를 요청한다.
1-2. 모든 조건(이메일 정규식 일치, 서비스 회원 등록되지 않은 사용자, 이전 이메일 발송 후 1분 경과) 만족 시 사용자에게 200 OK 즉시 응답. - Producer(요청을 보내는 주체)가 이메일 발송 종류, 이메일 주소를 담은 메시지를 Exchange에 publish
- Exchange는 Producer로부터 전달 받은 메시지를 Queue로 bound
- Consumer는 Queue에 있는 메시지를 consume
- 전달 받은 메시지(이메일 종류, 이메일 주소)에 따라 메일 발송 프로세스 진행
위 사진대로 개발을 진행하고, 인증 번호 이메일 발송 API를 요청하면 아래와 같이 처리된다.
2024-03-22 01:48:51.216 INFO 61657 --- [nio-8080-exec-2] c.k.k.d.m.service.Impl.MailServiceImpl : Email Request Successful: {"mailType":"REGISTER_VERIFY","email":"*****@naver.com"}
2024-03-22 01:48:51.276 INFO 61657 --- [ntContainer#0-1] c.k.k.domain.mail.task.MailTaskReceiver : Task received: {"mailType":"REGISTER_VERIFY","email":"*****@naver.com"}
2024-03-22 01:48:57.053 INFO 61657 --- [ntContainer#0-1] c.k.k.d.m.service.Impl.MailServiceImpl : Email Send Successful
2024-03-22 01:48:57.054 INFO 61657 --- [ntContainer#0-1] c.k.k.domain.mail.task.MailTaskReceiver : Task Process Complete
정리하면 다음과 같다.
// 이메일 발송 요청 성공
Email Request Successful: {"mailType":"REGISTER_VERIFY","email":"*****@naver.com"}
// Queue로부터 작업(메시지)을 전달 받음
Task received: {"mailType":"REGISTER_VERIFY","email":"*****@naver.com"}
// 이메일 전송 프로세스 완료
Email Send Successful
// 작업 완료
Task Process Complete
결과 및 정리
RabbitMQ 적용이 끝나고, 회원가입 인증 번호 요청 단계는 다음과 같이 정리되었다.
사용자 입장
- 이메일 정규식에 일치하는가?
- 이미 서비스에 등록된 회원이 있는가?
- 이전 이메일 인증 요청을 발송한 후 1분이 경과되었는가? (Redis 사용)
- 메일 발송 요청 -> 200 OK
그 후 비동기 처리
- Queue로부터 요청(메시지)를 받아옴
- 인증 번호(난수)를 생성
- 이메일 종류에 따라 인증 번호를 담은 템플릿 생성
- 이메일 발송

RabbitMQ를 사용하여 회원가입 인증 번호 요청 과정을 비동기 방식으로 처리한 결과. 위 사진과 같이 응답 시간이 254.01ms로.. 기존(4. 68초, 4,680ms)에 비해 18분의 1 수준으로 응답 시간이 줄어들은 것을 확인할 수 있다. 이로 인해 전체 시스템의 응답성이 향상되고 사용자 경험을 개선할 수 있었다.
레퍼런스 정리
- https://medium.com/@chungkhanhduy/create-work-s-queue-with-spring-and-rabbitmq-978cad149672
- https://velog.io/@sdb016/RabbitMQ-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90
- https://velog.io/@black_han26/AMQPAdvanced-Message-Queuing-Protocol
- https://yoonbing9.tistory.com/129
- https://develop-writing.tistory.com/79
- https://stackoverflow.com/questions/72248024/switching-to-cloudamqp-gives-com-rabbitmq-client-shutdownsignalexception
'Backend > Java' 카테고리의 다른 글
| Spring Boot와 ELK를 활용한 서비스 로그 수집 및 모니터링 (0) | 2026.08.22 |
|---|---|
| Spring Boot에서 CORS 설정 시 addCorsMappings 에러 (0) | 2026.08.22 |
| [오류 해결] SQL ERROR 1406: Data too long for column at row 1 (0) | 2026.08.22 |
| Spring, 테스트 코드는 왜 작성할까? (0) | 2026.08.22 |
| Spring Boot에서 ChatGPT 활용하기 #2: API로 GPT 응답 값 가져오기 (0) | 2026.08.22 |