✨ 주요 기능 - Azure 기반 물리아키텍처 설계 (개발환경/운영환경) - 7개 마이크로서비스 물리 구조 설계 - 네트워크 아키텍처 다이어그램 작성 (Mermaid) - 환경별 비교 분석 및 마스터 인덱스 문서 📁 생성 파일 - design/backend/physical/physical-architecture.md (마스터) - design/backend/physical/physical-architecture-dev.md (개발환경) - design/backend/physical/physical-architecture-prod.md (운영환경) - design/backend/physical/*.mmd (4개 Mermaid 다이어그램) 🎯 핵심 성과 - 비용 최적화: 개발환경 월 $143, 운영환경 월 $2,860 - 확장성: 개발환경 100명 → 운영환경 10,000명 (100배) - 가용성: 개발환경 95% → 운영환경 99.9% - 보안: 다층 보안 아키텍처 (L1~L4) 🛠️ 기술 스택 - Azure Kubernetes Service (AKS) - Azure Database for PostgreSQL Flexible - Azure Cache for Redis Premium - Azure Service Bus Premium - Application Gateway + WAF 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
535 lines
15 KiB
Plaintext
535 lines
15 KiB
Plaintext
@startuml
|
|
!theme mono
|
|
|
|
title Analytics Service 클래스 다이어그램 (요약)
|
|
|
|
' ============================================================
|
|
' Presentation Layer - Controller
|
|
' ============================================================
|
|
package "com.kt.event.analytics.controller" <<Rectangle>> #F0F8FF {
|
|
|
|
class AnalyticsDashboardController {
|
|
}
|
|
note right of AnalyticsDashboardController
|
|
**API Mapping:**
|
|
getEventAnalytics: GET /api/v1/events/{eventId}/analytics
|
|
- 성과 대시보드 조회
|
|
end note
|
|
|
|
class ChannelAnalyticsController {
|
|
}
|
|
note right of ChannelAnalyticsController
|
|
**API Mapping:**
|
|
getChannelAnalytics: GET /api/v1/events/{eventId}/analytics/channels
|
|
- 채널별 성과 분석
|
|
end note
|
|
|
|
class RoiAnalyticsController {
|
|
}
|
|
note right of RoiAnalyticsController
|
|
**API Mapping:**
|
|
getRoiAnalytics: GET /api/v1/events/{eventId}/analytics/roi
|
|
- 투자 대비 수익률 분석
|
|
end note
|
|
|
|
class TimelineAnalyticsController {
|
|
}
|
|
note right of TimelineAnalyticsController
|
|
**API Mapping:**
|
|
getTimelineAnalytics: GET /api/v1/events/{eventId}/analytics/timeline
|
|
- 시간대별 참여 추이 분석
|
|
end note
|
|
|
|
class UserAnalyticsDashboardController {
|
|
}
|
|
note right of UserAnalyticsDashboardController
|
|
**API Mapping:**
|
|
getUserEventAnalytics: GET /api/v1/users/{userId}/analytics
|
|
- 사용자 전체 이벤트 성과 대시보드
|
|
end note
|
|
|
|
class UserChannelAnalyticsController {
|
|
}
|
|
note right of UserChannelAnalyticsController
|
|
**API Mapping:**
|
|
getUserChannelAnalytics: GET /api/v1/users/{userId}/analytics/channels
|
|
- 사용자 채널별 성과 분석
|
|
end note
|
|
|
|
class UserRoiAnalyticsController {
|
|
}
|
|
note right of UserRoiAnalyticsController
|
|
**API Mapping:**
|
|
getUserRoiAnalytics: GET /api/v1/users/{userId}/analytics/roi
|
|
- 사용자 ROI 분석
|
|
end note
|
|
|
|
class UserTimelineAnalyticsController {
|
|
}
|
|
note right of UserTimelineAnalyticsController
|
|
**API Mapping:**
|
|
getUserTimelineAnalytics: GET /api/v1/users/{userId}/analytics/timeline
|
|
- 사용자 시간대별 분석
|
|
end note
|
|
}
|
|
|
|
' ============================================================
|
|
' Business Layer - Service
|
|
' ============================================================
|
|
package "com.kt.event.analytics.service" <<Rectangle>> #E6F7E6 {
|
|
|
|
class AnalyticsService {
|
|
}
|
|
note right of AnalyticsService
|
|
**핵심 역할:**
|
|
- 대시보드 데이터 통합
|
|
- Redis 캐싱 (1시간 TTL)
|
|
- 외부 API 호출 조율
|
|
- ROI 계산 로직
|
|
end note
|
|
|
|
class ChannelAnalyticsService {
|
|
}
|
|
note right of ChannelAnalyticsService
|
|
**핵심 역할:**
|
|
- 채널별 성과 분석
|
|
- 채널 간 비교 분석
|
|
- 외부 채널 API 통합
|
|
end note
|
|
|
|
class RoiAnalyticsService {
|
|
}
|
|
note right of RoiAnalyticsService
|
|
**핵심 역할:**
|
|
- ROI 상세 분석
|
|
- 투자/수익 분석
|
|
- 비용 효율성 계산
|
|
end note
|
|
|
|
class TimelineAnalyticsService {
|
|
}
|
|
note right of TimelineAnalyticsService
|
|
**핵심 역할:**
|
|
- 시간대별 추이 분석
|
|
- 트렌드 분석
|
|
- 피크 시간 분석
|
|
end note
|
|
|
|
class UserAnalyticsService {
|
|
}
|
|
note right of UserAnalyticsService
|
|
**핵심 역할:**
|
|
- 사용자별 통합 분석
|
|
- 여러 이벤트 집계
|
|
end note
|
|
|
|
class UserChannelAnalyticsService {
|
|
}
|
|
note right of UserChannelAnalyticsService
|
|
**핵심 역할:**
|
|
- 사용자별 채널 분석
|
|
- 채널별 통합 성과
|
|
end note
|
|
|
|
class UserRoiAnalyticsService {
|
|
}
|
|
note right of UserRoiAnalyticsService
|
|
**핵심 역할:**
|
|
- 사용자별 ROI 분석
|
|
- 전체 투자/수익 계산
|
|
end note
|
|
|
|
class UserTimelineAnalyticsService {
|
|
}
|
|
note right of UserTimelineAnalyticsService
|
|
**핵심 역할:**
|
|
- 사용자별 시간대 분석
|
|
- 여러 이벤트 타임라인 통합
|
|
end note
|
|
|
|
class ExternalChannelService {
|
|
}
|
|
note right of ExternalChannelService
|
|
**외부 API 통합:**
|
|
- 우리동네TV API
|
|
- 지니TV API
|
|
- 링고비즈 API
|
|
- SNS APIs
|
|
- Circuit Breaker 패턴
|
|
- Fallback 처리
|
|
end note
|
|
|
|
class ROICalculator {
|
|
}
|
|
note right of ROICalculator
|
|
**ROI 계산 로직:**
|
|
- ROI 계산
|
|
- 비용 효율성 계산
|
|
- 수익 예측
|
|
end note
|
|
}
|
|
|
|
' ============================================================
|
|
' Data Access Layer - Repository
|
|
' ============================================================
|
|
package "com.kt.event.analytics.repository" <<Rectangle>> #FFF8DC {
|
|
|
|
interface EventStatsRepository {
|
|
}
|
|
note right of EventStatsRepository
|
|
**이벤트 통계 저장소**
|
|
JpaRepository 상속
|
|
end note
|
|
|
|
interface ChannelStatsRepository {
|
|
}
|
|
note right of ChannelStatsRepository
|
|
**채널 통계 저장소**
|
|
JpaRepository 상속
|
|
end note
|
|
|
|
interface TimelineDataRepository {
|
|
}
|
|
note right of TimelineDataRepository
|
|
**타임라인 데이터 저장소**
|
|
JpaRepository 상속
|
|
end note
|
|
}
|
|
|
|
' ============================================================
|
|
' Domain Layer - Entity
|
|
' ============================================================
|
|
package "com.kt.event.analytics.entity" <<Rectangle>> #FFFACD {
|
|
|
|
class EventStats {
|
|
}
|
|
note right of EventStats
|
|
**이벤트 통계 엔티티**
|
|
- 이벤트 기본 정보
|
|
- 참여자, 조회수
|
|
- ROI, 투자/수익 정보
|
|
end note
|
|
|
|
class ChannelStats {
|
|
}
|
|
note right of ChannelStats
|
|
**채널별 통계 엔티티**
|
|
- 채널명, 유형
|
|
- 노출/조회/클릭/참여/전환
|
|
- SNS 반응 (좋아요/댓글/공유)
|
|
- 링고비즈 통화 정보
|
|
- 배포 비용
|
|
end note
|
|
|
|
class TimelineData {
|
|
}
|
|
note right of TimelineData
|
|
**시간대별 데이터 엔티티**
|
|
- 시간별 참여자 수
|
|
- 조회수, 참여, 전환
|
|
- 누적 참여자 수
|
|
end note
|
|
}
|
|
|
|
' ============================================================
|
|
' DTO Layer
|
|
' ============================================================
|
|
package "com.kt.event.analytics.dto.response" <<Rectangle>> #E6E6FA {
|
|
|
|
class AnalyticsDashboardResponse {
|
|
}
|
|
note right of AnalyticsDashboardResponse
|
|
**대시보드 응답**
|
|
통합 성과 데이터
|
|
end note
|
|
|
|
class ChannelAnalyticsResponse {
|
|
}
|
|
note right of ChannelAnalyticsResponse
|
|
**채널 분석 응답**
|
|
채널별 상세 데이터
|
|
end note
|
|
|
|
class RoiAnalyticsResponse {
|
|
}
|
|
note right of RoiAnalyticsResponse
|
|
**ROI 분석 응답**
|
|
투자/수익 상세 데이터
|
|
end note
|
|
|
|
class TimelineAnalyticsResponse {
|
|
}
|
|
note right of TimelineAnalyticsResponse
|
|
**타임라인 분석 응답**
|
|
시간대별 추이 데이터
|
|
end note
|
|
|
|
class UserAnalyticsDashboardResponse {
|
|
}
|
|
note right of UserAnalyticsDashboardResponse
|
|
**사용자 대시보드 응답**
|
|
여러 이벤트 통합 데이터
|
|
end note
|
|
|
|
class UserChannelAnalyticsResponse {
|
|
}
|
|
note right of UserChannelAnalyticsResponse
|
|
**사용자 채널 분석 응답**
|
|
사용자별 채널 통합 데이터
|
|
end note
|
|
|
|
class UserRoiAnalyticsResponse {
|
|
}
|
|
note right of UserRoiAnalyticsResponse
|
|
**사용자 ROI 분석 응답**
|
|
사용자별 ROI 통합 데이터
|
|
end note
|
|
|
|
class UserTimelineAnalyticsResponse {
|
|
}
|
|
note right of UserTimelineAnalyticsResponse
|
|
**사용자 타임라인 분석 응답**
|
|
사용자별 타임라인 통합 데이터
|
|
end note
|
|
}
|
|
|
|
' ============================================================
|
|
' Messaging Layer - Kafka Consumer
|
|
' ============================================================
|
|
package "com.kt.event.analytics.messaging.consumer" <<Rectangle>> #FFE4E1 {
|
|
|
|
class EventCreatedConsumer {
|
|
}
|
|
note right of EventCreatedConsumer
|
|
**이벤트 생성 Consumer**
|
|
Topic: sample.event.created
|
|
- EventStats 초기화
|
|
- 멱등성 처리
|
|
- 캐시 무효화
|
|
end note
|
|
|
|
class ParticipantRegisteredConsumer {
|
|
}
|
|
note right of ParticipantRegisteredConsumer
|
|
**참여자 등록 Consumer**
|
|
Topic: sample.participant.registered
|
|
- 참여자 수 증가
|
|
- TimelineData 업데이트
|
|
- 캐시 무효화
|
|
end note
|
|
|
|
class DistributionCompletedConsumer {
|
|
}
|
|
note right of DistributionCompletedConsumer
|
|
**배포 완료 Consumer**
|
|
Topic: sample.distribution.completed
|
|
- ChannelStats 업데이트
|
|
- 배포 비용, 노출 수 저장
|
|
- 캐시 무효화
|
|
end note
|
|
}
|
|
|
|
package "com.kt.event.analytics.messaging.event" <<Rectangle>> #FFE4E1 {
|
|
|
|
class EventCreatedEvent {
|
|
}
|
|
|
|
class ParticipantRegisteredEvent {
|
|
}
|
|
|
|
class DistributionCompletedEvent {
|
|
}
|
|
}
|
|
|
|
' ============================================================
|
|
' Batch Layer
|
|
' ============================================================
|
|
package "com.kt.event.analytics.batch" <<Rectangle>> #FFF5EE {
|
|
|
|
class AnalyticsBatchScheduler {
|
|
}
|
|
note right of AnalyticsBatchScheduler
|
|
**배치 스케줄러**
|
|
- 5분 단위 캐시 갱신
|
|
- 초기 데이터 로딩
|
|
- 캐시 워밍업
|
|
end note
|
|
}
|
|
|
|
' ============================================================
|
|
' Configuration Layer
|
|
' ============================================================
|
|
package "com.kt.event.analytics.config" <<Rectangle>> #F5F5F5 {
|
|
|
|
class RedisConfig {
|
|
}
|
|
note right of RedisConfig
|
|
Redis 연결 설정
|
|
end note
|
|
|
|
class KafkaConsumerConfig {
|
|
}
|
|
note right of KafkaConsumerConfig
|
|
Kafka Consumer 설정
|
|
end note
|
|
|
|
class KafkaTopicConfig {
|
|
}
|
|
note right of KafkaTopicConfig
|
|
Kafka Topic 설정
|
|
end note
|
|
|
|
class Resilience4jConfig {
|
|
}
|
|
note right of Resilience4jConfig
|
|
Circuit Breaker 설정
|
|
end note
|
|
|
|
class SecurityConfig {
|
|
}
|
|
note right of SecurityConfig
|
|
Spring Security 설정
|
|
end note
|
|
|
|
class SwaggerConfig {
|
|
}
|
|
note right of SwaggerConfig
|
|
Swagger/OpenAPI 설정
|
|
end note
|
|
}
|
|
|
|
' ============================================================
|
|
' Common Components
|
|
' ============================================================
|
|
package "com.kt.event.common" <<Rectangle>> #DCDCDC {
|
|
|
|
abstract class BaseTimeEntity {
|
|
}
|
|
note right of BaseTimeEntity
|
|
JPA Auditing
|
|
- createdAt
|
|
- updatedAt
|
|
end note
|
|
|
|
class "ApiResponse<T>" {
|
|
}
|
|
note right of "ApiResponse<T>"
|
|
표준 API 응답 포맷
|
|
end note
|
|
|
|
interface ErrorCode {
|
|
}
|
|
|
|
class BusinessException {
|
|
}
|
|
}
|
|
|
|
' ============================================================
|
|
' Layer Relationships
|
|
' ============================================================
|
|
|
|
' Controller Layer -> Service Layer
|
|
AnalyticsDashboardController ..> AnalyticsService
|
|
ChannelAnalyticsController ..> ChannelAnalyticsService
|
|
RoiAnalyticsController ..> RoiAnalyticsService
|
|
TimelineAnalyticsController ..> TimelineAnalyticsService
|
|
UserAnalyticsDashboardController ..> UserAnalyticsService
|
|
UserChannelAnalyticsController ..> UserChannelAnalyticsService
|
|
UserRoiAnalyticsController ..> UserRoiAnalyticsService
|
|
UserTimelineAnalyticsController ..> UserTimelineAnalyticsService
|
|
|
|
' Service Layer -> Repository Layer
|
|
AnalyticsService ..> EventStatsRepository
|
|
AnalyticsService ..> ChannelStatsRepository
|
|
ChannelAnalyticsService ..> ChannelStatsRepository
|
|
RoiAnalyticsService ..> EventStatsRepository
|
|
RoiAnalyticsService ..> ChannelStatsRepository
|
|
TimelineAnalyticsService ..> TimelineDataRepository
|
|
TimelineAnalyticsService ..> EventStatsRepository
|
|
UserAnalyticsService ..> EventStatsRepository
|
|
UserAnalyticsService ..> ChannelStatsRepository
|
|
UserChannelAnalyticsService ..> ChannelStatsRepository
|
|
UserChannelAnalyticsService ..> EventStatsRepository
|
|
UserRoiAnalyticsService ..> EventStatsRepository
|
|
UserRoiAnalyticsService ..> ChannelStatsRepository
|
|
UserTimelineAnalyticsService ..> TimelineDataRepository
|
|
UserTimelineAnalyticsService ..> EventStatsRepository
|
|
|
|
' Service Layer Dependencies
|
|
AnalyticsService ..> ExternalChannelService
|
|
AnalyticsService ..> ROICalculator
|
|
ChannelAnalyticsService ..> ExternalChannelService
|
|
RoiAnalyticsService ..> ROICalculator
|
|
UserAnalyticsService ..> ROICalculator
|
|
UserRoiAnalyticsService ..> ROICalculator
|
|
|
|
' Repository Layer -> Entity Layer
|
|
EventStatsRepository ..> EventStats
|
|
ChannelStatsRepository ..> ChannelStats
|
|
TimelineDataRepository ..> TimelineData
|
|
|
|
' Consumer Layer -> Repository Layer
|
|
EventCreatedConsumer ..> EventStatsRepository
|
|
ParticipantRegisteredConsumer ..> EventStatsRepository
|
|
ParticipantRegisteredConsumer ..> TimelineDataRepository
|
|
DistributionCompletedConsumer ..> ChannelStatsRepository
|
|
|
|
' Consumer Layer -> Event
|
|
EventCreatedConsumer ..> EventCreatedEvent
|
|
ParticipantRegisteredConsumer ..> ParticipantRegisteredEvent
|
|
DistributionCompletedConsumer ..> DistributionCompletedEvent
|
|
|
|
' Batch Layer -> Service/Repository
|
|
AnalyticsBatchScheduler ..> AnalyticsService
|
|
AnalyticsBatchScheduler ..> EventStatsRepository
|
|
|
|
' Entity -> Base Entity
|
|
EventStats --|> BaseTimeEntity
|
|
ChannelStats --|> BaseTimeEntity
|
|
TimelineData --|> BaseTimeEntity
|
|
|
|
' Controller -> Response DTO
|
|
AnalyticsDashboardController ..> AnalyticsDashboardResponse
|
|
ChannelAnalyticsController ..> ChannelAnalyticsResponse
|
|
RoiAnalyticsController ..> RoiAnalyticsResponse
|
|
TimelineAnalyticsController ..> TimelineAnalyticsResponse
|
|
UserAnalyticsDashboardController ..> UserAnalyticsDashboardResponse
|
|
UserChannelAnalyticsController ..> UserChannelAnalyticsResponse
|
|
UserRoiAnalyticsController ..> UserRoiAnalyticsResponse
|
|
UserTimelineAnalyticsController ..> UserTimelineAnalyticsResponse
|
|
|
|
' Controller -> ApiResponse
|
|
AnalyticsDashboardController ..> "ApiResponse<T>"
|
|
ChannelAnalyticsController ..> "ApiResponse<T>"
|
|
RoiAnalyticsController ..> "ApiResponse<T>"
|
|
TimelineAnalyticsController ..> "ApiResponse<T>"
|
|
|
|
' Exception
|
|
BusinessException ..> ErrorCode
|
|
|
|
note top of AnalyticsService
|
|
**Layered Architecture 패턴 적용**
|
|
- Presentation Layer: Controller
|
|
- Business Layer: Service
|
|
- Data Access Layer: Repository
|
|
- Domain Layer: Entity
|
|
- Infrastructure: Config, Messaging, Batch
|
|
end note
|
|
|
|
note bottom of ExternalChannelService
|
|
**핵심 기능:**
|
|
- 외부 채널 API 병렬 호출
|
|
- Resilience4j Circuit Breaker
|
|
- Fallback 메커니즘
|
|
- 비동기 처리 (CompletableFuture)
|
|
end note
|
|
|
|
note bottom of AnalyticsBatchScheduler
|
|
**배치 처리:**
|
|
- @Scheduled (fixedRate = 300000) - 5분
|
|
- @Scheduled (initialDelay = 30000) - 초기 로딩
|
|
- Redis 캐시 확인 후 선택적 갱신
|
|
end note
|
|
|
|
@enduml
|