-
Nest CacheTodayILearned/TILWIL 2022. 9. 28. 02:29
Cache
- 최근에 요청된 데이터가 금방 다시 요청 될 가능성이 높을 때 캐시에 저장한다
- DB에 접근하여 데이터를 가져오는 것 보다 빠름
Nest cache
- Nest.js에서 자체적으로 캐싱을 제공하고있다.
- 캐시 인터셉터에 대한 코드는 nest.js 레포지토리에서 제공하고있다.
- 캐싱된 데이터는 기본적으로 서버의 메모리 내에 저장된다. (로컬캐시)
- 로드밸런서가 요청을 분산하는 경우, 동일한 요청이 다른 노드로 이동하면서 캐시 누락이 될 수 있음
- 공식문서에 따르면 Nest.js의 캐시를 사용하다가 Redis와 같은 인메모리 DB로도 쉽게 마이그레이션 가능한 것 같다.
Cache interceptor code
@Injectable() export class CacheInterceptor implements NestInterceptor { @Optional() @Inject(HTTP_ADAPTER_HOST) protected readonly httpAdapterHost: HttpAdapterHost; protected allowedMethods = ['GET']; constructor( @Inject(CACHE_MANAGER) protected readonly cacheManager: any, @Inject(REFLECTOR) protected readonly reflector: any, ) {} async intercept( context: ExecutionContext, next: CallHandler, ): Promise<Observable<any>> { // 캐시처리할 수 있는 요청인지 확인 const key = this.trackBy(context); // ttl 확인 const ttlValueOrFactory = this.reflector.get(CACHE_TTL_METADATA, context.getHandler()) ?? null; if (!key) { // key 생성이 안되었을 때, 비즈니스 로직으로 돌아간다. return next.handle(); } try { // 캐시된 데이터를 검색, 없으면 null을 리턴 const value = await this.cacheManager.get(key); if (!isNil(value)) { // 캐시된 데이터가 있는 경우, 해당 데이터 리턴 return of(value); } // 캐시된 데이터가 없는 경우, 캐시 데이터를 추가한다. const ttl = isFunction(ttlValueOrFactory) ? await ttlValueOrFactory(context) : ttlValueOrFactory; return next.handle().pipe( tap(response => { // ttl을 수동으로 지정하거나 기본값인 5초로 지정할 수 있음 const args = isNil(ttl) ? [key, response] : [key, response, { ttl }]; // 캐시에 데이터를 추가 this.cacheManager.set(...args); }), ); } catch { return next.handle(); } }
참고한 글
https://docs.nestjs.com/techniques/caching#different-stores
https://hwasurr.io/nestjs/caching/
'TodayILearned > TILWIL' 카테고리의 다른 글
DBMS Connection pool 이 뭐임 (0) 2022.09.30 gRPC 동작순서 (0) 2022.08.12 asynchronous-synchronous programming (0) 2022.05.02 왜 타입스크립트 마이그레이션을 해야할까 (0) 2022.05.01 클래스 개념과 프로토타입 개념 (0) 2021.12.15