# 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개+ 파일