[Nest JS] Caching

minidoo·2021년 10월 11일
0

NestJS

목록 보기
8/8
post-thumbnail

캐싱은 임시 데이터 저장소 역할을 하는 기술이다.

$ npm install cache-manager
$ npm install -D @types/cache-manager

캐싱을 활성화하려면 CacheModule 을 가져와서 register() 메서드를 호출한다.

// src/caching/caching.module.ts

import { CacheModule, Module } from '@nestjs/common';
import { CachingService } from './cahing.service.ts';

@Module({
  imports: [CacheModule.register()],
  providers: [CachingService],
  exports: [CachingService],
})
export class CachingModule {}

Interacting with the Cache store

캐시 관리자 인스턴스와 상호 작용하려면 CACHE_MANAGER 토큰을 사용하여 클래스에 삽입한다.

// src/caching/caching.service.ts

import { Injectable, Inject, CACHE_MANAGER } from '@nestjs/common';
import { Cache } from 'cache-manager';

@Injectable()
export class RedisCacheService {
  constructor(@Inject(CACHE_MANAGER) private readonly cache: Cache) {}

  async get(key: string): Promise<any> {
    return await this.cache.get(key);
  }

  async set(key: string, value: any, option?: any) {
    await this.cache.set(key, value, option);
  }

  async reset() {
    await this.cache.reset();
  }

  async del(key: string) {
    await this.cache.del(key);
  }
}

Cache 인스턴스의 get 메소드는 캐시에서 항목을 검색하는 데 사용된다. 캐시에 항목을 추가하려면 set 메소드를 사용한다. 이때 3번째 인자에는 option을 넣을 수 있는데, TTL(만료시간)을 수동으로 지정할 수 있다. 캐시에서 항목을 제거하려면 del 메소드를, 전체 캐시를 지우려면 reset 메소드를 사용한다.

Different Stores

이 서비스는 내부적으로 cache-manager 을 활용한다.

cahce-manager 패키지는 Redis 지정소와 같은 다양한 저장소(store)을 지원한다. Redis 저장소를 설정하려면 해당 옵션과 함께 패키지를 register() 메서드레 전달하면 된다.

// src/caching/caching.module.ts

import { CacheModule, Module } from '@nestjs/common';
import { CachingService } from './cahing.service.ts';
import * as redisStore from 'cache-manager-redis-store';

@Module({
  imports: [CacheModule.register({
    store: redisStore,
    host: 'localhost',
    port: 6379,
    ttl: 3600,
  })],
  providers: [CachingService],
  exports: [CachingService],
})
export class CachingModule {}

Async Configuration

컴파일 타임에 정적으로 전달하는 대신, 모듈 옵션을 비동기적으로 전달할 수 있다. 비동기 구성을 처리하는 방식인 registerAsync() 메서드를 사용한다. 한가지 접근 방식은 팩토리 함수를 사용하는 것으로, async 일 수 있으며 inject 을 통해 종속성을 주입할 수 있다.

// src/caching/caching.module.ts

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

@Module({
  imports: [
    CacheModule.register({
      imports: [ConfigModule],
      useFactory: async (configService: ConfigService) => ({
        store: redisStore,
        host: configService.get('REDIS_CONFIG_HOST'),
        port: configService.get('REDIS_CONFIG_PORT'),
        ttl: configService.get('REFRESH_TOKEN_EXPIRED_AT'),
      }),
      inject: [ConfigService],
    }),
  ],
  providers: [CachingService],
  exports: [CachingService],
})
export class CachingModule {}

Service Use

캐싱 모듈에서 서비스를 exports 하였기 때문에 다른 서비스에서 캐시 매니저를 사용할 수 있게 되었다.

// src/order/order.service.ts

import { CachingService } from 'src/cahcing/cahing.service';

@Injectable()
export class OrderService {
  constructor(
    private cacheManager: CachingService,
  ) {}
  
	async setOrder() {
    await this.cacheManager.set('barcode', '123456_1');
  },

  async getOrder() {
    await this.cacheManager.get('barcode');
  }
} 

참고 사이트

Caching | 네스트JS 한국어 매뉴얼

0개의 댓글