해결된 질문
작성
·
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
0
안녕하세요 주인님! 질문 잘 해주셨어요:)
디버깅을 해봐야 원인을 파악할 수 있을 것 같네요!
혹시 작동하지 않는 코드 Github Repository에 올려서
공유 한 번 해주실 수 있을까요~??
만약 Repostiory 내부에 민감한 파일이 포함되어 있는 경우
아래 카톡으로 프로젝트 파일들 압축해서 보내주셔도 됩니다!
감사합니다! 잘 확인했습니다~!!
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 라이브러리가 제대로 로드되지 않았을 가능성이 있습니다.
Redis 모듈 설치 확인:
cache-manager-ioredis 모듈이 제대로 설치되어 있는지 확인하세요. 이 모듈은 Redis와의 커넥션을 관리합니다.
npm install cache-manager-ioredis
올바른 Redis Store 사용:
CacheModule.register 메소드 안에서 store: redisStore 선언을 통해 Redis 모듈이 사용되고 있는지 확인하세요. 만약 keyv와 같은 다른 라이브러리가 사용되고 있다면, 이곳에서 잘못 설정된 것입니다.캐시 라이프사이클 확인:
무언가 잘못되어 기본 메모리 저장소가 사용 중이라면, 캐시가 제대로 Redis에 저장되지 않고 기본 메모리 캐시를 사용할 수 있습니다.
이슈 재현 및 수정 확인:
만약 잘못된 설정에 의해 몇 가지 문제가 발생했다면, 다음과 같이 설정을 확인하세요.
CacheModule.register({
store: redisStore,
host: 'localhost',
port: 6379,
ttl: 60,
password: '', // 보안 처리 필요
}),
디버그 정보 활성화:
redis-cli에서 keys * 명령어를 통해 현재 저장된 키를 검사해서 Nest.js 애플리케이션이 캐시에 접근할 수 있는지 확인하세요.데모 프로젝트 참고:
다음 문서를 참고하여 Nest.js와 Redis를 활용한 예제를 구성해보는 것도 좋은 방법일 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
같이 확인해주셔서 감사합니다
덕분에 다시 한번 확인을 하게 되었습니다