Skip to content
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

Merged
merged 8 commits into from
Nov 19, 2024

Conversation

DongHoonYu96
Copy link
Collaborator

@DongHoonYu96 DongHoonYu96 commented Nov 18, 2024

➕ 이슈 번호


🔎 작업 내용

이 PR은 game 모듈에 여러 변경사항을 도입하며, 주로 퀴즈 세트 캐싱을 처리하는 새로운 QuizCacheService의 통합과 기존 게임 서비스 개선에 초점을 맞추고 있습니다. 가장 중요한 변경사항은 다음과 같습니다:

  • QuizCacheService 통합:
    GameModule에 QuizCacheService와 QuizModule을 imports와 providers에 추가
    GameService에서 HttpService를 제거하고 QuizCacheService를 생성자와 메서드에 추가
    GameRoomService에서 기본 퀴즈 세트 사용을 나타내는 -1로 기본 quizSetId 값을 업데이트

  • QuizCacheService 구현:
    Redis와 로컬 메모리를 사용하여 퀴즈 세트 캐싱을 관리하는 새로운 QuizCacheService 클래스 생성
    캐시 또는 데이터베이스에서 퀴즈 세트를 가져오고, 캐시에 퀴즈 세트를 저장하며, 캐시 항목을 무효화하는 메서드 포함

  • End-to-End 테스트 업데이트:
    테스트 설정에 QuizCacheService와 QuizService 포함
    퀴즈 세트가 캐시 또는 데이터베이스에서 올바르게 가져와지는지, 캐시가 적절히 업데이트되거나 무효화되는지 확인하는 새로운 테스트 추가

  • 목 데이터 업데이트:
    새로운 퀴즈 질문과 선택지를 반영하도록 목 퀴즈 데이터 업데이트
    이러한 변경은 퀴즈 데이터의 캐싱을 통해 성능을 개선하고, 더 효율적인 데이터 접근을 가능하게 합니다.


🖼 참고 이미지

image
image


🎯 리뷰 요구사항 (선택)

  • 질문, 피드백 환영합니다!

✅ Check List

  • merge할 브랜치의 위치를 확인했나요?
  • Label을 지정했나요?

미설정시 기본값퀴즈로 진행
api를 조회하는 시점에 퀴즈셋 제목 추가
gameService의 의존성이 늘어남에따라, test code에도 의존성 주입
퀴즈셋타이틀추가, 캐시-db조회
Copy link
Collaborator

@NewCodes7 NewCodes7 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

동훈님 어제도 수고하셨습니다!!
코멘트 한번 확인 부탁드립니다 😊

Comment on lines +52 to +58
/**
* 퀴즈셋이 설정되어 있지 않으면 기본 퀴즈셋을 사용
*/
const quizset =
room.quizSetId === '-1'
? mockQuizData
: await this.quizCacheService.getQuizSet(+room.quizSetId);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: 디폴트 퀴즈셋 -1을 게임방 만들 때부터 설정해두는 건 어떨까요? 그러면 아래의 경우에 quizSetTitle을 넣을 수 있게 됩니다.

  1. 대기방이 만들어지면서 디폴트 퀴즈셋이 정해질 때
  2. 대기방에서 호스트에 의해 퀴즈셋이 변경될 때

그래서 이렇게 게임이 시작되기 전에 quizSetTitle 관리를 해줘야 대기방 목록 조회할 때 퀴즈셋 제목까지 정확히 보여줄 수 있습니다!

Comment on lines 19 to 24
/**
* 캐시키 생성
*/
private getCacheKey(quizSetId: number): string {
return `quizset:${quizSetId}`;
}
Copy link
Collaborator

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분
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

캐시 만료를 30분으로 잡아주신 이유가 있을까요? (궁금)

Comment on lines +51 to +56
// 1. 로컬 메모리 캐시 확인
// const localCached = this.quizCache.get(this.getCacheKey(quizSetId));
// if (localCached) {
// this.logger.debug(`Quiz ${quizSetId} found in local cache`);
// return localCached;
// }
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이거는 주석처리해두신 이유가 뭘까요?

Comment on lines 58 to 65
// 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;
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P4: verbose나 info가 아닌 debug 레벨로 로깅해주신 이유가 있을까요? 캐시 조회하는 건 그래도 나름 의미있는 로그이지 않을까 생각해서 여쭤봅니다! 해당 로그를 수집해서 많이 조회되는 캐시라면 만료기간을 오래 두고, 그렇지 않다면 조치를 취하는 등의 활용방안이 있을 것 같아서요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

눈에 잘 띄려고 했습니다

Comment on lines +8 to +9
@Injectable()
export class QuizCacheService {
Copy link
Collaborator

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"

만약 캐시를 본격적으로 도입한다면 아래 정보는 삭제하는 방향으로 가고, 퀴즈 진행 로직 관련해서 캐시된 데이터를 활용하는 걸로 수정해야 메모리를 효율적으로 쓸 수 있을 것 같습니다.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image
db 대용으로 data를 통쨰로 저장하는 중입니다.

Copy link
Collaborator

@ijun17 ijun17 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 LGTM

Copy link
Collaborator

@always97 always97 left a 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
@DongHoonYu96 DongHoonYu96 merged commit 8401e33 into boostcampwm-2024:dev-be Nov 19, 2024
@DongHoonYu96 DongHoonYu96 deleted the feature-be-#205 branch November 19, 2024 04:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants