@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