@startuml 성과분석플로우_외부시퀀스
!theme mono

title 성과 분석 플로우 - 외부 시퀀스 다이어그램\n(UFR-ANAL-010: 실시간 성과분석 대시보드 조회)

actor "소상공인" as User
participant "Frontend" as FE
participant "API Gateway" as GW
participant "Analytics Service" as Analytics
participant "Redis Cache\n(TTL 1시간)" as Redis
participant "Analytics DB" as AnalyticsDB
participant "Kafka\n(Event Topics)" as Kafka

note over AnalyticsDB
    **배치 처리로 수집된 데이터**
    - 외부 채널 통계는 배치 작업으로
      주기적으로 수집하여 DB에 저장
    - 목업 데이터로 시작, 점진적으로 실제 API 연동
end note

== 1. 대시보드 조회 - Cache HIT 시나리오 ==

User -> FE: 성과분석 대시보드 접근\n(Bottom Nav "분석" 탭 클릭)
activate FE

FE -> GW: GET /api/events/{id}/analytics\n+ Authorization: Bearer {token}
activate GW

GW -> GW: JWT 토큰 검증
GW -> Analytics: GET /api/events/{id}/analytics
activate Analytics

Analytics -> Redis: 대시보드 캐시 조회\n(캐시키: analytics:dashboard:{eventId})
activate Redis
Redis --> Analytics: **Cache HIT**\n캐시된 대시보드 데이터 반환
deactivate Redis

note right of Analytics
    **Cache-Aside 패턴**
    - TTL: 1시간
    - 예상 크기: 5KB
    - 히트율 목표: 95%
    - 응답 시간: 0.5초
end note

Analytics --> GW: 200 OK\n대시보드 데이터 (JSON)
deactivate Analytics

GW --> FE: 200 OK\n대시보드 데이터
deactivate GW

FE -> FE: 대시보드 렌더링\n- 4개 요약 카드\n- 채널별 성과 차트\n- 시간대별 참여 추이
FE --> User: 실시간 대시보드 표시
deactivate FE

== 2. 대시보드 조회 - Cache MISS 시나리오 ==

User -> FE: 대시보드 새로고침\n또는 첫 조회
activate FE

FE -> GW: GET /api/events/{id}/analytics
activate GW

GW -> Analytics: GET /api/events/{id}/analytics
activate Analytics

Analytics -> Redis: 대시보드 캐시 조회\n(캐시키: analytics:dashboard:{eventId})
activate Redis
Redis --> Analytics: **Cache MISS**\nnull 반환
deactivate Redis

note right of Analytics
    **데이터 통합 작업 시작**
    - Analytics DB 조회
    - 외부 채널 API 병렬 호출
    - Circuit Breaker 적용
end note

|||
== 2.1. Analytics DB 조회 (로컬 데이터) ==

Analytics -> AnalyticsDB: 이벤트 통계 조회\n(이벤트ID로 통계 데이터 조회)
activate AnalyticsDB
AnalyticsDB --> Analytics: 이벤트 통계\n- 총 참여자 수\n- 예상 ROI\n- 매출 증가율
deactivate AnalyticsDB

|||
== 2.2. 배치 수집된 채널 통계 데이터 조회 ==

Analytics -> AnalyticsDB: 채널별 통계 조회\n(배치로 수집된 채널 데이터 조회)
activate AnalyticsDB

note right of Analytics
    **배치 처리 방식**
    - 외부 API는 별도 배치 작업으로 주기적 수집
    - 수집된 데이터는 DB에 저장
    - 대시보드에서는 DB 데이터만 조회
    - 응답 시간 단축 및 외부 API 의존성 제거
end note

AnalyticsDB --> Analytics: 채널별 통계 데이터\n- 우리동네TV: 노출 5,000, 조회 1,200\n- 지니TV: 노출 10,000, 클릭 500\n- Instagram: 좋아요 300, 댓글 50\n- Naver: 조회 2,000\n- Kakao: 공유 100
deactivate AnalyticsDB

