mirror of
https://github.com/ktds-dg0501/kt-event-marketing.git
synced 2025-12-06 22:46:24 +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>
518 lines
30 KiB
Markdown
518 lines
30 KiB
Markdown
# KT 이벤트 마케팅 서비스 패키지 구조도
|
||
|
||
## 📋 개요
|
||
|
||
- **패키지 그룹**: `com.kt.event`
|
||
- **마이크로서비스 아키텍처**: 8개 모듈 (7개 서비스 + 1개 공통)
|
||
- **아키텍처 패턴**: Clean Architecture (4개), Layered Architecture (4개)
|
||
|
||
## 🏗️ 전체 패키지 구조
|
||
|
||
```
|
||
com.kt.event
|
||
├── common/ # 공통 모듈 (Layered)
|
||
├── ai-service/ # AI 서비스 (Clean)
|
||
├── analytics-service/ # 분석 서비스 (Layered)
|
||
├── content-service/ # 콘텐츠 서비스 (Clean)
|
||
├── distribution-service/ # 배포 서비스 (Layered)
|
||
├── event-service/ # 이벤트 서비스 (Clean)
|
||
├── participation-service/ # 참여 서비스 (Layered)
|
||
└── user-service/ # 사용자 서비스 (Layered)
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Common 모듈 (Layered Architecture)
|
||
|
||
```
|
||
com.kt.event.common/
|
||
├── dto/
|
||
│ ├── ApiResponse.java # 표준 API 응답 래퍼
|
||
│ ├── ErrorResponse.java # 에러 응답 DTO
|
||
│ └── PageResponse.java # 페이징 응답 DTO
|
||
├── entity/
|
||
│ └── BaseTimeEntity.java # JPA Auditing 기본 엔티티
|
||
├── exception/
|
||
│ ├── ErrorCode.java # 에러 코드 인터페이스
|
||
│ ├── BusinessException.java # 비즈니스 예외
|
||
│ └── InfraException.java # 인프라 예외
|
||
├── security/
|
||
│ ├── JwtAuthenticationFilter.java # JWT 인증 필터
|
||
│ └── JwtTokenProvider.java # JWT 토큰 인터페이스
|
||
└── util/
|
||
├── ValidationUtil.java # 유효성 검증 유틸
|
||
├── StringUtil.java # 문자열 유틸
|
||
├── DateTimeUtil.java # 날짜/시간 유틸
|
||
└── EncryptionUtil.java # 암호화 유틸
|
||
```
|
||
|
||
---
|
||
|
||
## 🤖 AI Service (Clean Architecture)
|
||
|
||
```
|
||
com.kt.event.ai/
|
||
├── domain/ # Domain Layer
|
||
│ ├── AIRecommendationResult.java # AI 추천 결과 도메인
|
||
│ ├── TrendAnalysis.java # 트렌드 분석 도메인
|
||
│ ├── EventRecommendation.java # 이벤트 추천 도메인
|
||
│ ├── ExpectedMetrics.java # 예상 성과 지표
|
||
│ ├── JobStatusResponse.java # Job 상태 도메인
|
||
│ ├── AIProvider.java # AI 제공자 Enum
|
||
│ ├── JobStatus.java # Job 상태 Enum
|
||
│ ├── EventMechanicsType.java # 이벤트 메커니즘 Enum
|
||
│ └── ServiceStatus.java # 서비스 상태 Enum
|
||
├── application/ # Application Layer
|
||
│ ├── service/
|
||
│ │ ├── AIRecommendationService.java # AI 추천 유스케이스
|
||
│ │ ├── TrendAnalysisService.java # 트렌드 분석 유스케이스
|
||
│ │ ├── JobStatusService.java # Job 상태 관리 유스케이스
|
||
│ │ └── CacheService.java # Redis 캐싱 서비스
|
||
│ └── dto/
|
||
│ ├── AIRecommendationRequest.java # AI 추천 요청 DTO
|
||
│ └── TrendAnalysisRequest.java # 트렌드 분석 요청 DTO
|
||
├── infrastructure/ # Infrastructure Layer
|
||
│ ├── client/
|
||
│ │ ├── ClaudeApiClient.java # Claude API Feign Client
|
||
│ │ ├── ClaudeRequest.java # Claude API 요청 DTO
|
||
│ │ └── ClaudeResponse.java # Claude API 응답 DTO
|
||
│ ├── circuitbreaker/
|
||
│ │ ├── CircuitBreakerManager.java # Circuit Breaker 관리
|
||
│ │ └── AIServiceFallback.java # Fallback 로직
|
||
│ ├── kafka/
|
||
│ │ ├── AIJobConsumer.java # Kafka 메시지 소비자
|
||
│ │ └── AIJobMessage.java # Job 메시지 DTO
|
||
│ └── config/
|
||
│ ├── SecurityConfig.java # Spring Security 설정
|
||
│ ├── RedisConfig.java # Redis 설정
|
||
│ ├── CircuitBreakerConfig.java # Circuit Breaker 설정
|
||
│ ├── KafkaConsumerConfig.java # Kafka Consumer 설정
|
||
│ ├── JacksonConfig.java # JSON 변환 설정
|
||
│ └── SwaggerConfig.java # API 문서 설정
|
||
├── presentation/ # Presentation Layer
|
||
│ ├── controller/
|
||
│ │ ├── HealthController.java # 헬스 체크 API
|
||
│ │ ├── InternalRecommendationController.java # AI 추천 API
|
||
│ │ └── InternalJobController.java # Job 상태 API
|
||
│ └── dto/
|
||
│ ├── AIRecommendationResponse.java # AI 추천 응답 DTO
|
||
│ └── JobStatusDto.java # Job 상태 응답 DTO
|
||
└── exception/ # Exception Layer
|
||
├── GlobalExceptionHandler.java # 전역 예외 처리
|
||
├── AIServiceException.java # AI 서비스 예외
|
||
├── JobNotFoundException.java # Job 미발견 예외
|
||
├── RecommendationNotFoundException.java # 추천 결과 미발견 예외
|
||
└── CircuitBreakerOpenException.java # Circuit Breaker 열림 예외
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 Analytics Service (Layered Architecture)
|
||
|
||
```
|
||
com.kt.event.analytics/
|
||
├── AnalyticsServiceApplication.java # Spring Boot 애플리케이션
|
||
├── controller/ # Presentation Layer
|
||
│ ├── AnalyticsDashboardController.java # 대시보드 API
|
||
│ ├── ChannelAnalyticsController.java # 채널 분석 API
|
||
│ ├── RoiAnalyticsController.java # ROI 분석 API
|
||
│ ├── TimelineAnalyticsController.java # 타임라인 분석 API
|
||
│ ├── UserAnalyticsDashboardController.java # 사용자별 대시보드 API
|
||
│ ├── UserChannelAnalyticsController.java # 사용자별 채널 분석 API
|
||
│ ├── UserRoiAnalyticsController.java # 사용자별 ROI 분석 API
|
||
│ └── UserTimelineAnalyticsController.java # 사용자별 타임라인 분석 API
|
||
├── service/ # Business Layer
|
||
│ ├── AnalyticsDashboardService.java # 대시보드 서비스
|
||
│ ├── ChannelAnalyticsService.java # 채널 분석 서비스
|
||
│ ├── RoiAnalyticsService.java # ROI 분석 서비스
|
||
│ ├── TimelineAnalyticsService.java # 타임라인 분석 서비스
|
||
│ ├── UserAnalyticsDashboardService.java # 사용자별 대시보드 서비스
|
||
│ ├── UserChannelAnalyticsService.java # 사용자별 채널 분석 서비스
|
||
│ ├── UserRoiAnalyticsService.java # 사용자별 ROI 분석 서비스
|
||
│ ├── UserTimelineAnalyticsService.java # 사용자별 타임라인 분석 서비스
|
||
│ ├── ExternalChannelService.java # 외부 채널 API 통합
|
||
│ └── ROICalculator.java # ROI 계산 유틸
|
||
├── repository/ # Data Access Layer
|
||
│ ├── EventStatsRepository.java # 이벤트 통계 Repository
|
||
│ ├── ChannelStatsRepository.java # 채널 통계 Repository
|
||
│ └── TimelineDataRepository.java # 타임라인 데이터 Repository
|
||
├── entity/ # Domain Layer
|
||
│ ├── EventStats.java # 이벤트 통계 엔티티
|
||
│ ├── ChannelStats.java # 채널 통계 엔티티
|
||
│ └── TimelineData.java # 타임라인 데이터 엔티티
|
||
├── dto/response/ # Response DTOs
|
||
│ ├── AnalyticsDashboardResponse.java # 대시보드 응답
|
||
│ ├── ChannelAnalytics.java # 채널 분석 응답
|
||
│ ├── ChannelComparison.java # 채널 비교 응답
|
||
│ ├── ChannelAnalyticsResponse.java # 채널 분석 전체 응답
|
||
│ ├── ChannelCosts.java # 채널 비용 응답
|
||
│ ├── ChannelMetrics.java # 채널 지표 응답
|
||
│ ├── ChannelPerformance.java # 채널 성과 응답
|
||
│ ├── CostEfficiency.java # 비용 효율성 응답
|
||
│ ├── InvestmentDetails.java # 투자 상세 응답
|
||
│ ├── PeakTimeInfo.java # 피크 시간 정보 응답
|
||
│ ├── PeriodInfo.java # 기간 정보 응답
|
||
│ ├── RevenueDetails.java # 수익 상세 응답
|
||
│ ├── RevenueProjection.java # 수익 전망 응답
|
||
│ ├── RoiAnalyticsResponse.java # ROI 분석 응답
|
||
│ ├── RoiCalculation.java # ROI 계산 응답
|
||
│ ├── SocialInteractionStats.java # SNS 상호작용 통계
|
||
│ ├── TimelineAnalyticsResponse.java # 타임라인 분석 응답
|
||
│ ├── TimelineDataPoint.java # 타임라인 데이터 포인트
|
||
│ ├── TrendAnalysis.java # 트렌드 분석 응답
|
||
│ └── VoiceCallStats.java # 음성 통화 통계
|
||
├── messaging/ # Kafka Components
|
||
│ └── event/
|
||
│ ├── DistributionCompletedEvent.java # 배포 완료 이벤트
|
||
│ ├── EventCreatedEvent.java # 이벤트 생성 이벤트
|
||
│ └── ParticipantRegisteredEvent.java # 참여자 등록 이벤트
|
||
├── batch/
|
||
│ └── AnalyticsBatchScheduler.java # 5분 단위 배치 스케줄러
|
||
└── config/
|
||
├── KafkaConsumerConfig.java # Kafka Consumer 설정
|
||
├── KafkaTopicConfig.java # Kafka Topic 설정
|
||
├── RedisConfig.java # Redis 설정
|
||
├── Resilience4jConfig.java # Resilience4j 설정
|
||
├── SecurityConfig.java # Spring Security 설정
|
||
└── SwaggerConfig.java # API 문서 설정
|
||
```
|
||
|
||
---
|
||
|
||
## 📸 Content Service (Clean Architecture)
|
||
|
||
```
|
||
com.kt.event.content/
|
||
├── biz/ # Business Logic Layer
|
||
│ ├── domain/ # Domain Layer
|
||
│ │ ├── Content.java # 콘텐츠 집합체
|
||
│ │ ├── GeneratedImage.java # 생성 이미지 엔티티
|
||
│ │ ├── Job.java # 비동기 작업 엔티티
|
||
│ │ ├── ImageStyle.java # 이미지 스타일 Enum
|
||
│ │ └── Platform.java # 플랫폼 Enum
|
||
│ ├── usecase/ # Use Case Layer
|
||
│ │ ├── in/ # Input Ports
|
||
│ │ │ ├── GenerateImagesUseCase.java # 이미지 생성 유스케이스
|
||
│ │ │ ├── GetJobStatusUseCase.java # Job 상태 조회 유스케이스
|
||
│ │ │ ├── GetEventContentUseCase.java # 콘텐츠 조회 유스케이스
|
||
│ │ │ ├── GetImageListUseCase.java # 이미지 목록 조회 유스케이스
|
||
│ │ │ ├── RegenerateImageUseCase.java # 이미지 재생성 유스케이스
|
||
│ │ │ └── DeleteImageUseCase.java # 이미지 삭제 유스케이스
|
||
│ │ └── out/ # Output Ports
|
||
│ │ ├── ContentReader.java # 콘텐츠 읽기 포트
|
||
│ │ ├── ContentWriter.java # 콘텐츠 쓰기 포트
|
||
│ │ ├── ImageReader.java # 이미지 읽기 포트
|
||
│ │ ├── ImageWriter.java # 이미지 쓰기 포트
|
||
│ │ ├── JobReader.java # Job 읽기 포트
|
||
│ │ ├── JobWriter.java # Job 쓰기 포트
|
||
│ │ ├── CDNUploader.java # CDN 업로드 포트
|
||
│ │ └── RedisAIDataReader.java # AI 데이터 읽기 포트
|
||
│ └── service/ # Service Implementations
|
||
│ ├── StableDiffusionImageGenerator.java # 이미지 생성 서비스
|
||
│ ├── JobManagementService.java # Job 관리 서비스
|
||
│ ├── GetEventContentService.java # 콘텐츠 조회 서비스
|
||
│ ├── GetImageListService.java # 이미지 목록 서비스
|
||
│ ├── DeleteImageService.java # 이미지 삭제 서비스
|
||
│ └── RegenerateImageService.java # 이미지 재생성 서비스
|
||
└── infra/ # Infrastructure Layer
|
||
├── ContentServiceApplication.java # Spring Boot 애플리케이션
|
||
├── controller/ # Presentation Layer
|
||
│ └── ContentController.java # REST API 컨트롤러
|
||
├── gateway/ # Adapter Implementations
|
||
│ ├── RedisGateway.java # Redis 기반 모든 포트 구현
|
||
│ ├── ReplicateApiClient.java # Replicate API 클라이언트
|
||
│ └── AzureBlobStorageUploader.java # Azure CDN 업로더
|
||
├── dto/ # Data Transfer Objects
|
||
│ ├── GenerateImagesRequest.java # 이미지 생성 요청 DTO
|
||
│ ├── GenerateImagesResponse.java # 이미지 생성 응답 DTO
|
||
│ ├── GetJobStatusResponse.java # Job 상태 응답 DTO
|
||
│ ├── GetEventContentResponse.java # 콘텐츠 조회 응답 DTO
|
||
│ ├── GetImageListResponse.java # 이미지 목록 응답 DTO
|
||
│ ├── RegenerateImageRequest.java # 이미지 재생성 요청 DTO
|
||
│ └── ImageDetailDto.java # 이미지 상세 DTO
|
||
└── config/ # Configuration
|
||
├── SecurityConfig.java # Spring Security 설정
|
||
└── SwaggerConfig.java # API 문서 설정
|
||
```
|
||
|
||
---
|
||
|
||
## 📦 Distribution Service (Layered Architecture)
|
||
|
||
```
|
||
com.kt.event.distribution/
|
||
├── DistributionServiceApplication.java # Spring Boot 애플리케이션
|
||
├── controller/ # Presentation Layer
|
||
│ └── DistributionController.java # 배포 REST API
|
||
├── service/ # Business Layer
|
||
│ ├── DistributionService.java # 배포 서비스
|
||
│ └── KafkaEventPublisher.java # Kafka 이벤트 발행
|
||
├── adapter/ # Channel Adapters (Strategy Pattern)
|
||
│ ├── ChannelAdapter.java # 채널 어댑터 인터페이스
|
||
│ ├── AbstractChannelAdapter.java # 추상 채널 어댑터 (Circuit Breaker)
|
||
│ ├── UriDongNeTvAdapter.java # 우리동네TV 어댑터
|
||
│ ├── GiniTvAdapter.java # 지니TV 어댑터
|
||
│ ├── RingoBizAdapter.java # 링고비즈 어댑터
|
||
│ ├── InstagramAdapter.java # 인스타그램 어댑터
|
||
│ ├── NaverAdapter.java # 네이버 어댑터
|
||
│ └── KakaoAdapter.java # 카카오 어댑터
|
||
├── repository/ # Data Access Layer
|
||
│ ├── DistributionStatusRepository.java # 배포 상태 Repository
|
||
│ └── DistributionStatusJpaRepository.java # JPA Repository
|
||
├── entity/ # Domain Layer
|
||
│ ├── DistributionStatus.java # 전체 배포 상태 엔티티
|
||
│ └── ChannelStatusEntity.java # 채널별 배포 상태 엔티티
|
||
├── dto/ # Data Transfer Objects
|
||
│ ├── DistributeRequest.java # 배포 요청 DTO
|
||
│ ├── DistributeResponse.java # 배포 응답 DTO
|
||
│ ├── ChannelStatus.java # 채널 상태 DTO
|
||
│ ├── DistributionStatusResponse.java # 배포 상태 응답 DTO
|
||
│ ├── DistributionMapper.java # Entity ↔ DTO 매퍼
|
||
│ └── ChannelType.java # 채널 타입 Enum
|
||
├── event/ # Event Objects
|
||
│ └── DistributionCompletedEvent.java # 배포 완료 이벤트
|
||
└── config/ # Configuration
|
||
├── ChannelConfig.java # 채널 설정
|
||
├── SecurityConfig.java # Spring Security 설정
|
||
└── SwaggerConfig.java # API 문서 설정
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 Event Service (Clean Architecture)
|
||
|
||
```
|
||
com.kt.event.eventservice/
|
||
├── domain/ # Domain Layer
|
||
│ ├── Event.java # 이벤트 집합체 (Aggregate Root)
|
||
│ ├── AiRecommendation.java # AI 추천 엔티티
|
||
│ ├── GeneratedImage.java # 생성 이미지 엔티티
|
||
│ ├── Job.java # 비동기 작업 엔티티
|
||
│ ├── EventStatus.java # 이벤트 상태 Enum
|
||
│ ├── JobStatus.java # Job 상태 Enum
|
||
│ ├── EventPurpose.java # 이벤트 목적 Enum
|
||
│ ├── EventMechanism.java # 이벤트 메커니즘 Enum
|
||
│ ├── DistributionChannel.java # 배포 채널 Enum
|
||
│ └── repository/ # Repository Interfaces
|
||
│ ├── EventRepository.java # 이벤트 Repository 인터페이스
|
||
│ └── JobRepository.java # Job Repository 인터페이스
|
||
├── application/ # Application Layer
|
||
│ ├── service/ # Application Services
|
||
│ │ ├── EventService.java # 이벤트 서비스 (핵심 오케스트레이터)
|
||
│ │ └── JobService.java # Job 서비스
|
||
│ └── dto/ # Application DTOs
|
||
│ ├── request/
|
||
│ │ ├── CreateEventRequest.java # 이벤트 생성 요청
|
||
│ │ ├── SelectPurposeRequest.java # 목적 선택 요청
|
||
│ │ ├── SelectAiRecommendationRequest.java # AI 추천 선택 요청
|
||
│ │ ├── CustomizeEventRequest.java # 이벤트 커스터마이징 요청
|
||
│ │ ├── GenerateImagesRequest.java # 이미지 생성 요청
|
||
│ │ ├── SelectImageRequest.java # 이미지 선택 요청
|
||
│ │ ├── SelectChannelsRequest.java # 채널 선택 요청
|
||
│ │ └── PublishEventRequest.java # 이벤트 배포 요청
|
||
│ └── response/
|
||
│ ├── CreateEventResponse.java # 이벤트 생성 응답
|
||
│ ├── GetEventResponse.java # 이벤트 조회 응답
|
||
│ ├── GetEventListResponse.java # 이벤트 목록 응답
|
||
│ ├── SelectPurposeResponse.java # 목적 선택 응답
|
||
│ ├── GetAiRecommendationsResponse.java # AI 추천 조회 응답
|
||
│ ├── SelectAiRecommendationResponse.java # AI 추천 선택 응답
|
||
│ ├── CustomizeEventResponse.java # 커스터마이징 응답
|
||
│ ├── GenerateImagesResponse.java # 이미지 생성 응답
|
||
│ ├── GetImagesResponse.java # 이미지 조회 응답
|
||
│ ├── SelectImageResponse.java # 이미지 선택 응답
|
||
│ ├── SelectChannelsResponse.java # 채널 선택 응답
|
||
│ ├── PublishEventResponse.java # 이벤트 배포 응답
|
||
│ ├── EndEventResponse.java # 이벤트 종료 응답
|
||
│ ├── DeleteEventResponse.java # 이벤트 삭제 응답
|
||
│ └── GetJobStatusResponse.java # Job 상태 조회 응답
|
||
├── infrastructure/ # Infrastructure Layer
|
||
│ ├── persistence/ # Persistence Adapters
|
||
│ │ ├── EventJpaRepository.java # 이벤트 JPA Repository
|
||
│ │ ├── JobJpaRepository.java # Job JPA Repository
|
||
│ │ ├── EventEntity.java # 이벤트 JPA 엔티티
|
||
│ │ ├── AiRecommendationEntity.java # AI 추천 JPA 엔티티
|
||
│ │ ├── GeneratedImageEntity.java # 이미지 JPA 엔티티
|
||
│ │ ├── JobEntity.java # Job JPA 엔티티
|
||
│ │ ├── EventRepositoryImpl.java # 이벤트 Repository 구현
|
||
│ │ └── JobRepositoryImpl.java # Job Repository 구현
|
||
│ ├── messaging/ # Messaging Adapters
|
||
│ │ ├── AIJobKafkaProducer.java # AI Job Kafka Producer
|
||
│ │ ├── AIJobKafkaConsumer.java # AI Job Kafka Consumer
|
||
│ │ └── kafka/
|
||
│ │ ├── AIEventGenerationJobMessage.java # AI Job 메시지
|
||
│ │ └── AIEventGenerationJobResultMessage.java # AI Job 결과 메시지
|
||
│ ├── feign/ # External Service Clients
|
||
│ │ └── ContentServiceClient.java # Content Service Feign Client
|
||
│ └── config/ # Configuration
|
||
│ ├── SecurityConfig.java # Spring Security 설정
|
||
│ ├── RedisConfig.java # Redis 설정
|
||
│ ├── KafkaProducerConfig.java # Kafka Producer 설정
|
||
│ ├── KafkaConsumerConfig.java # Kafka Consumer 설정
|
||
│ ├── FeignConfig.java # Feign 설정
|
||
│ └── SwaggerConfig.java # API 문서 설정
|
||
└── presentation/ # Presentation Layer
|
||
├── EventServiceApplication.java # Spring Boot 애플리케이션
|
||
├── controller/ # REST Controllers
|
||
│ ├── EventController.java # 이벤트 REST API (13개 엔드포인트)
|
||
│ └── JobController.java # Job REST API (2개 엔드포인트)
|
||
└── security/ # Security Components
|
||
├── UserPrincipal.java # 사용자 인증 정보
|
||
└── DevAuthenticationFilter.java # 개발용 인증 필터
|
||
```
|
||
|
||
---
|
||
|
||
## 🎫 Participation Service (Layered Architecture)
|
||
|
||
```
|
||
com.kt.event.participation/
|
||
├── ParticipationServiceApplication.java # Spring Boot 애플리케이션
|
||
├── application/ # Application Layer
|
||
│ ├── service/
|
||
│ │ ├── ParticipationService.java # 참여 서비스
|
||
│ │ └── WinnerDrawService.java # 당첨자 추첨 서비스
|
||
│ └── dto/ # Data Transfer Objects
|
||
│ ├── ParticipationRequest.java # 참여 요청 DTO
|
||
│ ├── ParticipationResponse.java # 참여 응답 DTO
|
||
│ ├── DrawWinnersRequest.java # 당첨자 추첨 요청 DTO
|
||
│ └── DrawWinnersResponse.java # 당첨자 추첨 응답 DTO
|
||
├── domain/ # Domain Layer
|
||
│ ├── entity/
|
||
│ │ ├── Participant.java # 참여자 엔티티
|
||
│ │ └── DrawLog.java # 추첨 이력 엔티티
|
||
│ ├── repository/
|
||
│ │ ├── ParticipantRepository.java # 참여자 Repository
|
||
│ │ └── DrawLogRepository.java # 추첨 이력 Repository
|
||
│ └── enums/
|
||
│ ├── ParticipationType.java # 참여 타입 Enum (ONLINE, STORE_VISIT)
|
||
│ ├── ParticipantStatus.java # 참여자 상태 Enum
|
||
│ └── DrawStatus.java # 추첨 상태 Enum
|
||
├── presentation/ # Presentation Layer
|
||
│ ├── controller/
|
||
│ │ ├── ParticipationController.java # 참여 API
|
||
│ │ ├── WinnerController.java # 당첨자 API
|
||
│ │ └── DebugController.java # 디버그 API (개발용)
|
||
│ └── security/
|
||
│ └── UserPrincipal.java # 사용자 인증 정보
|
||
├── infrastructure/ # Infrastructure Layer
|
||
│ ├── kafka/
|
||
│ │ ├── KafkaProducerService.java # Kafka 이벤트 발행
|
||
│ │ └── event/
|
||
│ │ └── ParticipantRegisteredEvent.java # 참여자 등록 이벤트
|
||
│ └── config/
|
||
│ ├── SecurityConfig.java # Spring Security 설정
|
||
│ ├── KafkaProducerConfig.java # Kafka Producer 설정
|
||
│ └── SwaggerConfig.java # API 문서 설정
|
||
└── exception/ # Exception Layer
|
||
├── ParticipationException.java # 참여 예외 (부모 클래스)
|
||
├── DuplicateParticipationException.java # 중복 참여 예외
|
||
├── EventNotActiveException.java # 이벤트 비활성 예외
|
||
├── ParticipantNotFoundException.java # 참여자 미발견 예외
|
||
├── DrawFailedException.java # 추첨 실패 예외
|
||
├── EventEndedException.java # 이벤트 종료 예외
|
||
├── AlreadyDrawnException.java # 이미 추첨 완료 예외
|
||
├── InsufficientParticipantsException.java # 참여자 부족 예외
|
||
└── NoWinnersYetException.java # 당첨자 미추첨 예외
|
||
```
|
||
|
||
---
|
||
|
||
## 👤 User Service (Layered Architecture)
|
||
|
||
```
|
||
com.kt.event.user/
|
||
├── UserServiceApplication.java # Spring Boot 애플리케이션
|
||
├── controller/ # Presentation Layer
|
||
│ └── UserController.java # 사용자 REST API (6개 엔드포인트)
|
||
├── service/ # Business Layer
|
||
│ ├── UserService.java # 사용자 서비스 인터페이스
|
||
│ ├── UserServiceImpl.java # 사용자 서비스 구현
|
||
│ ├── AuthenticationService.java # 인증 서비스 인터페이스
|
||
│ └── AuthenticationServiceImpl.java # 인증 서비스 구현
|
||
├── repository/ # Data Access Layer
|
||
│ ├── UserRepository.java # 사용자 Repository
|
||
│ └── StoreRepository.java # 매장 Repository
|
||
├── entity/ # Domain Layer
|
||
│ ├── User.java # 사용자 엔티티
|
||
│ ├── Store.java # 매장 엔티티
|
||
│ ├── UserRole.java # 사용자 역할 Enum (OWNER, ADMIN)
|
||
│ └── UserStatus.java # 사용자 상태 Enum (ACTIVE, INACTIVE, LOCKED, WITHDRAWN)
|
||
├── dto/ # Data Transfer Objects
|
||
│ ├── request/
|
||
│ │ ├── RegisterRequest.java # 회원가입 요청 DTO
|
||
│ │ ├── LoginRequest.java # 로그인 요청 DTO
|
||
│ │ ├── UpdateProfileRequest.java # 프로필 수정 요청 DTO
|
||
│ │ └── ChangePasswordRequest.java # 비밀번호 변경 요청 DTO
|
||
│ └── response/
|
||
│ ├── RegisterResponse.java # 회원가입 응답 DTO
|
||
│ ├── LoginResponse.java # 로그인 응답 DTO
|
||
│ ├── LogoutResponse.java # 로그아웃 응답 DTO
|
||
│ └── ProfileResponse.java # 프로필 응답 DTO
|
||
├── exception/
|
||
│ └── UserErrorCode.java # 사용자 관련 에러 코드
|
||
└── config/ # Configuration Layer
|
||
├── SecurityConfig.java # Spring Security 설정
|
||
├── RedisConfig.java # Redis 설정
|
||
├── AsyncConfig.java # 비동기 설정
|
||
└── SwaggerConfig.java # API 문서 설정
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 아키텍처 패턴별 통계
|
||
|
||
### Clean Architecture (4개 서비스)
|
||
- **ai-service**: AI 추천 및 외부 API 연동
|
||
- **content-service**: 콘텐츠 생성 및 CDN 관리
|
||
- **event-service**: 핵심 이벤트 도메인 로직
|
||
- **total**: 3개 핵심 비즈니스 서비스
|
||
|
||
### Layered Architecture (4개 서비스)
|
||
- **analytics-service**: 데이터 분석 및 집계
|
||
- **distribution-service**: 다중 채널 배포
|
||
- **participation-service**: 참여 관리 및 추첨
|
||
- **user-service**: 사용자 인증 및 관리
|
||
- **common**: 공통 컴포넌트
|
||
|
||
---
|
||
|
||
## 🔗 서비스 간 의존성
|
||
|
||
```
|
||
user-service (인증) ← event-service (핵심) → ai-service (추천)
|
||
↓
|
||
content-service (이미지 생성)
|
||
↓
|
||
distribution-service (배포)
|
||
↓
|
||
participation-service (참여)
|
||
↓
|
||
analytics-service (분석)
|
||
```
|
||
|
||
**통신 방식**:
|
||
- **동기**: Feign Client (event → content)
|
||
- **비동기**: Kafka (event → ai, distribution → analytics, participation → analytics)
|
||
- **캐시**: Redis (모든 서비스)
|
||
|
||
---
|
||
|
||
## 📝 설계 원칙 적용 현황
|
||
|
||
✅ **공통설계원칙 준수**
|
||
- 마이크로서비스 독립성: 서비스별 독립 배포 가능
|
||
- 패키지 구조 표준: Clean Architecture / Layered Architecture 분리
|
||
- 공통 컴포넌트 활용: common 모듈의 BaseTimeEntity, ApiResponse 등 재사용
|
||
|
||
✅ **아키텍처 패턴 적용**
|
||
- Clean Architecture: 복잡한 도메인 로직 보호 (ai, content, event)
|
||
- Layered Architecture: CRUD 중심 서비스 (analytics, distribution, participation, user)
|
||
|
||
✅ **의존성 관리**
|
||
- 의존성 역전 원칙 (DIP): Clean Architecture 서비스
|
||
- 단방향 의존성: Layered Architecture 서비스
|
||
- 공통 모듈 참조: 모든 서비스가 common 모듈 활용
|
||
|
||
**총 클래스 수**: 약 350개+ (추정)
|
||
**총 파일 수**: 8개 서비스 × 평균 45개 파일 = 360개+ 파일 |