| 항목 | 내용 |
|---|---|
| Context명 | 투표 |
| 영문명 | Voting |
| 도메인 분류 | Core |
| 담당 팀 | Backend Team |
| 작성일 | 2025-12-28 |
Voting Context는 FanPulse의 핵심 기능인 팬 참여형 투표 시스템을 담당합니다. 글로벌 팬들이 아티스트, 노래, MV 등 다양한 카테고리에서 투표에 참여하고, 실시간으로 랭킹을 확인할 수 있습니다. 투표권 관리와 중복 투표 방지를 통해 투표의 공정성을 보장합니다.
| 한글 | 영문 | 정의 |
|---|---|---|
| 투표 | Poll | 팬들이 참여할 수 있는 투표 이벤트 |
| 투표 옵션 | VoteOption | 투표에서 선택 가능한 후보 항목 |
| 투표권 | VotingPower | 사용자가 보유한 투표 가능 횟수 |
| 일일 투표권 | DailyVotes | 매일 리셋되는 기본 투표권 (FREE: 1, VIP: 3) |
| 보너스 투표권 | BonusVotes | 광고 시청 등으로 획득한 추가 투표권 |
| 투표하기 | CastVote | 특정 옵션에 투표를 행사하는 행위 |
| Aggregate | 설명 | Root Entity |
|---|---|---|
| Poll | 투표 이벤트 및 옵션 관리 | Poll |
| VotingPower | 사용자별 투표권 관리 | VotingPower |
| Vote | 개별 투표 기록 | Vote |
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):
핵심 행위:
create(): 새 투표 생성, PollCreated 이벤트 발행addOption(): 투표 옵션 추가close(): 투표 마감, PollClosed 이벤트 발행getResults(): 현재 투표 결과 조회isActive(): 투표 진행 중 여부 확인