note right of Analytics
    **목업 데이터 활용**
    - 초기에는 목업 데이터로 시작
    - 점진적으로 실제 배치 작업 구현
    - 배치 주기: 5분마다 수집
end note

|||
== 2.3. 데이터 통합 및 ROI 계산 ==

Analytics -> Analytics: 데이터 통합 및 계산\n- 총 노출 수 = 외부 채널 노출 합계\n- 총 참여자 수 = Analytics DB\n- ROI 계산 = (수익 - 비용) / 비용 × 100\n- 채널별 전환율 계산

note right of Analytics
    **ROI 계산 로직**
    총 비용 = 경품 비용 + 플랫폼 비용
    예상 수익 = 매출 증가액 + 신규 고객 LTV
    투자 대비 수익률 = (수익 - 비용) / 비용 × 100
end note

|||
== 2.4. Redis 캐싱 및 응답 ==

Analytics -> Redis: 대시보드 데이터 캐시 저장\n(캐시키: analytics:dashboard:{eventId},\n값: 통합 데이터, TTL: 1시간)
activate Redis
Redis --> Analytics: OK
deactivate Redis

Analytics --> GW: 200 OK\n대시보드 데이터 (JSON)\n{\n  총참여자: 1,234,\n  총노출: 17,200,\n  ROI: 250%,\n  채널별성과: [...]\n}
deactivate Analytics

GW --> FE: 200 OK\n대시보드 데이터
deactivate GW

FE -> FE: 대시보드 렌더링\n- 4개 요약 카드 표시\n- 채널별 성과 차트\n- 시간대별 참여 추이\n- 참여자 프로필 분석
FE --> User: 실시간 대시보드 표시\n(응답 시간: 3초)
deactivate FE

|||
== 3. 실시간 업데이트 (Background Event 구독) ==

note over Analytics, Kafka
    **Analytics Service는 항상 Background에서
    Kafka Event Topics를 구독하여
    실시간으로 통계를 업데이트합니다**
end note

Kafka -> Analytics: **EventCreated** 이벤트\n{eventId, storeId, title, objective}
activate Analytics
Analytics -> AnalyticsDB: 이벤트 통계 초기화\n(이벤트 기본 정보 저장)
activate AnalyticsDB
AnalyticsDB --> Analytics: OK
deactivate AnalyticsDB
Analytics -> Redis: 캐시 무효화\n(캐시키 삭제: analytics:dashboard:{eventId})
activate Redis
Redis --> Analytics: OK
deactivate Redis
deactivate Analytics

...참여자 등록 시...

Kafka -> Analytics: **ParticipantRegistered** 이벤트\n{participantId, eventId, phoneNumber}
activate Analytics
Analytics -> AnalyticsDB: 참여자 수 업데이트\n(참여자 수 1 증가)
activate AnalyticsDB
AnalyticsDB --> Analytics: OK
deactivate AnalyticsDB
Analytics -> Redis: 캐시 무효화\n(캐시키 삭제: analytics:dashboard:{eventId})
activate Redis
Redis --> Analytics: OK
deactivate Redis
deactivate Analytics

...배포 완료 시...

Kafka -> Analytics: **DistributionCompleted** 이벤트\n{eventId, distributedChannels, completedAt}
activate Analytics
Analytics -> AnalyticsDB: 채널 통계 저장\n(배포 완료된 채널 정보 저장)
activate AnalyticsDB
AnalyticsDB --> Analytics: OK
deactivate AnalyticsDB
Analytics -> Redis: 캐시 무효화\n(캐시키 삭제: analytics:dashboard:{eventId})
activate Redis
Redis --> Analytics: OK
deactivate Redis
deactivate Analytics

note right of Analytics
    **실시간 업데이트 메커니즘**
    - EventCreated: 이벤트 기본 정보 초기화
    - ParticipantRegistered: 참여자 수 실시간 증가
    - DistributionCompleted: 배포 채널 통계 업데이트
    - 캐시 무효화: 다음 조회 시 최신 데이터 갱신
end note

@enduml
