Nodejs

 

 

마이크로서비스 아키텍처에서 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. 주의할 점

  1. 호스트 네임 문제
    로컬에서 테스트할 때는 localhost 대신 반드시 redis를 사용해야 합니다. (Docker 네트워크 내부에서의 컨테이너 이름)

  2. TCP vs REDIS Transport

    • Transport.TCP: 단순한 서비스 간 요청/응답 패턴에 적합

    • Transport.REDIS: Pub/Sub, 이벤트 기반 메시징에 최적화

  3. 환경 변수 설정
    .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를 활용한 분산 캐시 관리, 이벤트 기반 아키텍처 구현까지 확장할

수 있습니다.

 

 

 

 

about author

PHRASE

Level 60  라이트

장딴지와 정강이에 털이 닳아서 없다. 세상 일에 분주한 것. -장자

댓글 ( 0)

댓글 남기기

작성