캐싱은 임시 데이터 저장소 역할을 하는 기술이다.
$ 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 {}
캐시 관리자 인스턴스와 상호 작용하려면 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 메소드를 사용한다.
이 서비스는 내부적으로 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 {}
컴파일 타임에 정적으로 전달하는 대신, 모듈 옵션을 비동기적으로 전달할 수 있다. 비동기 구성을 처리하는 방식인 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 {}
캐싱 모듈에서 서비스를 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');
}
}