Nest.js - Chching

김세겸·2023년 3월 6일
0

NestJS

목록 보기
14/18
post-thumbnail

1. 들어가며

현재 진행중인 프로젝트에서 이메일 인증 기능을 구현 중이다. 이메일 인증 키가 영구적으로 저장되면 DB용량 문제등 여러 부분에서 좋지 않을것이라는 생각이 들어서 특정 시간 동안만 저장을 하고 자동으로 삭제 되게 하기 위해서 캐시를 사용 해보고자 한다.

처음에는 Redis를 사용하고자 했지만, 서버의 스펙과 그렇게 많은 캐시 정보가 필요하지 않을듯 싶어 Nest 자체의 캐시 메니저를 사용해서 구현해 보고자 한다.

2. 적용

1. 설치

$ npm install cache-manager

2. 등록

import { CacheModule, Module } from '@nestjs/common';
import { AppController } from './app.controller';

@Module({
  imports: [CacheModule.register({
  	isGlobal: true, // 전역으로 사용가능
    ttl: 5, // 디폴트 만료시간
  	max: 10, // 최대 등록가능 개수
  })],
  controllers: [AppController],
})
export class AppModule {}

3. 의존성 주입

constructor(@Inject(CACHE_MANAGER) private cacheManager: Cache) {}

다른 프로바이더, 컨트롤러에서 의존성을 주입받아 사용가능

4. 사용방법

// 값 가져오기
const value = await this.cacheManager.get('key');

// 값 등록하기 - 기본 만료시간은 5초
await this.cacheManager.set('key', 'value');

// 만료시간 설정하여 등록하기
await this.cacheManager.set('key', 'value', 1000);

// 만료시간 비활성화 하여 등록하기
await this.cacheManager.set('key', 'value', 0);

// 키 값으로 등록된 값 제거하기
await this.cacheManager.del('key');

// 모든 캐시 제거하기
await this.cacheManager.reset();

3. cacheIntercepter

인터셉터를 사용하여 특정 라우트로 들어오는 요청에대한 예외 처리가 가능하다.

import { CacheModule, Module, CacheInterceptor } from '@nestjs/common';
import { AppController } from './app.controller';
import { APP_INTERCEPTOR } from '@nestjs/core';

@Module({
  imports: [CacheModule.register()],
  controllers: [AppController],
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: CacheInterceptor,
    },
  ],
})
export class AppModule {}

CacheInterceptor 구현 코드를 보았을 때 trackBy 함수가 실행 컨택스트를 받아서 엔드포인트 값을 키로 가지는 cache를 등록 해준다.
즉, CacheInterceptor를 상속받는 클래스를 생성하고 trackBy 함수를 수정한다면 내가 원하는 내용만 저장 하는 cacheIntercepter를 만들 수 있다.

4. 참고

[NestJS] REST API에 캐시
Nestjs REST 애플리케이션의 캐시 처리와 캐시 무효화
NestJS Custom Caching Decorator 만들기
nestjs/github

0개의 댓글