-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
📋 문제 설명
현재 투표 시스템에서는 개별 투표 참여 시에만 리워드가 지급되고 있습니다. 투표가 완료되었을 때 정답을 맞힌 참여자들에게 추가 리워드를 지급하는 기능이 필요합니다.
🎯 목표
투표가 최소 필요 가중치(50점)에 도달하여 완료될 때, 최종 투표 결과와 일치하는 판단을 한 사용자들에게 자동으로 티켓 1개씩을 지급하는 시스템을 구현합니다.
🔄 사용자 플로우
- 사용자가 투표에 참여
- 투표가 최소 필요 가중치(50점)에 도달하여 완료 상태로 변경
- 시스템이 투표 완료를 감지하고 자동으로 리워드 처리 시작
- 최종 투표 결과와 일치하는 판단을 한 유저들만 조회
- 각 유저에 대해 분산락을 사용하여 티켓 1개씩 지급
- 리워드 처리 결과 로깅
🏗️ 구현 모듈
1. VoteCompletionRewardService
- 위치:
src/main/java/hanium/modic/backend/domain/vote/service/VoteCompletionRewardService.java - 책임: 투표 완료 시 단체 리워드 처리 비즈니스 로직
- 주요 메서드:
processCompletionReward(Long voteId)
2. SimilarityVoteResultRepository 확장
- 위치:
src/main/java/hanium/modic/backend/domain/vote/repository/SimilarityVoteResultRepository.java - 추가 메서드:
findByVoteIdAndDecision(Long voteId, VoteDecision decision)
3. VotingService 확장
- 위치:
src/main/java/hanium/modic/backend/domain/vote/service/VotingService.java - 수정사항:
checkAndCompleteVote메서드에 완료 리워드 처리 로직 추가
📊 데이터 플로우
투표 완료 감지
↓
투표 존재 여부 및 최종 결과 확인
↓
정답 참여자만 조회 (Direct Query)
↓
분산락을 통한 동시성 제어
↓
티켓 지급 (TicketService.giveRewardTicket)
↓
리워드 처리 결과 로깅
✅ 인수 기준
기능 요구사항
- 투표가 완료되면 자동으로 리워드 처리가 시작된다
- 최종 투표 결과와 일치하는 판단을 한 사용자들만 조회된다
- 정답 참여자들에게 티켓 1개씩이 지급된다
- 모든 참여자가 오답인 경우 아무도 티켓을 받지 않는다
- 존재하지 않는 투표에 대한 처리 시 적절한 예외가 발생한다
기술 요구사항
- 분산락을 사용하여 동시성을 제어한다
- 트랜잭션을 통해 원자성을 보장한다
- 티켓 지급 실패 시 전체 작업이 롤백된다
- 리워드 처리 실패가 투표 완료 처리에 영향을 주지 않는다
- 적절한 로깅이 수행된다
성능 요구사항
- 기존 인덱스를 활용하여 효율적으로 동작한다
- 다중 사용자 락 기능을 활용한다
🧪 테스트 계획
Unit Tests
-
processCompletionReward_Success: 정답 참여자들에게 티켓 지급 -
processCompletionReward_VoteNotFound: 존재하지 않는 투표 예외 처리 -
processCompletionReward_AllWrongAnswers: 모든 참여자가 오답인 경우 -
processCompletionReward_TicketDistributionFails: 티켓 지급 실패 시 롤백 -
processCompletionReward_LockAcquisitionFails: 락 획득 실패 예외 처리
Integration Tests
- 전체 투표 완료 플로우에서 리워드 처리 통합 테스트
- 동시성 시나리오 테스트
🔧 기술 세부사항
동시성 제어
LockManager.multipleUserLock사용하여 여러 사용자에 대한 티켓 지급 시 동시성 보장- 기존
LockManager의 다중 사용자 락 기능 활용
트랜잭션 관리
@Transactional을 통한 완료 리워드 처리 전체의 원자성 보장- 일부 사용자 티켓 지급 실패 시 전체 롤백으로 데이터 일관성 유지
에러 핸들링
- 투표 완료 리워드 처리 실패가 투표 완료 자체에 영향을 주지 않도록 예외 처리
- 적절한 로그 레벨과 메시지로 디버깅 지원
📝 완료 정의 (Definition of Done)
- 모든 코드가 구현되고 코드 리뷰가 완료됨
- 모든 단위 테스트가 작성되고 통과함
- 통합 테스트가 작성되고 통과함
- 기능이 개발 환경에서 정상 동작함
- 문서화가 완료됨 (JavaDoc, 코드 주석)
- 성능 테스트가 완료됨
🔗 관련 이슈
- 기존 투표 시스템: #[관련 이슈 번호]
- 티켓 시스템: #[관련 이슈 번호]
- 분산 락 시스템: #[관련 이슈 번호]
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels