-
Notifications
You must be signed in to change notification settings - Fork 1
Closed
Description
🗳️ 투표 시스템 구현
📋 개요
AI 생성 이미지와 원작 이미지 간의 유사성을 커뮤니티가 투표로 판단하는 시스템을 구현합니다.
🎯 핵심 기능
- AI + 인간 투표: AI 20표 + 인간 30표 = 총 50표로 결정
- 랜덤 투표 목록: 공정한 투표 기회 분배를 위한 랜덤 조회
- 실시간 집계: 투표 즉시 결과 반영
- 권한 제어: 파생/원작 이미지 소유자 투표 제한
🔄 투표 플로우
- 투표 생성: 파생 포스트 생성 → PENDING 상태 → AI MQ 요청
- AI 판단: AI 유사성 판단 → 20표 반영 → IN_PROGRESS 변경
- 인간 투표: 커뮤니티 참여 → 1표씩 누적 → 실시간 업데이트
- 완료 처리: 50표 달성 → 과반수 결정 → 포스트 활성화/비활성화
📚 관련 문서
- 설계 문서: docs/06-voting-system-design.md
- 작업 목록: task.md
🏗️ 주요 구현 항목
Database & Entity
- 3개 테이블 migration (similarity_vote, similarity_vote_result, similarity_vote_summary)
- 3개 enum 클래스 (VoteStatus, VoteDecision, VoteType)
- 3개 entity 클래스 구현
Message Queue Integration
- RabbitMQ 설정 확장 (AI 유사성 판단 큐)
- AI 요청/응답 메시지 DTO
- AI 결과 리스너 구현
Service Layer
- VotingService (투표 참여, 분산락 제어)
- VoteQueryService (랜덤 조회, 페이지네이션)
- VoteSummaryService (집계 계산, 최종 결정)
- 기존 AiDerivedPostService 수정
Web Layer
- VoteController (4개 API 엔드포인트)
- 5개 DTO 클래스 구현
- CreateAiDerivedPostRequest 필드 추가
Business Logic
- 투표 생성 플로우 (PENDING → IN_PROGRESS → COMPLETED)
- AI 연동 플로우 (MQ 요청 → 결과 처리)
- 투표 참여 플로우 (권한 검증 → 즉시 집계)
- 완료 처리 플로우 (과반수 결정 → 포스트 상태 업데이트)
🔧 기술적 고려사항
- 분산락: Redisson을 통한 동시성 제어
- 랜덤 조회:
ORDER BY RAND()+ 의미있는 페이지네이션 - 이미지 URL: ImageUtil을 통한 presigned URL 생성
- 에러 처리: 커스텀 ErrorCode + GlobalExceptionHandler
✅ 완료 기준
- AI 파생 포스트 생성 시 투표 자동 시작
- AI 20표 + 인간 30표 시스템 정상 작동
- 랜덤 투표 목록 조회 가능
- 권한 제어 (파생/원작 소유자 투표 불가)
- 실시간 투표 집계 및 포스트 상태 업데이트
- Swagger UI에서 모든 API 테스트 가능
📊 작업 규모
총 11개 섹션 77개 작업 항목
Label: enhancement, voting-system
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels