포시코딩

[Nest.js] 캐싱 사용해보기 본문

Node.js

[Nest.js] 캐싱 사용해보기

포시 2023. 2. 22. 20:13
728x90

개요

Nest.js에서는 cache-manager 와 연계하여 캐싱 기능을 사용할 수 있는데

이에 대해 공부한 것을 정리해보았다.

 

설치

npm i cache-manager
npm i -D @types/cache-manager

 

세팅

app.module.ts

// ...import 생략
@Module({
  imports: [
    CacheModule.register({
      ttl: 60000,  // 데이터 캐싱 시간(밀리 초 단위)
      max: 100, // 최대 캐싱 개수
      isGlobal: true,
    })
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

필요 시 env 파일을 통해 ttl, max 값을 전달하길 원한다면 configuration을 추가하면 된다.

 

ttl: 60000

밀리 초 단위이기 때문에 60000 = 60초 = 1분

즉, 1분 동안 동일한 데이터에 대해 캐싱하다 그 뒤에는 사라짐

 

Service

import {
  CACHE_MANAGER,
  Inject,
} from '@nestjs/common';
import { Cache } from 'cache-manager'

@Injectable()
export class BoardService {
  constructor(
    @Inject(CACHE_MANAGER) private readonly cacheManager: Cache
  ) {}
  
// ...생략

 

사용 방법

Service

async getArticles() {
  return await this.articleRepository.find({
    where: { deletedAt: null },
    select: ['id', 'title', 'author', 'createdAt'],
  });
}

기존에 getArticles() 라는 단순한 게시글 목록을 조회하는 API가 있다고 했을 때

 

캐싱을 사용하게 바꾼다면 아래와 같이 바꿀 수 있다.

async getArticles() {
  const cacheArticles = await this.cacheManager.get('articles');
  if (!_.isNil(cacheArticles)) {
    return cacheArticles;
  }

  const articles = await this.articleRepository.find({
    where: { deletedAt: null },
    select: ['id', 'title', 'author', 'createdAt'],
  });
  await this.cacheManager.set('articles', articles);
  return articles;
}

이렇게 함으로서 getArticles() 호출 시 캐싱된 articles 데이터가 없다면 

DB에서 데이터를 리턴하고 그 이후 1분동안 캐싱된 articles를 가져다 쓰면서

DB로의 데이터 요청 리소스를 아낄 수 있게 되었다.

 

정리

캐싱을 적용해도 크게 문제가 없는 서비스 로직에 한해서는 적극적으로 캐싱을 적용하는걸 추천한다.

어차피, max 속성을 통해 캐싱이 되는 데이터 양도 조절할 수 있기 때문에 

메모리가 오버플로우 날 걱정은 딱히 하지 않아도 되며

 

위 방법은 인-메모리 기반으로 캐싱을 했지만

추후 Redis와 같은 인-메모리 데이터베이스를 사용하는 방법도 고려해볼만 하다.

728x90