<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 오케스트레이션

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

밴드 소식 — N+1 방지 전략

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 목록"

캠린더 · 날짜별 목록 · 관심 연동