nestjs cache

agnusdei·2023년 10월 4일

NestJS에서 캐시를 사용하는 것은 애플리케이션의 성능을 향상시키는 데 도움이 되는 중요한 부분 중 하나입니다. 캐시는 데이터나 연산 결과를 메모리나 다른 저장 장치에 저장해두고, 필요할 때 다시 사용함으로써 응답 시간을 단축하고 서버 부하를 줄일 수 있습니다.

NestJS에서 캐시를 사용하는 일반적인 절차와 사용법에 대해 설명하겠습니다:

  1. 캐시 모듈 설치: NestJS에서 캐시를 사용하려면 먼저 캐시 모듈을 설치해야 합니다. 가장 인기 있는 캐시 모듈 중 하나는 cache-manager입니다. 다음 명령으로 설치할 수 있습니다:

    npm install cache-manager
  2. 캐시 모듈 설정: 애플리케이션 모듈에서 캐시 모듈을 설정합니다. 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를 캐시 스토어로 사용하도록 설정하고 있습니다.

  3. 캐시 사용: 캐시를 사용하려는 컨트롤러나 서비스에서 @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());
    }
  4. 캐시 인터셉터 사용: @UseInterceptors(CacheInterceptor) 데코레이터를 사용하여 캐시 인터셉터를 컨트롤러 라우터에 적용합니다. 이렇게 하면 해당 엔드포인트의 응답이 캐시됩니다.

  5. 캐시 키 생성: 캐시 키를 생성하는 데 필요한 정보를 정의합니다. 이는 @CacheKey() 데코레이터를 사용하여 수행됩니다. 캐시 키는 요청을 고유하게 식별할 수 있도록 설정해야 합니다.

  6. 캐시 TTL 설정: @CacheTTL() 데코레이터를 사용하여 캐시의 TTL(캐시 만료 시간)을 설정합니다. TTL은 캐시의 유효 기간을 나타냅니다. 예를 들어, 3600초(1시간)로 설정하면 1시간 동안 캐시가 유지됩니다.

이제 위의 단계를 따라 캐시를 설정하고 사용할 수 있습니다. 이를 통해 해당 엔드포인트의 응답이 캐시되고, 캐시 키와 TTL을 정의하여 적절한 방식으로 캐시를 관리할 수 있습니다. 필요에 따라 캐시 스토어(예: Redis, Memcached 등)를 선택하고 구성할 수도 있습니다.

NestJS에서 캐시를 지우거나 전체 캐시를 비우려면 cache-manager와 함께 제공되는 메서드 및 함수를 사용하여 다음과 같이 수행할 수 있습니다:

  1. 특정 캐시 키 지우기:

특정 캐시 키를 지우려면 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 메서드는 특정 캐시 키를 지우는 데 사용됩니다. 이 메서드를 호출하면 해당 키와 관련된 캐시가 삭제됩니다.

  1. 전체 캐시 비우기:

전체 캐시를 비우려면 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 메서드는 모든 캐시를 비우는 데 사용됩니다. 이 메서드를 호출하면 모든 캐시가 삭제됩니다.

또한, 특정 캐시 키에 대한 유효 시간을 조정하여 캐시를 만료시킬 수도 있습니다. 이를 통해 캐시가 만료되면 다시 조회되어 업데이트됩니다.

위의 두 예시 코드를 사용하여 특정 캐시 키를 지우거나 전체 캐시를 비울 수 있으므로, 필요에 따라 캐시 관리를 할 수 있습니다.

profile
DevSecOps, Pentest, Cloud(OpenStack), Develop, Data Engineering, AI-Agent

0개의 댓글