마이크로서비스 아키텍처에서 Redis는 필수적인 구성 요소로 자리 잡고 있습니다. 캐시 서버로서의 역할뿐만 아니라, Pub/Sub 기반 메시지 브로커로서 서비스 간 통신을 원활하게 해주기 때문입니다.
1. Docker 환경 설정
ioredis 라이브러리 설치
pnpm i ioredis
먼저 docker-compose.yml에 Redis 컨테이너를 추가합니다. 다른 마이크로서비스(Postgres, Mongo, User, Product, Order 등)와 함께 실행됩니다.
diservices:
redis:
image: redis:7
Redis는 별도 설정 없이 6379 포트로 실행되며, 다른 서비스에서 redis라는 호스트 네임으로 접근할 수 있습니다.
2. NestJS AppModule에서 Redis 설정
AppModule에서는 ClientsModule을 통해 Redis를 사용하는 마이크로서비스 클라이언트를 등록합니다.
ClientsModule.registerAsync({
clients: [
{
name: USER_SERVICE,
useFactory: (configService: ConfigService) => ({
transport: Transport.TCP,
options: {
host: 'redis',
port: 6379,
},
}),
inject: [ConfigService],
},
{
name: PRODUCT_SERVICE,
useFactory: (configService: ConfigService) => ({
transport: Transport.TCP,
options: {
host: 'redis',
port: 6379,
},
}),
inject: [ConfigService],
},
{
name: ORDER_SERVICE,
useFactory: (configService: ConfigService) => ({
transport: Transport.TCP,
options: {
host: 'redis',
port: 6379,
},
}),
inject: [ConfigService],
},
],
isGlobal: true,
}),
???? 여기서 Transport.TCP 대신 **Transport.REDIS**를 사용할 수도 있습니다. TCP는 단순한 소켓 통신, REDIS는 Pub/Sub 기반 메시징을 지원합니다.
TIP: Redis를 메시지 브로커로 사용할 때는 Transport.REDIS를 사용하는 것이 권장됩니다.
3. 메인 엔트리포인트 설정 (main.ts)
main.ts에서 NestJS 애플리케이션이 Redis 마이크로서비스에 연결되도록 설정합니다.
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.REDIS,
options: {
host: 'redis',
port: 6379,
},
});
await app.startAllMicroservices();
}
bootstrap();
이 설정으로 인해 해당 애플리케이션은 Redis를 통해 메시지를 송수신할 수 있습니다.
4. Redis를 이용한 서비스 간 통신 구조
Gateway → 클라이언트의 요청을 받아 적절한 서비스(User, Product, Order 등)로 전달.
User/Product/Order 서비스 → 각각 Redis를 통해 메시지를 주고받음.
Notification 서비스 → 특정 이벤트 발생 시 Redis Pub/Sub을 활용해 알림 처리.
Redis는 메시지 큐(Message Queue)처럼 동작하여 서비스 간의 비동기 통신을 보장합니다.
5. 주의할 점
호스트 네임 문제
로컬에서 테스트할 때는 localhost 대신 반드시 redis를 사용해야 합니다. (Docker 네트워크 내부에서의 컨테이너 이름)TCP vs REDIS Transport
Transport.TCP: 단순한 서비스 간 요청/응답 패턴에 적합
Transport.REDIS: Pub/Sub, 이벤트 기반 메시징에 최적화
환경 변수 설정
.env 파일에 Redis 연결 정보를 넣어 관리하는 것이 좋습니다.
REDIS_HOST=redis REDIS_PORT=6379
6. Another Redis Desktop Manager(RDM)으로 접속하기
NestJS와 Docker로 띄운 Redis를 윈도우 환경에서 Another Redis Desktop Manager로 접속하려면 다음과 같이 입력합니다.
Host: localhost (윈도우에서 접속 시) / redis (컨테이너 내부 접속 시)
Port: 6379
Password: 없음 (현재 설정 없음 → 빈칸)
Username: 없음 (Redis 기본값, ACL 설정 안 되어 있음)
Separator: 기본값 : 유지
⚠️ 다만 현재 docker-compose.yml에는 Redis의 포트 매핑(ports)이 없습니다. 따라서 외부 툴에서 접속하려면 다음 설정을 추가해야 합니다:
redis:
image: redis:7
ports:
- "6379:6379"
그리고 보안을 위해 운영 환경에서는 반드시 비밀번호를 설정하세요:
redis:
image: redis:7
command: ["redis-server", "--requirepass", "비밀번호1234"]
ports:
- "6379:6379"
이제 RDM에서 접속할 때:
Host: localhost
Port: 6379
Password: 비밀번호1234
Username: (빈칸)
Separator: :
이렇게 입력하면 정상적으로 접속 가능합니다.
7. 마무리
이번 정리에서는 NestJS와 Redis를 연동하는 방법을 살펴봤습니다. Redis는 단순한 캐시 저장소가 아니라, 서비스 간 메시지 브로커로도 활용할 수 있기 때문에 마이크로서비스 환경에서 매우 중요한 역할을 합니다.
추가로, Redis UI 툴인 RDM을 통해 데이터 구조를 눈으로 확인하면 디버깅이나 운영 관리에 큰 도움이 됩니다. 앞으로는 Redis를 활용한 분산 캐시 관리, 이벤트 기반 아키텍처 구현까지 확장할
수 있습니다.













댓글 ( 0)
댓글 남기기