Skip to content

[FIX] 수강량(LESSON) 랭킹이 항상 비어있음 — VideoCompletedEvent 미발행 #382

Description

@dlxodus02

📊 버그 심각도 및 우선순위

  • P0 : 서비스 핵심 동작 장애 (긴급 핫픽스 필요)
  • P1 : 주요 기능 오작동 및 예외 처리 누락
  • P2 : 마이너한 버그 및 시스템 영향이 적은 오류

🐛 문제 상황 (현상)

  • 연관 이슈 번호 : -
  • 연관 도메인 : ranking, learning_activity
  • 문제 설명 : 수강량 랭킹(RankingMetric.LESSON)이 항상 빈 상태. GetLessonRankingService(읽기)는 구현되어 있으나, Redis ZSet에 점수를 기록하는 writer가 전혀 없어서 구조적으로 항상 0건.

🔄 재현 방법 (Steps to Reproduce)

  1. 영상 시청 완료 처리 (POST /api/learning/videos/{id}/complete)
  2. 수강량 랭킹 조회
  3. 랭킹이 비어있음 (방금 완료한 사용자도 미노출)

🕵️‍♂️ 원인 분석 및 수정 내역

  • Model / Policy :
  • UseCase / Command : CompleteVideoService.java — 영상 완료 처리 후 이벤트를 발행하지 않음. VideoCompletedEvent 자체가 없음.
  • Service :
  • Port / Adapter : RankingScoreUpdater.javaSTUDY_TIME(StudySessionEndedEvent) 리스너만 존재. LESSON 리스너 없음.
  • Repository :
  • Controller :
  • Response / Request :

수정 내역:

  1. VideoCompletedEvent 신규 생성 (memberId, videoId, courseId 포함)
  2. CompleteVideoService에서 영상 완료 시 VideoCompletedEvent 발행
  3. RankingScoreUpdaterhandle(VideoCompletedEvent) 리스너 추가 → incrementScore(LESSON, period, memberId, 1L) 호출

🚨 검증 및 회귀 방지 (TestCode)

  • 버그를 재현하는 실패 테스트 케이스 작성
  • 로직 수정 후 정상 통과 확인
  • 예외(Exception) 처리 로직 보완 및 assertThrows 검증 완료

📸 로그 및 참고 자료

  • RankingScoreUpdater.java — STUDY_TIME 구현 패턴 참고
  • CompleteVideoService.java — 이벤트 발행 위치

Metadata

Metadata

Assignees

Labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions