nestjs caching @ CacheTTL

agnusdei·2023년 8월 15일
0

NestJS는 캐싱(Caching)을 사용하여 성능을 최적화하고 빠른 응답 시간을 달성하는 데 도움을 줄 수 있습니다. 캐싱은 데이터를 일시적으로 저장해두고 재사용함으로써 데이터베이스 또는 외부 서비스에 반복적인 요청을 보내지 않고도 결과를 제공할 수 있는 메커니즘입니다. 주로 다음과 같은 목적으로 NestJS에서 캐싱을 사용합니다:

  1. 응답 시간 최적화: 데이터베이스나 외부 서비스와의 통신은 비용이 많이 들 수 있습니다. 이러한 통신을 줄이기 위해 결과를 캐시에 저장하고, 이전에 처리한 요청과 동일한 요청이 오면 캐시된 결과를 반환함으로써 응답 시간을 크게 단축할 수 있습니다.

  2. 데이터 중복 감소: 동일한 요청에 대해 반복적으로 같은 결과를 생성해야 하는 경우, 이를 캐시에 저장하여 중복 작업을 줄일 수 있습니다.

  3. 트래픽 감소: 요청에 대한 처리 비용이 높은 경우, 캐싱을 사용하여 서버의 부하를 줄일 수 있습니다. 캐시된 데이터를 제공함으로써 실제 요청 횟수를 줄이고 트래픽을 관리할 수 있습니다.

  4. 동적 데이터 저장: 동적으로 변경되는 데이터를 캐싱하여 요청 시간을 줄이고 데이터베이스에 너무 자주 접근하지 않도록 할 수 있습니다.

이제 실제로 NestJS에서 캐싱을 어떻게 사용하는지 몇 가지 예시를 살펴보겠습니다.

예시 1: 간단한 문자열 캐싱

import { Controller, Get } from '@nestjs/common';
import { CacheInterceptor, CacheTTL } from '@nestjs/common';

@Controller('example')
export class ExampleController {
  @Get('cached')
  @CacheTTL(60) // 캐시 유효 시간(초)
  @UseInterceptors(CacheInterceptor)
  getCachedData(): string {
    return 'Cached data';
  }
}

이 예시에서는 @CacheTTL 데코레이터를 사용하여 캐시의 유효 시간을 설정하고, @CacheInterceptor 인터셉터를 사용하여 요청을 처리하면서 캐싱을 적용합니다.

예시 2: 외부 API 결과 캐싱

import { Injectable, HttpService } from '@nestjs/common';
import { CacheService } from 'nestjs-cache';

@Injectable()
export class DataService {
  constructor(
    private readonly httpService: HttpService,
    private readonly cacheService: CacheService,
  ) {}

  async fetchDataFromApi(query: string): Promise<any> {
    const cachedData = await this.cacheService.get(query);

    if (cachedData) {
      return cachedData;
    }

    const response = await this.httpService.get(`https://api.example.com/data?q=${query}`).toPromise();
    const data = response.data;

    await this.cacheService.set(query, data, { ttl: 60 }); // 60초 동안 캐시 유지
    return data;
  }
}

이 예시에서는 외부 API의 결과를 캐싱하여 동일한 쿼리에 대한 요청을 줄입니다.

예시 3: 커스텀 캐싱 제어

import { Injectable, CacheOptionsFactory, CacheModuleOptions } from '@nestjs/common';

@Injectable()
export class CacheConfigService implements CacheOptionsFactory {
  createCacheOptions(): CacheModuleOptions {
    return {
      ttl: 60, // 캐시 유효 시간(초)
      max: 100, // 최대 저장 개수
    };
  }
}
import { Module, CacheModule } from '@nestjs/common';
import { CacheConfigService } from './cache-config.service';

@Module({
  imports: [
    CacheModule.registerAsync({
      useClass: CacheConfigService,
    }),
  ],
})
export class ExampleModule {}

이 예시에서는 커스텀 캐싱 옵션을 정의하여 캐시 모듈을 설정합니다. CacheConfigService에서 CacheOptionsFactory를 구현하여 캐싱 옵션을 동적으로 제공합니다.

이러한 예시들은 NestJS에서 캐싱을 사용하는 몇 가지 방법을 보여줍니다. 각 예시는 해당 상황에 맞게 캐싱을 구성하고 활용하는 방법을 보여주고 있습니다. 캐싱은 애플리케이션의 성능 향상을 위한 강력한 도구이며, 실제로는 더 다양한 시나리오에서 활용될 수 있습니다.

0개의 댓글