개발 공부/NestJS

인 메모리 데이터베이스, Redis (2편)

게으른 제이 2023. 3. 26. 17:55

프로젝트에 Nest CLI를 사용해 레디스 모듈을 생성합니다.

 

$ nest g mo redis

 

그리고 모듈에 캐시 모듈을 동적으로 주입 합니다.

 

import { CacheModule, Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import * as redisStore from 'cache-manager-redis-store';

@Module({
  imports: [
    CacheModule.registerAsync({
      imports: [ConfigModule],
      inject: [ConfigService],
      useFactory: async (configService: ConfigService) => ({
        store: redisStore,
        host: configService.get('REDIS_HOST'),
        port: configService.get('REDIS_PORT'),
        ttl: configService.get('REDIS_TTL'),
      }),
      isGlobal: true,
    }),
  ],
})
export class RedisModule {}

 

이제 레디스를 사용할 준비가 완료 되었습니다.

 

레디스를 따로 레포지토리 레이어로 구현해도 되지만, 필요한 서비스에 캐시 매니저를 주입해서 사용해도 됩니다.

 

캐싱이 필요한 서비스 레이어에 캐시 매니저를 주입합니다.

import { Cache } from 'cache-manager';


@Injectable()
export class AuthService {
  constructor(
	...
    @Inject(CACHE_MANAGER) private cacheManager: Cache,
  ) {}

 

간단한 회원 정보 로직입니다.

 

회원 로그인 시 패스워드 일치 여부를 확인하고, 캐싱되어 있는 정보가 있는지 확인한 후 캐싱 되어 있다면 캐싱된 정보를 보내주고 아니라면 캐싱 후 회원 정보를 보내줍니다.

const cacheData = await this.cacheManager.get(user.id);

if (isMatch && cacheData) return cacheData;
if (isMatch && !cacheData) {
  await this.cacheManager.set(user.id, user);
  return user;
}