Leon Chaewon Kong's dev blog

Nest.js에서 in-memory cache 사용하기

캐싱은 상황에 따라 강력할 수 있다. 데이터가 자주 변하지 않는 반면, 요청이 빈번하다면 캐싱은 매우 강력해진다.

Nest.js는 in-memory cache를 정말 간단하게 사용할 수 있도록 돕는다.

먼저 cache-manager를 설치해 준다.

$ npm install cache-manager
$ npm install -D @types/cache-manager

다음으로 캐싱을 사용하고 싶은 controller와 module에 캐싱을 적용하면 된다.

이번에는 간단히 응답을 auto-caching하게 해본다.

import { CacheModule, Module } from "@nestjs/common";
import { CatController } from "./app.controller";

@Module({
  imports: [CacheModule.register()],
  controllers: [CatController],
})
export class CatModule {}

매번 필요에 맞게 controller와 module을 선택해 설정해도 되고, AppController, AppModule에 설정해 모든 module에 적용되게 해도 된다.

@Controller()
@UseInterceptors(CacheInterceptor) // 이 부분 주목
export class CatController {
  @Get()
  findAll(): string[] {
    return [];
  }
}

controller에는 위와 같이 지정해준다. 반드시 동일한 모듈의 컨트롤러에 적용을 해줘야 동작한다. (CatModule에 설정해주었다면 CatController)

벤치마크

최대한 실제 운용상황과 유사하게 하기 위해 docker로 컨테이너를 띄워 진행했다. Docker-compose로 nginx와 app을 동시에 띄우고 nginx가 app으로 요청을 proxy한다.

$ autocannon -c 100 http://localhost/review?productId=1

간단한 벤치마크이므로 autocannon을 사용한다.

캐싱을 하지 않은 경우

no cache result

항목 결과
Avg. Latency 170.76 ms
Avg. Req/Sec 578.71
total Req 6K

캐싱 적용을 한 경우

in-memory cache result

항목 결과
Avg. Latency 87.58 ms
Avg. Req/Sec 1132.3
total Req 11K

간단한 벤치마크이므로 이를 전적으로 신뢰할 수는 없지만, 캐시가 적용된 후 초당 응답량이 2배 가까이 증가했음을 알 수 있다.

더불어 latency도 절반 정도로 줄어들었음을 알 수 있다.