NestJS Redis 연결

 안녕하세요. 이번에는 Redis을 이용하여 NestJS와 연결을 하도록 하겠습니다. 


일단 해당 Local 또는 Remote PC에 Redis가 설치되 있어야 하고 특히 Remote PC는 해당 Redis가 외부에서 통신이 가능하도록 셋팅해야 합니다.


NestJS 공식 문서 링크

Redis 공식 문서 링크


1. npm모듈 설치(dependencies)

- cache-manager와 cache-manager-redis-store를 설치한다

$ npm install cache-manager cache-manager-redis-store



2. npm모듈 설치(devDependencies)

- cache-manager와 cache-manager-redis-store를 설치한다

$ npm install -D @types/cache-manager


// src/cache-dbmodule/cache-dbmodule.module.ts
import { CacheModule, Global, Module } from '@nestjs/common';
import * as redisStore from 'cache-manager-redis-store';
import { CacheDbmoduleController } from './cache-dbmodule.controller';
import { CacheDbmoduleService } from './cache-dbmodule.service';
require('dotenv').config(); // env파일을 사용하기 위한 코드

// CacheModule를 설정합니다.
export const cacheModule = CacheModule.registerAsync({
useFactory: async () => ({
store: redisStore, // 저장위치 (Default : 메모리)
host: process.env.REDIS_HOST, // Redis 접속 주소(Default : 127.0.0.1)
port: process.env.REDIS_PORT, // Redis 접속 포트 (Default : 6379)
ttl: 0, // 해당 키의 유효시간
auth_pass: process.env.REDIS_PASSWORD, // Redis의 비밀번호
}),
});

@Global() // 다른 모든 모듈에서도 사용 가능하게 Global로 전환
@Module({
imports: [cacheModule],
controllers: [CacheDbmoduleController],
providers: [CacheDbmoduleService],
})
export class CacheDbmoduleModule {}

코드1) Module 작성 코드


// src/cache-dbmodule/cache-dbmodule.service.ts
import { CACHE_MANAGER, Inject, Injectable } from '@nestjs/common';
import { Cache } from 'cache-manager';

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

// DB에 키와 데이터를 생성한다.
async create(key: string, data: any) {
return await this.cacheManager.set(key, data);
}

// 키값을 이용하여 DB를 조회한다.
async get(key: string) {
return await this.cacheManager.get(key);
}

// 키값을 이용하여 DB의 데이터를 삭제한다.
async delete(key: string) {
return await this.cacheManager.del(key);
}
}

코드2) Srevice의 CRD부분 생성


// src/cache-dbmodule/cache-dbmodule.controller.ts
import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common';
import { ApiOperation, ApiParam, ApiProperty, ApiTags } from '@nestjs/swagger';
import { CacheDbmoduleService } from './cache-dbmodule.service';

@ApiTags('Redis API')
@Controller('cache-dbmodule')
export class CacheDbmoduleController {
constructor(private readonly cacheDbmoduleService: CacheDbmoduleService) {}

@Post()
@ApiOperation({
summary: 'create redis key and data',
description: '키와 대응되는 데이터를 Redis에 생성한다.',
})
async create(@Body() createRedis: CreateRedis) {
return await this.cacheDbmoduleService.create(
createRedis.key,
createRedis.data,
);
}

@Get(':key')
@ApiOperation({
summary: 'Search by redis key and retrieve data',
description: 'Redis 키를 이용하여 데이터를 갖고온다.',
})
@ApiParam({
name: 'key',
example: 'key1',
})
async get(@Param('key') key: string) {
return await this.cacheDbmoduleService.get(key);
}

@Delete(':key')
@ApiOperation({
summary: 'Delete data by using key',
description: 'Redis의 키를 이용하여 데이터를 삭제한다.',
})
@ApiParam({
name: 'key',
example: 'key1',
})
async delete(@Param('key') key: string) {
return await this.cacheDbmoduleService.delete(key);
}
}

class CreateRedis {
@ApiProperty({
description: 'Redis의 키값',
type: String,
example: 'key1',
})
key: string;

@ApiProperty({
description: 'Redis의 키에 대응하는 데이터 값',
type: Object,
example: {
name: 'alex',
age: 30,
hobby: ['bick', 'swimming', 'programming'],
info: {
school: 'inch',
address: 'seoul',
nation: 'korean',
},
},
})
data: any;
}

코드3) Controller부분에서 CRD API 생성

코드1,2,3을 작성하고 Redis을 생성합니다. (cli : redis-server)

사진1) Redis를 Rocal 로 실행


동영상1) 서버 시연


위 동영상1처럼 해당 NestJS와 Redis가 정상적으로 통신하는 것을 알수 있습니다. 해당 Swagger문서는 NestJS을 실행한 다음 url 'http://localhost:3000/api-docs'으로 접속하면 됩니다.


GitHub Repository Link


참고 자료 

NestJS Redis를 이용하여 캐시(Cache) 관리 : https://engineeringshw.blogspot.com/2023/01/nestjs-redis-cache.html

댓글

이 블로그의 인기 게시물

Lesson 12_1 프로퍼티 노드(Property Node)

DAQ로 전압 측정하기-2

Lesson 12_2 참조를 이용한 프로퍼티노드(Property Node)