NestJS RabbitMQ 연동하기 - 메시지 브로커로 전환
앞서 Redis를 이용해 서비스 간 메시징을 구현했다면, 이번에는 RabbitMQ를 이용해 더 정교한 메시지 브로커 환경을 구축하는 과정을 살펴보겠습니다.
RabbitMQ는 AMQP 프로토콜을 기반으로 동작하며, 큐 단위로 메시지를 관리할 수 있어 복잡한 마이크로서비스 아키텍처에서도 안정적인 통신을 보장합니다.
1. 라이브러리 추가
RabbitMQ 연동을 위해 다음 패키지를 설치합니다.
pnpm i amqplib amqp-connection-manager
2. Docker 환경 설정
docker-compose.yml에 RabbitMQ 컨테이너를 추가합니다.
services:
rabbitmq:
image: rabbitmq:4
ports:
- "5672:5672" # AMQP 프로토콜 기본 포트
- "15672:15672" # 관리 UI (http://localhost:15672)
???? 15672 포트를 열어두면 브라우저에서 RabbitMQ Management UI에 접속할 수 있습니다. 기본 계정은 guest / guest입니다.
3. main.ts에서 RabbitMQ 연결 설정
이전에는 Transport.REDIS를 사용했지만, 이제는 Transport.RMQ로 변경합니다.
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.connectMicroservice<MicroserviceOptions>({
transport: Transport.RMQ,
options: {
urls: ['amqp://rabbitmq:5672'],
queue: 'order_queue',
queueOptions: {
durable: true,
},
},
});
await app.startAllMicroservices();
}
bootstrap();
여기서 queue 이름은 서비스별로 다르게 지정해야 하며(order_queue, user_queue, payment_queue 등), durable: true 설정은 서버가 재시작되어도 큐가 유지되도록 합니다.
4. AppModule 설정
ClientsModule을 사용해 RabbitMQ 기반 마이크로서비스 클라이언트를 등록합니다.
ClientsModule.registerAsync({
clients: [
{
name: USER_SERVICE,
useFactory: () => ({
transport: Transport.RMQ,
options: {
urls: ['amqp://rabbitmq:5672'],
queue: 'user_queue',
queueOptions: {
durable: true,
},
},
}),
},
{
name: PRODUCT_SERVICE,
useFactory: () => ({
transport: Transport.RMQ,
options: {
urls: ['amqp://rabbitmq:5672'],
queue: 'product_queue',
queueOptions: {
durable: true,
},
},
}),
},
{
name: PAYMENT_SERVICE,
useFactory: () => ({
transport: Transport.RMQ,
options: {
urls: ['amqp://rabbitmq:5672'],
queue: 'payment_queue',
queueOptions: {
durable: true,
},
},
}),
},
],
isGlobal: true,
}),
5. RabbitMQ의 장점
강력한 메시지 라우팅
단순 Pub/Sub이 아니라 Exchange 타입(Direct, Fanout, Topic 등)을 활용해 메시지를 원하는 큐에만 전달할 수 있습니다.내구성 (Durability)
메시지를 디스크에 저장해 서버 장애에도 메시지가 유실되지 않도록 보장합니다.확장성 (Scalability)
여러 Consumer가 동시에 같은 Queue를 구독하여 작업을 분산할 수 있습니다.관리 UI 제공
http://localhost:15672 대시보드를 통해 메시지 흐름, 큐 상태, 바인딩 등을 시각적으로 관리할 수 있습니다.
6. 주의할 점
Queue 이름 충돌: 서비스마다 큐 이름이 고유해야 합니다. (order_queue, product_queue 등)
보안 설정: 운영 환경에서는 guest 계정을 그대로 쓰지 말고 새로운 계정을 만들어야 합니다.
환경 변수 관리: .env에 RabbitMQ 연결 URL을 정의해두고, ConfigService로 불러오는 것이 안전합니다.
RABBITMQ_URL=amqp://rabbitmq:5672
???? 만약 Docker 외부(로컬 PC 툴)에서 직접 접속하려면 amqp://localhost:5672를 사용하면 됩니다.













댓글 ( 0)
댓글 남기기