Voting Context 정의서

Context 정보

항목 내용
Context명 투표
영문명 Voting
도메인 분류 Core
담당 팀 Backend Team
작성일 2025-12-28

개요

Voting Context는 FanPulse의 핵심 기능인 팬 참여형 투표 시스템을 담당합니다. 글로벌 팬들이 아티스트, 노래, MV 등 다양한 카테고리에서 투표에 참여하고, 실시간으로 랭킹을 확인할 수 있습니다. 투표권 관리와 중복 투표 방지를 통해 투표의 공정성을 보장합니다.

핵심 책임

  1. 투표 관리: 투표 생성, 옵션 관리, 투표 마감
  2. 투표 참여: 투표권 검증, 투표 처리, 중복 방지
  3. 투표권 관리: 일일 투표권 리셋, 보너스 투표권 부여
  4. 결과 집계: 실시간 투표 현황, 랭킹 계산

Ubiquitous Language

한글 영문 정의
투표 Poll 팬들이 참여할 수 있는 투표 이벤트
투표 옵션 VoteOption 투표에서 선택 가능한 후보 항목
투표권 VotingPower 사용자가 보유한 투표 가능 횟수
일일 투표권 DailyVotes 매일 리셋되는 기본 투표권 (FREE: 1, VIP: 3)
보너스 투표권 BonusVotes 광고 시청 등으로 획득한 추가 투표권
투표하기 CastVote 특정 옵션에 투표를 행사하는 행위

Aggregate 목록

Aggregate 설명 Root Entity
Poll 투표 이벤트 및 옵션 관리 Poll
VotingPower 사용자별 투표권 관리 VotingPower
Vote 개별 투표 기록 Vote

Aggregate 상세

Poll Aggregate

classDiagram
    class Poll {
        <<Aggregate Root>>
        +PollId id
        +Title title
        +Description description
        +Category category
        +CreatedAt createdAt
        +ExpiresAt expiresAt
        +Status status
        +List~VoteOption~ options
        +create(command: CreatePollCommand): Poll
        +addOption(command: AddOptionCommand): void
        +close(): void
        +getResults(): PollResults
        +isActive(): Boolean
    }

    class PollId {
        <<Value Object>>
        +UUID value
    }

    class Title {
        <<Value Object>>
        +String value
        +validate(): Boolean
    }

    class Category {
        <<Value Object>>
        ARTIST
        SONG
        MV
        OTHER
    }

    class Status {
        <<Value Object>>
        ACTIVE
        CLOSED
        CANCELLED
    }

    class VoteOption {
        <<Entity>>
        +OptionId id
        +PollId pollId
        +OptionText text
        +ImageUrl imageUrl
        +VoteCount voteCount
        +incrementCount(): void
    }

    class VoteCount {
        <<Value Object>>
        +Long value
        +increment(): VoteCount
    }

    Poll *-- PollId
    Poll *-- Title
    Poll *-- Category
    Poll *-- Status
    Poll "1" *-- "1..*" VoteOption
    VoteOption *-- VoteCount

불변식 (Invariants):

  1. 투표는 최소 2개 이상의 옵션을 가져야 한다
  2. 마감된 투표에는 옵션을 추가할 수 없다
  3. 마감일은 현재 시간 이후여야 한다
  4. 투표 제목은 5~100자 사이여야 한다

핵심 행위: