📋 문제 설명
현재 투표 시스템에서는 개별 투표 참여 시에만 리워드가 지급되고 있습니다. 투표가 완료되었을 때 정답을 맞힌 참여자들에게 추가 리워드를 지급하는 기능이 필요합니다.
🎯 목표
투표가 최소 필요 가중치(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)
↓
리워드 처리 결과 로깅
✅ 인수 기준
기능 요구사항
기술 요구사항
성능 요구사항
🧪 테스트 계획
Unit Tests
Integration Tests
🔧 기술 세부사항
동시성 제어
LockManager.multipleUserLock 사용하여 여러 사용자에 대한 티켓 지급 시 동시성 보장
- 기존
LockManager의 다중 사용자 락 기능 활용
트랜잭션 관리
@Transactional을 통한 완료 리워드 처리 전체의 원자성 보장
- 일부 사용자 티켓 지급 실패 시 전체 롤백으로 데이터 일관성 유지
에러 핸들링
- 투표 완료 리워드 처리 실패가 투표 완료 자체에 영향을 주지 않도록 예외 처리
- 적절한 로그 레벨과 메시지로 디버깅 지원
📝 완료 정의 (Definition of Done)
🔗 관련 이슈
- 기존 투표 시스템: #[관련 이슈 번호]
- 티켓 시스템: #[관련 이슈 번호]
- 분산 락 시스템: #[관련 이슈 번호]
📋 문제 설명
현재 투표 시스템에서는 개별 투표 참여 시에만 리워드가 지급되고 있습니다. 투표가 완료되었을 때 정답을 맞힌 참여자들에게 추가 리워드를 지급하는 기능이 필요합니다.
🎯 목표
투표가 최소 필요 가중치(50점)에 도달하여 완료될 때, 최종 투표 결과와 일치하는 판단을 한 사용자들에게 자동으로 티켓 1개씩을 지급하는 시스템을 구현합니다.
🔄 사용자 플로우
🏗️ 구현 모듈
1. VoteCompletionRewardService
src/main/java/hanium/modic/backend/domain/vote/service/VoteCompletionRewardService.javaprocessCompletionReward(Long voteId)2. SimilarityVoteResultRepository 확장
src/main/java/hanium/modic/backend/domain/vote/repository/SimilarityVoteResultRepository.javafindByVoteIdAndDecision(Long voteId, VoteDecision decision)3. VotingService 확장
src/main/java/hanium/modic/backend/domain/vote/service/VotingService.javacheckAndCompleteVote메서드에 완료 리워드 처리 로직 추가📊 데이터 플로우
✅ 인수 기준
기능 요구사항
기술 요구사항
성능 요구사항
🧪 테스트 계획
Unit Tests
processCompletionReward_Success: 정답 참여자들에게 티켓 지급processCompletionReward_VoteNotFound: 존재하지 않는 투표 예외 처리processCompletionReward_AllWrongAnswers: 모든 참여자가 오답인 경우processCompletionReward_TicketDistributionFails: 티켓 지급 실패 시 롤백processCompletionReward_LockAcquisitionFails: 락 획득 실패 예외 처리Integration Tests
🔧 기술 세부사항
동시성 제어
LockManager.multipleUserLock사용하여 여러 사용자에 대한 티켓 지급 시 동시성 보장LockManager의 다중 사용자 락 기능 활용트랜잭션 관리
@Transactional을 통한 완료 리워드 처리 전체의 원자성 보장에러 핸들링
📝 완료 정의 (Definition of Done)
🔗 관련 이슈