강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

우주인님의 프로필 이미지
우주인

작성한 질문수

비전공자도 이해할 수 있는 Redis 입문/실전 (조회 성능 최적화편)

Nest.js + Redis 구현 문제

해결된 질문

작성

·

506

·

수정됨

0

안녕하세요

레디스 강의를 재미있게 수강하고 있는데요

문제가 있어서 여러가지 찾아보았지만 잘 해결이 되지 않아서 여기에 문의 남깁니다

 

import { Module } from '@nestjs/common';
import { BoardController } from './board.controller';
import { BoardService } from './board.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Board } from './board.entity';
import { CacheModule } from '@nestjs/cache-manager';
import * as redisStore from 'cache-manager-ioredis';


@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: '',  // 임시로 삭제
      password: '',  // 임시로 삭제
      database: 'mydb',
      autoLoadEntities: true,
      synchronize: true, // Note: set to false in production
    }),
    TypeOrmModule.forFeature([Board]),
    CacheModule.register({
      store: redisStore,
      host: 'localhost',
      port: 6379,
      ttl: 60,
    }),
  ],
  controllers: [BoardController],
  providers: [BoardService],
})
export class AppModule {}

 

import { Inject, Injectable } from '@nestjs/common';
import { Board } from './board.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { CACHE_MANAGER, Cache } from '@nestjs/cache-manager';



@Injectable()
export class BoardService {
  constructor(
    @InjectRepository(Board)
    private boardRepository: Repository<Board>,
    @Inject(CACHE_MANAGER)
    private cacheManager: Cache,
  ) {}

  async getBoards(page: number, size: number): Promise<Board[]> {
    const cacheKey = `boards:page:${page}:size:${size}`;
    const cachedData = await this.cacheManager.get<Board[]>(cacheKey);
    if (cachedData) {
      return cachedData;
    }

    const skip = (page - 1 ) * size;
    const boards = await this.boardRepository.find({
      order : {created_at: 'desc'},
      skip: skip,
      take: size,
    });

    await this.cacheManager.set(cacheKey, boards);
    const cachedData3 = await this.cacheManager.get(cacheKey);

    console.log('stores:', this.cacheManager.stores);
    console.log('stores 타입:', typeof this.cacheManager.stores);
    console.log('stores 내용:', JSON.stringify(this.cacheManager.stores, null, 2))

    return boards;
  }
}

현재 이렇게 2개의 파일을 레디스 적용하기 위해서 작성을 하였는데요

레디스에서 검색을 하면 정상적으로 조회가 되지 않습니다(mysql에서 가지고 온 데이터는 정상적으로 조회가 됩니다)

 

그래서 중간에 로그도 찍어보았는데 레디스가 아니라 keyv 여기에 저장이 되는거 같습니다

왜 그런지 원인을 알고 싶습니다

 

참고로 레디스 cli, 서버는 정상적으로 동작 중 입니다

이유는 스프링으로 레디스 연동은 정상적으로 잘 됩니다

답변 3

1

TTL 문제가 아닐까요?

 

설정값이 millisecond 인것 같은데 확인해 보시는게 좋을 것 같아요.

우주인님의 프로필 이미지
우주인
질문자

같이 확인해주셔서 감사합니다

덕분에 다시 한번 확인을 하게 되었습니다

0

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

안녕하세요 주인님! 질문 잘 해주셨어요:)

 

디버깅을 해봐야 원인을 파악할 수 있을 것 같네요!

혹시 작동하지 않는 코드 Github Repository에 올려서

공유 한 번 해주실 수 있을까요~??

만약 Repostiory 내부에 민감한 파일이 포함되어 있는 경우

아래 카톡으로 프로젝트 파일들 압축해서 보내주셔도 됩니다!

https://open.kakao.com/o/srhVnUGg

우주인님의 프로필 이미지
우주인
질문자

안녕하세요 강사님

https://github.com/starziahope/nset-redis-project

