NestJS는 캐싱(Caching)을 사용하여 성능을 최적화하고 빠른 응답 시간을 달성하는 데 도움을 줄 수 있습니다. 캐싱은 데이터를 일시적으로 저장해두고 재사용함으로써 데이터베이스 또는 외부 서비스에 반복적인 요청을 보내지 않고도 결과를 제공할 수 있는 메커니즘입니다. 주로 다음과 같은 목적으로 NestJS에서 캐싱을 사용합니다:
응답 시간 최적화: 데이터베이스나 외부 서비스와의 통신은 비용이 많이 들 수 있습니다. 이러한 통신을 줄이기 위해 결과를 캐시에 저장하고, 이전에 처리한 요청과 동일한 요청이 오면 캐시된 결과를 반환함으로써 응답 시간을 크게 단축할 수 있습니다.
데이터 중복 감소: 동일한 요청에 대해 반복적으로 같은 결과를 생성해야 하는 경우, 이를 캐시에 저장하여 중복 작업을 줄일 수 있습니다.
트래픽 감소: 요청에 대한 처리 비용이 높은 경우, 캐싱을 사용하여 서버의 부하를 줄일 수 있습니다. 캐시된 데이터를 제공함으로써 실제 요청 횟수를 줄이고 트래픽을 관리할 수 있습니다.
동적 데이터 저장: 동적으로 변경되는 데이터를 캐싱하여 요청 시간을 줄이고 데이터베이스에 너무 자주 접근하지 않도록 할 수 있습니다.
이제 실제로 NestJS에서 캐싱을 어떻게 사용하는지 몇 가지 예시를 살펴보겠습니다.
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
인터셉터를 사용하여 요청을 처리하면서 캐싱을 적용합니다.
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의 결과를 캐싱하여 동일한 쿼리에 대한 요청을 줄입니다.
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에서 캐싱을 사용하는 몇 가지 방법을 보여줍니다. 각 예시는 해당 상황에 맞게 캐싱을 구성하고 활용하는 방법을 보여주고 있습니다. 캐싱은 애플리케이션의 성능 향상을 위한 강력한 도구이며, 실제로는 더 다양한 시나리오에서 활용될 수 있습니다.