배꼽파지 않도록 잘 개발해요

[Redis] Redis 클라이언트는 기본적으로 로컬 Redis 서버에 연결됨 본문

BackEnd/Database

[Redis] Redis 클라이언트는 기본적으로 로컬 Redis 서버에 연결됨

꼽파 2024. 9. 10. 19:25

현재 프로젝트의 NestJS 서버에서는 Redis를 사용하고 있다.
다른 백엔드 개발자분의 브랜치를 dev에 merge를 하고, 그걸 현재 내가 작업하는 브랜치에 merge를 하였다.
Conflict가 나서 코드는 해결하였으나, 실행할 때 다음과 같은 오류가 났다.

로컬에서 6379 포트로 Redis가 접속이 되지 않는다는 오류가 떴다.

그런데 나는 분명히 로컬에서 Redis를 연결하여 사용한 적이 없다. Redis Cloud에서 받은 Host, Port, Password를 입력하여 Redis Module을 만들어 사용하였기 때문이다.

 

가장 최근에 변경된 posts.service.ts 코드를 확인해보니 Redis Client를 생성할 때 어떠한 인자도 넣지 않고 있었다.

this.redis = new Redis(); 코드로 생성된 Redis 클라이언트는 기본적으로 로컬 Redis 서버에 연결된다.

ioredis 라이브러리를 사용할 때, Redis 클라이언트를 생성할 때 아무런 매개변수를 전달하지 않으면 기본적으로 localhost의 Redis 서버에 연결한다.

그래서 내 컴퓨터에는 로컬에서 Redis를 접속하여 쓰지 않기 떄문에 연결이 안 된다는 오류가 났던 것이다.

 

현재 우리 서버에서는 Redis Module을 만들어 사용하고 있다.

import { Module, Global } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import Redis from 'ioredis';
import { IRedisOptions } from './interfaces';

@Global()
@Module({
  imports: [ConfigModule],
  providers: [
    {
      provide: 'REDIS_CLIENT',
      useFactory: (configService: ConfigService) => {
        const host = configService.get<string>('REDIS_HOST');
        const port = configService.get<number>('REDIS_PORT');
        const password = configService.get<string>('REDIS_PASSWORD');

        const redisOptions: IRedisOptions = {
          host,
          port,
          password,
        };

        return new Redis(redisOptions);
      },
      inject: [ConfigService],
    },
  ],
  exports: ['REDIS_CLIENT'],
})
export class RedisModule {}

NestJS에서 Redis 클라이언트를 전역적으로 등록한 후, 서비스에서 의존성으로 주입받는 방식으로 사용하고 있다.

 

그래서 이 코드를 수정해주었다.

실행이 정상적으로 잘 되었다.

728x90