-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BE] feat#205 실제 퀴즈셋 가져오기 #213
[BE] feat#205 실제 퀴즈셋 가져오기 #213
Conversation
미설정시 기본값퀴즈로 진행
api를 조회하는 시점에 퀴즈셋 제목 추가
gameService의 의존성이 늘어남에따라, test code에도 의존성 주입
퀴즈셋타이틀추가, 캐시-db조회
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
동훈님 어제도 수고하셨습니다!!
코멘트 한번 확인 부탁드립니다 😊
/** | ||
* 퀴즈셋이 설정되어 있지 않으면 기본 퀴즈셋을 사용 | ||
*/ | ||
const quizset = | ||
room.quizSetId === '-1' | ||
? mockQuizData | ||
: await this.quizCacheService.getQuizSet(+room.quizSetId); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P2: 디폴트 퀴즈셋 -1을 게임방 만들 때부터 설정해두는 건 어떨까요? 그러면 아래의 경우에 quizSetTitle을 넣을 수 있게 됩니다.
- 대기방이 만들어지면서 디폴트 퀴즈셋이 정해질 때
- 대기방에서 호스트에 의해 퀴즈셋이 변경될 때
그래서 이렇게 게임이 시작되기 전에 quizSetTitle 관리를 해줘야 대기방 목록 조회할 때 퀴즈셋 제목까지 정확히 보여줄 수 있습니다!
/** | ||
* 캐시키 생성 | ||
*/ | ||
private getCacheKey(quizSetId: number): string { | ||
return `quizset:${quizSetId}`; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P3: 현재 이러한 레디스 키를 따로 관리하는 파일이 있습니다! common/constants/redis-key.constant.ts
여기서 다 관리해주는 건 어떨까요?
export class QuizCacheService { | ||
private readonly quizCache = new Map<string, any>(); | ||
private readonly logger = new Logger(QuizCacheService.name); | ||
private readonly CACHE_TTL = 1000 * 60 * 30; // 30분 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
캐시 만료를 30분으로 잡아주신 이유가 있을까요? (궁금)
// 1. 로컬 메모리 캐시 확인 | ||
// const localCached = this.quizCache.get(this.getCacheKey(quizSetId)); | ||
// if (localCached) { | ||
// this.logger.debug(`Quiz ${quizSetId} found in local cache`); | ||
// return localCached; | ||
// } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이거는 주석처리해두신 이유가 뭘까요?
// 2. Redis 캐시 확인 | ||
const redisCached = await this.getFromRedisCache(quizSetId); | ||
if (redisCached) { | ||
this.logger.debug(`Quiz ${quizSetId} found in Redis cache`); | ||
// 로컬 캐시에도 저장 | ||
this.quizCache.set(this.getCacheKey(quizSetId), redisCached); | ||
return redisCached; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
P4: verbose나 info가 아닌 debug 레벨로 로깅해주신 이유가 있을까요? 캐시 조회하는 건 그래도 나름 의미있는 로그이지 않을까 생각해서 여쭤봅니다! 해당 로그를 수집해서 많이 조회되는 캐시라면 만료기간을 오래 두고, 그렇지 않다면 조치를 취하는 등의 활용방안이 있을 것 같아서요!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
눈에 잘 띄려고 했습니다
@Injectable() | ||
export class QuizCacheService { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
현재는 아래처럼 각 방마다 퀴즈에 대한 정보가 저장되고 있습니다. 즉, 하나의 퀴즈셋이 메모리에 중복해서 저장될 수 있습니다.
# 퀴즈셋 관련 (quizId는 DB quiz 테이블에 저장되어 있는 기본키)
Room:<gameId>:Quiz:<quizId> → Hash
- quiz: "퀴즈 내용"
- answer: "1"
- limitTime: "10"
- choiceCount: "4"
만약 캐시를 본격적으로 도입한다면 아래 정보는 삭제하는 방향으로 가고, 퀴즈 진행 로직 관련해서 캐시된 데이터를 활용하는 걸로 수정해야 메모리를 효율적으로 쓸 수 있을 것 같습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생하셨습니다 LGTM
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
수고하셨습니다 ! 전체적으로 매직넘버 사용되는 부분은 상수화해보면 좋을것같습니다 !
기본퀴즈셋으로 was의 quiz-data.mock을 사용함
…ampwm-2024#205 # Conflicts: # BE/src/game/service/game.service.ts # BE/test/integration/game.integration.spec.ts
➕ 이슈 번호
🔎 작업 내용
이 PR은 game 모듈에 여러 변경사항을 도입하며, 주로 퀴즈 세트 캐싱을 처리하는 새로운 QuizCacheService의 통합과 기존 게임 서비스 개선에 초점을 맞추고 있습니다. 가장 중요한 변경사항은 다음과 같습니다:
QuizCacheService 통합:
GameModule에 QuizCacheService와 QuizModule을 imports와 providers에 추가
GameService에서 HttpService를 제거하고 QuizCacheService를 생성자와 메서드에 추가
GameRoomService에서 기본 퀴즈 세트 사용을 나타내는 -1로 기본 quizSetId 값을 업데이트
QuizCacheService 구현:
Redis와 로컬 메모리를 사용하여 퀴즈 세트 캐싱을 관리하는 새로운 QuizCacheService 클래스 생성
캐시 또는 데이터베이스에서 퀴즈 세트를 가져오고, 캐시에 퀴즈 세트를 저장하며, 캐시 항목을 무효화하는 메서드 포함
End-to-End 테스트 업데이트:
테스트 설정에 QuizCacheService와 QuizService 포함
퀴즈 세트가 캐시 또는 데이터베이스에서 올바르게 가져와지는지, 캐시가 적절히 업데이트되거나 무효화되는지 확인하는 새로운 테스트 추가
목 데이터 업데이트:
새로운 퀴즈 질문과 선택지를 반영하도록 목 퀴즈 데이터 업데이트
이러한 변경은 퀴즈 데이터의 캐싱을 통해 성능을 개선하고, 더 효율적인 데이터 접근을 가능하게 합니다.
🖼 참고 이미지
🎯 리뷰 요구사항 (선택)
✅ Check List