Skip to content

[FEAT] 순공시간 종료 이벤트 기반 랭킹 점수 반영 기능 추가 #241

Description

@dlxodus02

📊 개발 단계 및 우선순위

해당하는 우선순위에 체크해 주세요.

  • P0 : 서비스 핵심 동작
  • P1 : 운영 및 확장 기능
  • P2 : 부가적인 고도화 기능

🎯 도메인 연관 관계 및 완료 조건 (Definition of Done)

이 이슈가 완료되기 위해 충족해야 하는 조건들을 나열해 주세요.

  • 연관 도메인 : study_timer, ranking
  • 설명 : 순공시간 세션 종료 시 누적 학습 시간을 일별 통계에 반영하고, 트랜잭션 커밋 이후 랭킹 점수에 반영한다.
  • 스터디 타이머 세션 종료 시 이번 종료 요청으로 증가한 학습 시간 delta를 계산한다.
  • 세션 종료 정보가 정상 저장된다.
  • daily_study_stats에 회원/날짜 기준으로 학습 시간이 upsert 된다.
  • 세션 종료 후 StudySessionEndedEvent가 발행된다.
  • 트랜잭션 커밋 이후 랭킹 점수가 Redis daily/weekly/monthly 기준으로 증가한다.
  • Redis 반영 실패 시 주요 API 흐름은 실패하지 않고 로그만 남긴다.
  • 필요 시 RDB 기준으로 Redis 랭킹 데이터를 보정할 수 있는 rebuild scheduler를 제공한다.

💻 상세 작업 내용

클린 아키텍처(Clean Architecture) 구조에 맞춰 작업이 발생하는 계층에 체크하고 세부 내용을 작성해 주세요.

  • Model / Policy: 세션 종료 시 누적 학습 시간 및 delta 계산 규칙 확인
  • UseCase / Command: 기존 세션 종료 유스케이스 흐름에서 종료 결과와 학습 시간 delta를 다룰 수 있도록 정리
  • Service: EndStudyTimerSessionService에서 세션 종료 저장, daily_study_stats upsert, StudySessionEndedEvent 발행 처리
  • Port / Adapter: 랭킹 점수 증가를 위한 Redis adapter 또는 ranking port 연동
  • Repository: daily_study_stats 회원/날짜 기준 조회 및 upsert 처리
  • Controller: 기존 세션 종료 API 응답 형태 유지 여부 확인
  • response / request: API 응답값 변경이 없다면 기존 DTO 유지

🔔 이벤트 처리

  • StudySessionEndedEvent 정의
    • memberId
    • studyDate
    • deltaStudySeconds
    • endedAt
  • RankingScoreUpdater에서 AFTER_COMMIT 이벤트로 수신
  • Redis 랭킹 점수 증가 처리
    • daily ranking
    • weekly ranking
    • monthly ranking
  • Redis 반영 실패 시 예외를 전파하지 않고 로그만 남김

🕒 스케줄러 / 보정 작업

  • RankingRebuildScheduler 추가 검토
  • RDB daily_study_stats 기준으로 Redis 랭킹 점수 재계산
  • Redis 데이터 유실 또는 불일치 상황에서 복구 가능하도록 보정 흐름 마련

🚨 검증 및 예외 처리 (TestCode)

정상 작동뿐만 아니라, 잘못된 값이나 예외 상황에 대한 처리를 꼼꼼히 확인해 주세요.

  • 세션 종료 시 delta 학습 시간이 올바르게 계산되는지 테스트
  • 세션 종료 후 daily_study_stats가 정상 upsert 되는지 테스트
  • 세션 종료 트랜잭션 커밋 이후 StudySessionEndedEvent가 발행되는지 테스트
  • 이벤트 수신 후 Redis daily/weekly/monthly 점수가 증가하는지 테스트
  • Redis 반영 실패 시 세션 종료 API 흐름이 실패하지 않는지 테스트
  • 랭킹 rebuild scheduler가 RDB 기준으로 Redis 데이터를 보정하는지 테스트

🔗 참고 자료

  • API 명세 (문서 링크 첨부):

Metadata

Metadata

Assignees

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