<aside> 📌
공연 도메인은 BScene 플랫폼 내 콘서트 및 이벤트의 생명주기를 관리합니다. 밴드가 공연을 등록하고 홍보할 수 있는 도구를 제공하며, 팬 홈 대시보드를 통해 통합된 탐색 경험을 제공합니다. 접근 권한은 제한되어 있으며, 검증된 밴드 멤버만 자신이 속한 밴드의 공연을 생성하거나 수정할 수 있습니다(PerformanceService.java 55~57번째 줄).
| 개념 | 코드 엔티티 / Enum | 위치 |
|---|---|---|
| 공연 데이터 | Performance | domain/performance/entity/Performance.java |
| 메타데이터 태그 | PerformanceTag | domain/performance/entity/PerformanceTag.java |
| 이벤트 상태 | PerformanceStatus (ACTIVE, DELETED) | domain/performance/enums/PerformanceStatus.java |
| 연령 제한 | AgeRating (ALL, OVER_12, OVER_15, OVER_19) | domain/performance/enums/AgeRating.java |
Performance 엔티티는 밴드와 연결된 예정 콘서트를 나타냅니다. 주요 메타데이터로는 공연장(venue), 티켓 가격(ticket price), 공연 일시(performance date), 장르(genre), 지역(region)이 있습니다.
밴드가 PerformanceController.createPerformance를 통해 공연을 등록하면, 시스템은 PerformanceChangedEvent를 통해 Elasticsearch 인덱싱을 트리거하고, 트랜잭션 커밋 이후 밴드 팔로워에게 푸시 알림을 발송합니다.
PerformanceParticipation 엔티티가 팬의 참여 상태 전이를 관리합니다.
stateDiagram-v2
[*] --> SCHEDULED : "팬이 알람 활성화 (ensureInterest 자동 실행)"
SCHEDULED --> COMPLETED : "공연 시작 이후 팬이 참여 확정"
PerformanceInterest 엔티티는 팬이 알람 여부와 무관하게 공연을 독립적으로 북마크할 수 있도록 하며, 알람을 설정하면 ensureInterest를 통해 관심 상태가 자동으로 보장됩니다.
PerformanceParticipationRepository.findReminderTargets의 복합 쿼리 로직을 통해 리마인더 대상을 식별합니다.
푸시 알림은 PerformancePushMessage.reminder를 사용하여 딥링크로 사용자를 공연 상세 화면으로 안내합니다. 공연당 태그(PerformanceTag)는 최대 8개로 제한됩니다.
FanHomeService는 크로스 도메인 코디네이터 역할을 수행하며, Port-and-Adapter 패턴을 사용하여 다른 도메인의 내부 구현에 직접 의존하지 않고 데이터를 조회합니다(41~45번째 줄).
flowchart TD
A["getFanHome 호출"] --> B{"팔로우한 밴드에 활성 예정 공연 존재?"}
B -- "예" --> C["UPCOMING: 팔로우한 밴드 공연 표시"]
B -- "아니오" --> D["RECOMMENDED: 전역 인기 공연으로 대체"]
| 기능 | Endpoint | 정렬 로직 | 로직 위치 |
|---|---|---|---|
| 다가오는 공연 목록 | /performances/upcoming | IMMINENT / LATEST / POPULAR | PerformanceRepository.java#L70-L106 |
| 추천 | /performances/recommend | POPULAR / IMMINENT | PerformanceRepository.java#L109-L134 |
| 날짜별 조회 | /performances/by-date | 시간 오름차순 | PerformanceRepository.java#L149-L152 |
| 캠린더 | /performances/calendar | 날짜 Distinct | PerformanceRepository.java#L137-L141 |
Post 도메인의 FanHomeAdapter는 뉴스 피드를 구성하기 위해 정확히 3번의 쿼리를 실행합니다.
sequenceDiagram
participant Fan as "FanHomeService"
participant Adapter as "Post:FanHomeAdapter"
participant PostRepo as "PostRepository"
Fan->>Adapter: "getFollowingBandNews(bandIds)"
Adapter->>PostRepo: "1) Post + Band 조인 조회"
Adapter->>PostRepo: "2) PostMedia IN 절 조회"
Adapter->>PostRepo: "3) PostTag IN 절 조회"
Adapter->>Adapter: "Collectors.groupingBy로 메모리 내 그룹화"
Adapter-->>Fan: "FollowingBandNewsResponse 목록"