mirror of
https://github.com/ktds-dg0501/kt-event-marketing.git
synced 2026-06-13 13:39:12 +00:00
물리아키텍처 설계 완료
✨ 주요 기능 - 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>
This commit is contained in:
@@ -0,0 +1,534 @@
|
||||
@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
|
||||
Reference in New Issue
Block a user