Skip to content

투표 시스템 구현 (Voting System Implementation) #168

@goalSetter09

Description

@goalSetter09

🗳️ 투표 시스템 구현

📋 개요

AI 생성 이미지와 원작 이미지 간의 유사성을 커뮤니티가 투표로 판단하는 시스템을 구현합니다.

🎯 핵심 기능

  • AI + 인간 투표: AI 20표 + 인간 30표 = 총 50표로 결정
  • 랜덤 투표 목록: 공정한 투표 기회 분배를 위한 랜덤 조회
  • 실시간 집계: 투표 즉시 결과 반영
  • 권한 제어: 파생/원작 이미지 소유자 투표 제한

🔄 투표 플로우

  1. 투표 생성: 파생 포스트 생성 → PENDING 상태 → AI MQ 요청
  2. AI 판단: AI 유사성 판단 → 20표 반영 → IN_PROGRESS 변경
  3. 인간 투표: 커뮤니티 참여 → 1표씩 누적 → 실시간 업데이트
  4. 완료 처리: 50표 달성 → 과반수 결정 → 포스트 활성화/비활성화

📚 관련 문서

🏗️ 주요 구현 항목

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

Metadata

Metadata

Assignees

No one assigned

    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