포시코딩

[NestJS] cache-manager with. Redis (v. 2024) 본문

Node.js

[NestJS] cache-manager with. Redis (v. 2024)

포시 2024. 2. 13. 18:01
728x90

https://www.npmjs.com/package/cache-manager

 

cache-manager

Cache module for Node.js. Latest version: 5.4.0, last published: 24 days ago. Start using cache-manager in your project by running `npm i cache-manager`. There are 950 other projects in the npm registry using cache-manager.

www.npmjs.com

 

https://github.com/nestjs/cache-manager

 

GitHub - nestjs/cache-manager: Cache manager module for Nest framework (node.js) 🗃

Cache manager module for Nest framework (node.js) 🗃 - nestjs/cache-manager

github.com

 

기존 cache-manager(위)가 nestjs 밑으로 들어갔다. (아래)

2023년 초에 등록된 듯 한데, 사용할 때 devDependencies에 @types/cache-manager가 없으면 에러가 나긴 하더라.

 

아래는 예전 포스팅

 

https://4sii.tistory.com/440

 

[Nest.js] 이메일 인증 시스템 (3). Redis 적용

개요 https://4sii.tistory.com/437 [Nest.js] 이메일 인증 시스템 (2). cache-manager 개요 https://4sii.tistory.com/436 [Nest.js] 이메일 인증 시스템 (1). nodemailer 개요 위와 같은 회원가입 폼에서 이메일 입력 후 인증번

4sii.tistory.com

 

 

다만, redis 버전 관련 문제는 아직 존재하는 것으로 보인다.

 

아래부턴, 예전 포스팅과 비슷하면서도 살짝 달라진 NestJS 상에서

cache-manager와 redis를 통해 데이터를 저장하고 가져오는 방법에 대해 알아볼 것이다. 

 

 

nest project 세팅

bun create nest nest-cache

 

속도와 편의성을 위해 package-manager로 bun 사용

 

bun install @nestjs/cache-manager cache-manager-redis-store@2.0.0
bun install -D @types/cache-manager @types/cache-manager-redis-store

 

다른건 최신으로 설치해도 되지만 cache-manger-redis-store에 한해서 @2.0.0으로 설치하지 않으면

아래 cacheConfig.service 에서 불러오는 redisStore에 대해 아래 에러가 발생한다. 

 

 

 

그냥 cache를 사용해도 되지만 redis에 대한 포스팅이니 redis 설치

 

https://4sii.tistory.com/250

 

Redis

개요 처음으로 토큰 기반 로그인 인증을 구현하며 access token과 refresh token을 다루게 되었는데 refresh token을 저장하는 방법으로 그냥 다른 데이터들 처럼 MySQL에 Token 테이블을 만들어 저장했었다.

4sii.tistory.com

위 포스팅 참고

 

 

 

아래는 코드

 

app.module

// ... 생략
import { CacheModule } from '@nestjs/cache-manager';
import { CacheConfigService } from './common/cacheConfig.service';

@Module({
  imports: [
	// ... 생략
    CacheModule.registerAsync({ isGlobal: true, useClass: CacheConfigService }),
  ],
})
export class AppModule {}

 

cacheConfig.service

import { CacheModuleOptions, CacheOptionsFactory } from '@nestjs/cache-manager';
import { Injectable } from '@nestjs/common';
import redisStore from 'cache-manager-redis-store';

@Injectable()
export class CacheConfigService implements CacheOptionsFactory {

  createCacheOptions(): CacheModuleOptions {
    const config: CacheModuleOptions = {
      store: redisStore,
      host: 'localhost',
      port: 6379,
      ttl: 60,
    };
    return config;
  }
}

 

sample.service

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

@Injectable()
export class SampleService {
  constructor(@Inject(CACHE_MANAGER) private readonly cacheManager: Cache) {}

  async save(test: string) {
    await this.cacheManager.set('test', test);
    return true;
  }

  async find() {
    const test = await this.cacheManager.get('test');
    return test;
  }
}

 

나머지 설정은 이전과 같다. 

728x90