Skip to content

투표 완료 시 단체 리워드 시스템 구현 #185

@goalSetter09

Description

@goalSetter09

📋 문제 설명

현재 투표 시스템에서는 개별 투표 참여 시에만 리워드가 지급되고 있습니다. 투표가 완료되었을 때 정답을 맞힌 참여자들에게 추가 리워드를 지급하는 기능이 필요합니다.

🎯 목표

투표가 최소 필요 가중치(50점)에 도달하여 완료될 때, 최종 투표 결과와 일치하는 판단을 한 사용자들에게 자동으로 티켓 1개씩을 지급하는 시스템을 구현합니다.

🔄 사용자 플로우

  1. 사용자가 투표에 참여
  2. 투표가 최소 필요 가중치(50점)에 도달하여 완료 상태로 변경
  3. 시스템이 투표 완료를 감지하고 자동으로 리워드 처리 시작
  4. 최종 투표 결과와 일치하는 판단을 한 유저들만 조회
  5. 각 유저에 대해 분산락을 사용하여 티켓 1개씩 지급
  6. 리워드 처리 결과 로깅

🏗️ 구현 모듈

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, 코드 주석)
  • 성능 테스트가 완료됨

🔗 관련 이슈

  • 기존 투표 시스템: #[관련 이슈 번호]
  • 티켓 시스템: #[관련 이슈 번호]
  • 분산 락 시스템: #[관련 이슈 번호]

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions