NestJS cache-manager 사용하기
2024. 10. 3. 17:28ㆍNestJs
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
반응형
'NestJs' 카테고리의 다른 글
AWS Polly vs Google Text-to-Speech (0) | 2024.12.11 |
---|---|
axios Ngrok와 통신하면서 발생한 문제 (1) | 2024.10.26 |
[NestJS] google-cloud-text-to-speech vs AWS Polly 차이점 & 사용법 (4) | 2024.10.01 |
[NestJS] Postman auth에 토큰 보내기 (0) | 2024.08.07 |
[NestJS] Unknown column in where clause 에러 발생 (0) | 2024.07.25 |