mirror of
https://github.com/ktds-dg0501/kt-event-marketing-fe.git
synced 2025-12-06 09:36:23 +00:00
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
199 lines
6.5 KiB
Plaintext
199 lines
6.5 KiB
Plaintext
@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
|