NestJS에서 캐시를 사용하는 것은 애플리케이션의 성능을 향상시키는 데 도움이 되는 중요한 부분 중 하나입니다. 캐시는 데이터나 연산 결과를 메모리나 다른 저장 장치에 저장해두고, 필요할 때 다시 사용함으로써 응답 시간을 단축하고 서버 부하를 줄일 수 있습니다.
NestJS에서 캐시를 사용하는 일반적인 절차와 사용법에 대해 설명하겠습니다:
캐시 모듈 설치: NestJS에서 캐시를 사용하려면 먼저 캐시 모듈을 설치해야 합니다. 가장 인기 있는 캐시 모듈 중 하나는 cache-manager입니다. 다음 명령으로 설치할 수 있습니다:
npm install cache-manager
캐시 모듈 설정: 애플리케이션 모듈에서 캐시 모듈을 설정합니다. CacheModule.register() 메서드를 사용하여 캐시 관리자를 구성할 수 있습니다. 다음은 예시입니다:
import { Module, CacheModule } from '@nestjs/common';
import * as redisStore from 'cache-manager-redis-store';
@Module({
imports: [
CacheModule.register({
store: redisStore,
host: 'localhost', // Redis 호스트
port: 6379, // Redis 포트
}),
],
})
export class AppModule {}
이 예제에서는 Redis를 캐시 스토어로 사용하도록 설정하고 있습니다.
캐시 사용: 캐시를 사용하려는 컨트롤러나 서비스에서 @CacheKey() 및 @CacheTTL() 데코레이터를 사용하여 캐시 키와 TTL(캐시 만료 시간)을 정의할 수 있습니다. 예를 들어, @CacheKey('myCacheKey')와 @CacheTTL(3600)을 사용하면 캐시 키가 "myCacheKey"이고 TTL이 3600초(1시간)인 캐시를 생성할 수 있습니다.
@Get()
@UseInterceptors(CacheInterceptor)
@CacheKey('myCacheKey')
@CacheTTL(3600)
async getAll() {
return plainToInstance(NoticeDTO, await this.noticeService.getAll());
}
캐시 인터셉터 사용: @UseInterceptors(CacheInterceptor) 데코레이터를 사용하여 캐시 인터셉터를 컨트롤러 라우터에 적용합니다. 이렇게 하면 해당 엔드포인트의 응답이 캐시됩니다.
캐시 키 생성: 캐시 키를 생성하는 데 필요한 정보를 정의합니다. 이는 @CacheKey() 데코레이터를 사용하여 수행됩니다. 캐시 키는 요청을 고유하게 식별할 수 있도록 설정해야 합니다.
캐시 TTL 설정: @CacheTTL() 데코레이터를 사용하여 캐시의 TTL(캐시 만료 시간)을 설정합니다. TTL은 캐시의 유효 기간을 나타냅니다. 예를 들어, 3600초(1시간)로 설정하면 1시간 동안 캐시가 유지됩니다.
이제 위의 단계를 따라 캐시를 설정하고 사용할 수 있습니다. 이를 통해 해당 엔드포인트의 응답이 캐시되고, 캐시 키와 TTL을 정의하여 적절한 방식으로 캐시를 관리할 수 있습니다. 필요에 따라 캐시 스토어(예: Redis, Memcached 등)를 선택하고 구성할 수도 있습니다.
NestJS에서 캐시를 지우거나 전체 캐시를 비우려면 cache-manager와 함께 제공되는 메서드 및 함수를 사용하여 다음과 같이 수행할 수 있습니다:
특정 캐시 키를 지우려면 CacheManager를 사용하여 해당 키를 지울 수 있습니다. 다음은 예시 코드입니다:
import { CacheManager, CACHE_MANAGER } from '@nestjs/common';
import { Inject, Injectable } from '@nestjs/common';
@Injectable()
export class MyService {
constructor(
@Inject(CACHE_MANAGER) private cacheManager: CacheManager,
) {}
async clearCacheByKey(key: string) {
await this.cacheManager.del(key);
}
}
위 코드에서 clearCacheByKey 메서드는 특정 캐시 키를 지우는 데 사용됩니다. 이 메서드를 호출하면 해당 키와 관련된 캐시가 삭제됩니다.
전체 캐시를 비우려면 CacheManager를 사용하여 모든 캐시를 지울 수 있습니다. 다음은 예시 코드입니다:
import { CacheManager, CACHE_MANAGER } from '@nestjs/common';
import { Inject, Injectable } from '@nestjs/common';
@Injectable()
export class MyService {
constructor(
@Inject(CACHE_MANAGER) private cacheManager: CacheManager,
) {}
async clearAllCache() {
await this.cacheManager.reset();
}
}
위 코드에서 clearAllCache 메서드는 모든 캐시를 비우는 데 사용됩니다. 이 메서드를 호출하면 모든 캐시가 삭제됩니다.
또한, 특정 캐시 키에 대한 유효 시간을 조정하여 캐시를 만료시킬 수도 있습니다. 이를 통해 캐시가 만료되면 다시 조회되어 업데이트됩니다.
위의 두 예시 코드를 사용하여 특정 캐시 키를 지우거나 전체 캐시를 비울 수 있으므로, 필요에 따라 캐시 관리를 할 수 있습니다.