깃 공유 해드립니다

JSCODE 박재성님의 프로필 이미지
JSCODE 박재성
지식공유자

감사합니다! 잘 확인했습니다~!!

Nest.js 버전이 업그레이드 됨에 따라 발생한 문제로 확인됩니다.

그래서 새로 나온 Nest.js 버전에 맞는 수업자료를 만들었으니

아래 수업 자료 참고해서 다시 한 번 구현해보시기 바랍니다:D

https://www.notion.so/jscode/Nest-js-v11-Redis-16311062ff0780ce9942eeeb21314ef9?pvs=4

위 수업 자료를 보고 구현을 했는데도 작동하지 않는다면

다시 또 댓글 남겨주시기 바랍니다~~

우주인님의 프로필 이미지
우주인
질문자

빠르게 답변해주셔서 감사드립니다~!!

확인을 해보니 Nest.js 버전이 위에 말씀하신것처럼 11버전입니다

알려주신 코드대로 해보니 정상적으로 동작하는것을 확인 하였습니다

감사드립니다!!

0

안녕하세요, 인프런 AI 인턴입니다, 우주인님.

Nest.js와 Redis를 연동하는 과정에서 여러 가지 문제가 발생할 수 있습니다. 현재 직면하신 문제는 Node.js 환경에서 Redis를 제대로 구성하지 못한 것 같습니다. keyv라는 저장소를 사용 중인 것처럼 보일 경우, Redis 라이브러리가 제대로 로드되지 않았을 가능성이 있습니다.

문제와 해결책

  1. Redis 모듈 설치 확인:

    • cache-manager-ioredis 모듈이 제대로 설치되어 있는지 확인하세요. 이 모듈은 Redis와의 커넥션을 관리합니다.
    • 반드시 설치되어 있어야 할 패키지:
      
      npm install cache-manager-ioredis
      

  2. 올바른 Redis Store 사용:

    • CacheModule.register 메소드 안에서 store: redisStore 선언을 통해 Redis 모듈이 사용되고 있는지 확인하세요. 만약 keyv와 같은 다른 라이브러리가 사용되고 있다면, 이곳에서 잘못 설정된 것입니다.
  3. 캐시 라이프사이클 확인:
    무언가 잘못되어 기본 메모리 저장소가 사용 중이라면, 캐시가 제대로 Redis에 저장되지 않고 기본 메모리 캐시를 사용할 수 있습니다.

  4. 이슈 재현 및 수정 확인:
    만약 잘못된 설정에 의해 몇 가지 문제가 발생했다면, 다음과 같이 설정을 확인하세요.

   CacheModule.register({
     store: redisStore,
     host: 'localhost',
     port: 6379,
     ttl: 60,
     password: '', // 보안 처리 필요
   }),
  1. 디버그 정보 활성화:

    • Redis에서 검증 가능하도록 Redis-cli를 통해 수동으로 키를 삽입해보고, 올바른 클라이언트가 작동하는지 테스트하세요.
    • redis-cli에서 keys * 명령어를 통해 현재 저장된 키를 검사해서 Nest.js 애플리케이션이 캐시에 접근할 수 있는지 확인하세요.
  2. 데모 프로젝트 참고:
    다음 문서를 참고하여 Nest.js와 Redis를 활용한 예제를 구성해보는 것도 좋은 방법일 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

우주인님의 프로필 이미지
우주인
질문자

이렇게 코드를 작성하면 정상적으로 작동하는것을 확인 하였습니다

import Redis from 'ioredis';

const redisClient = new Redis({

host: 'localhost',

port: 6379,

});

redisClient.set('testKey', 'Hello Redis!');

redisClient.get('testKey').then((value) => console.log('Redis 값:', value));

 하지만 제가 원하는건 강의에서 알려준걸로 했을때 안되는 문제입니다

--> 링크 오류 납니다

우주인님의 프로필 이미지
우주인

작성한 질문수

질문하기