NestJS는 서버 사이드 애플리케이션을 빌드하기 위한 프레임워크로, 캐시(cache)를 사용하는 주된 목적은 성능 향상과 데이터 접근 속도 개선입니다. 캐시는 데이터를 메모리나 다른 빠른 저장소에 저장하여, 해당 데이터를 필요로 할 때 데이터베이스나 다른 비용이 높은 작업을 수행하지 않고도 빠르게 반환할 수 있도록 돕는 메커니즘입니다. NestJS에서 캐시를 사용하는 경우와 그에 따른 코드 예시를 살펴보겠습니다.
이 예시에서는 NestJS에서 캐시를 사용하는 방법과 현업에서 흔히 사용되는 상황을 다루겠습니다. Redis를 캐시 저장소로 사용하는 예시를 보여줄 것입니다.
import { Module, CacheModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [
CacheModule.register({
ttl: 10, // 캐시 유효 시간 (초)
max: 100, // 최대 캐시 아이템 수
}),
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
import { Injectable, CACHE_MANAGER, Inject } from '@nestjs/common';
import { Cache } from 'cache-manager';
@Injectable()
export class AppService {
constructor(
@Inject(CACHE_MANAGER) private cacheManager: Cache,
) {}
async getCachedData(key: string): Promise<any> {
const cachedData = await this.cacheManager.get(key);
if (cachedData) {
return cachedData;
}
const data = await this.expensiveDataFetching();
await this.cacheManager.set(key, data);
return data;
}
private async expensiveDataFetching(): Promise<any> {
// ... 데이터베이스나 외부 서비스에서 데이터 가져오기 ...
}
}
import { Controller, Get, Param } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get(':id')
async getData(@Param('id') id: string): Promise<any> {
return this.appService.getCachedData(id);
}
}
이 예시에서는 CacheModule
을 사용하여 Redis를 캐시 저장소로 설정하였고, 서비스에서 데이터를 캐싱하고 컨트롤러에서 캐시된 데이터를 반환하는 방법을 보여주었습니다.
실제 현업에서는 데이터베이스 쿼리 결과, API 응답, 계산 결과 등을 캐시에 저장하여 반복적인 요청에 대한 응답 속도를 향상시키는데 활용할 수 있습니다. 중요한 점은 캐시를 사용할 때 캐시의 유효 기간(ttl)을 적절하게 설정하고, 데이터 갱신이나 변경 시에도 적절한 시점에 캐시를 갱신하는 로직을 구현해야 합니다.