NestJS cache-manager 사용하기

2024. 10. 3. 17:28NestJs

728x90
반응형

 

을 통한 성능 개선

 
1. cache?
 데이터 복사본을 임 저장 저장하여, 동일한 데이터에 대한 요청 있을 때 더 빠르게 응할 수 있도록 하는 기술입니다. 이를 통해 데이터베이스 부 줄이고, 응답 속도를 개선할 수 있습니다.
 

2. 캐싱의 필요

 

  •  향상: 데이터베이스     도를 개선합니다.

 

 

 

  •  : 데이터이스의 부  서버 비용 할 수 있습니다.

 

 

 

  • 사용 경험 개선: 빠  도로 사용자 만족도를 입니다.

 

 

3. 캐싱 구현 방법

NestJS 사용하여 싱을 구현하는 방법을 소개합니다.

 

3.1. 캐시 모듈 설치

npm install @nestjs/cache-manager cache-manager

 

 

3.2. 캐시 모듈 설정

app.module.ts에서 캐시 모듈을 설정합니다.

import { Module } from '@nestjs/common';
import { CacheModule } from '@nestjs/cache-manager';

@Module({
  imports: [
    CacheModule.register({
      ttl: 180, // 기본 TTL (초 단위)
      max: 100, // 최대 캐시 개수
      isGlobal: true, // 전역 설정
    }),
  ],
})
export class AppModule {}

 

 

3.3. 서비스에서 캐싱 적용

서비스에서 캐싱을 적용하는 방법입니다.

 

import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { BooksEntity } from "../../entities/books.entity";
import { In, Repository } from "typeorm";
import { CategoryEntity } from "../../entities/category.entity";
import { BooksCategoryEntity } from "../../entities/books-category.entity";

@Injectable()
export class BooksService {
  constructor(
    @InjectRepository(BooksEntity)
    private readonly bookRepository: Repository<BooksEntity>,
    @InjectRepository(CategoryEntity)
    private readonly categoryRepository: Repository<CategoryEntity>,
    @InjectRepository(BooksCategoryEntity)
    private readonly bookCategoryRepository: Repository<BooksCategoryEntity>,
  ) {}

  async findRecommendedBooks(page: number, limit: number, category: string) {
    const skip = (page - 1) * limit;
    const cacheKey = `recommendedBooks:${page}:${limit}:${category}`;

    const cachedData = await this.cacheManager.get(cacheKey);
    if (cachedData) {
      return cachedData;
    }

    const queryBuilder = this.bookRepository.createQueryBuilder("book");

    if (category !== "all") {
      queryBuilder.where("book.searchTarget = :category", { category });
    }

    const [books, total] = await queryBuilder
      .select([
        "book.id",
        "book.title",
        "book.cover",
        "book.author",
        "book.publisher",
        "book.description",
        "book.salePrice",
      ])
      .orderBy("RAND()")
      .skip(skip)
      .take(limit)
      .getManyAndCount();

    const result = {
      data: books,
      total,
      page,
      limit,
    };

    await this.cacheManager.set(cacheKey, result, 180000);
    return result;
  }
}

 

 

 

4.2. NestJS 캐싱 라이브러리 사용 이유

 

  • 간편한 설정: NestJS의 캐싱 라이브러리는 설정이 간단하고, 기본적인 캐싱 기능을 쉽게 구현할 수 있습니다.

 

 

 

  • 개발 속도: 작은 프로젝트나 프로토타입에서는 Redis와 같은 외부 캐시 스토리지를 설정하는 것보다 NestJS의 내장 캐시 라이브러리를 사용하는 것이 더 빠르고 효율적입니다

 

 

 

  • 리소스 절약: Redis를 사용하면 추가적인 서버 리소스가 필요하므로, 작은 규모의 애플리케이션에서는 불필요한 복잡성을 줄일 수 있습니다.

 

 

5. 성능 개선 효과

 

캐싱 전/후

캐싱을 적용한 후의 성능 개선 효과를 측정한 결과는 다음과 같습니다

 
  • 싱 사용 전 평균 응답 속: 57.9ms
 
  • 싱 사용 후 평균 응답 : 0.8ms
 
  • 응답 속도 감소율: 약 98.6% 감소

 

6. 결론

 
 

캐싱을 통해 데이터베이스의 부하를 줄이고, 응답 속도를 크게 개선할 수 있었습니다. 이는 사용자 경험을 향상시키고, 시스템의 효율성을 높이는 데 기여합니다. Redis 같은   지를 사용할 수도 있지만, 작은 프로젝트에서는 NestJS 싱 라이브리를 통해 간하게 캐싱을 구현할 수 있습니다.

728x90
반응형