## 📊 버그 심각도 및 우선순위 - [ ] `P0` : 서비스 핵심 동작 장애 (긴급 핫픽스 필요) - [X] `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` : - [X] `UseCase` / `Command` : `CompleteVideoService.java` — 영상 완료 처리 후 이벤트를 발행하지 않음. `VideoCompletedEvent` 자체가 없음. - [ ] `Service` : - [X] `Port` / `Adapter` : `RankingScoreUpdater.java` — `STUDY_TIME`(`StudySessionEndedEvent`) 리스너만 존재. `LESSON` 리스너 없음. - [ ] `Repository` : - [ ] `Controller` : - [ ] `Response` / `Request` : **수정 내역**: 1. `VideoCompletedEvent` 신규 생성 (memberId, videoId, courseId 포함) 2. `CompleteVideoService`에서 영상 완료 시 `VideoCompletedEvent` 발행 3. `RankingScoreUpdater`에 `handle(VideoCompletedEvent)` 리스너 추가 → `incrementScore(LESSON, period, memberId, 1L)` 호출 ## 🚨 검증 및 회귀 방지 (TestCode) - [ ] 버그를 재현하는 실패 테스트 케이스 작성 - [ ] 로직 수정 후 정상 통과 확인 - [ ] 예외(Exception) 처리 로직 보완 및 `assertThrows` 검증 완료 ## 📸 로그 및 참고 자료 - `RankingScoreUpdater.java` — STUDY_TIME 구현 패턴 참고 - `CompleteVideoService.java` — 이벤트 발행 위치
📊 버그 심각도 및 우선순위
P0: 서비스 핵심 동작 장애 (긴급 핫픽스 필요)P1: 주요 기능 오작동 및 예외 처리 누락P2: 마이너한 버그 및 시스템 영향이 적은 오류🐛 문제 상황 (현상)
연관 이슈 번호: -연관 도메인: ranking, learning_activity문제 설명: 수강량 랭킹(RankingMetric.LESSON)이 항상 빈 상태.GetLessonRankingService(읽기)는 구현되어 있으나, Redis ZSet에 점수를 기록하는 writer가 전혀 없어서 구조적으로 항상 0건.🔄 재현 방법 (Steps to Reproduce)
POST /api/learning/videos/{id}/complete)🕵️♂️ 원인 분석 및 수정 내역
Model/Policy:UseCase/Command:CompleteVideoService.java— 영상 완료 처리 후 이벤트를 발행하지 않음.VideoCompletedEvent자체가 없음.Service:Port/Adapter:RankingScoreUpdater.java—STUDY_TIME(StudySessionEndedEvent) 리스너만 존재.LESSON리스너 없음.Repository:Controller:Response/Request:수정 내역:
VideoCompletedEvent신규 생성 (memberId, videoId, courseId 포함)CompleteVideoService에서 영상 완료 시VideoCompletedEvent발행RankingScoreUpdater에handle(VideoCompletedEvent)리스너 추가 →incrementScore(LESSON, period, memberId, 1L)호출🚨 검증 및 회귀 방지 (TestCode)
assertThrows검증 완료📸 로그 및 참고 자료
RankingScoreUpdater.java— STUDY_TIME 구현 패턴 참고CompleteVideoService.java— 이벤트 발행 위치