diff --git a/design/backend/logical/logical-architecture.md b/design/backend/logical/logical-architecture.md
index a8f3553..38e576f 100644
--- a/design/backend/logical/logical-architecture.md
+++ b/design/backend/logical/logical-architecture.md
@@ -2,13 +2,18 @@
## 문서 정보
- **작성일**: 2025-10-21
-- **버전**: 1.0
+- **최종 수정일**: 2025-10-22
+- **버전**: 2.0 (CQRS + Event-Driven 전환)
- **작성자**: System Architect
- **관련 문서**:
- [유저스토리](../../userstory.md)
- [아키텍처 패턴](../../pattern/architecture-pattern.md)
- [UI/UX 설계서](../../uiux/uiux.md)
+## 버전 이력
+- **v1.0** (2025-10-21): 초기 마이크로서비스 아키텍처 설계
+- **v2.0** (2025-10-22): CQRS 패턴 및 Event-Driven 아키텍처 전환, Resilience 패턴 전면 적용
+
---
## 목차
@@ -33,121 +38,263 @@
- 불필요한 추가 기능 배제
- 비즈니스 요구사항 우선 반영
-#### 마이크로서비스 아키텍처
-- **서비스 독립성**: 각 서비스는 독립적으로 배포 및 확장 가능
-- **캐시 우선 전략**: Redis를 통한 서비스 간 데이터 공유 최소화
-- **선택적 비동기**: AI 및 이미지 생성 등 장시간 작업만 비동기 처리
-- **느슨한 결합**: 서비스 간 직접 의존성 최소화
+#### CQRS (Command Query Responsibility Segregation)
+- **읽기/쓰기 분리**: Command Service와 Query Service로 책임 분리
+- **독립적 확장**: 읽기와 쓰기 부하에 따라 독립적으로 확장
+- **성능 최적화**: Query Service는 읽기 최적화 데이터 모델 사용
+- **이벤트 소싱 준비**: 도메인 이벤트 기반 상태 동기화
-#### 클라우드 디자인 패턴 적용
-- **Cache-Aside**: AI 응답, 이미지 생성 결과 캐싱 (응답 시간 90% 개선)
-- **API Gateway**: 중앙집중식 인증/라우팅/Rate Limiting
-- **Asynchronous Request-Reply**: AI 추천, 이미지 생성 비동기 처리
-- **Circuit Breaker**: 7개 외부 API 장애 격리 (가용성 99% 목표)
+#### Event-Driven 아키텍처
+- **비동기 메시징**: Event Bus(Kafka/SQS)를 통한 서비스 간 통신
+- **느슨한 결합**: 서비스 간 직접 의존성 제거
+- **확장성**: 이벤트 구독자 추가로 기능 확장 용이
+- **장애 격리**: 이벤트 발행/구독 실패 시 서비스 독립성 유지
+
+#### Resilience 패턴 적용
+- **Circuit Breaker**: 외부 API 장애 시 빠른 실패 및 복구 (Hystrix/Resilience4j)
+- **Retry Pattern**: 일시적 장애 시 자동 재시도 (지수 백오프)
+- **Timeout Pattern**: 응답 시간 제한으로 리소스 점유 방지
+- **Bulkhead Pattern**: 리소스 격리로 장애 전파 차단
+- **Fallback Pattern**: 장애 시 대체 로직 실행 (캐시 응답 등)
### 1.2 핵심 컴포넌트 정의
-#### Client Layer
-- **Web/Mobile Client**: 반응형 React 애플리케이션
- - Mobile First 설계 (60% 모바일 사용자)
- - Progressive Web App (PWA) 지원
-
-#### Gateway Layer
-- **API Gateway**: Kong 또는 AWS API Gateway
- - JWT 토큰 기반 인증/인가
- - URL 기반 서비스 라우팅
- - Rate Limiting (사용자당 100 req/min)
- - 중앙집중식 로깅 및 모니터링
-
-#### Service Layer (7개 마이크로서비스)
+#### Command Services (쓰기 전용)
1. **User Service**: 사용자 인증 및 매장정보 관리
-2. **Event Service**: 이벤트 CRUD 및 상태 관리
-3. **AI Service**: 트렌드 분석 및 이벤트 추천
-4. **Content Service**: SNS 이미지 자동 생성
-5. **Distribution Service**: 다중 채널 배포 관리
-6. **Participation Service**: 이벤트 참여 및 당첨자 관리
-7. **Analytics Service**: 실시간 성과 대시보드
+ - 회원가입/로그인 (JWT 발급)
+ - 프로필 수정
+ - 사업자번호 검증 (외부 API 연동)
+
+2. **Event Command Service**: 이벤트 생성/수정/삭제
+ - 이벤트 생성 플로우 오케스트레이션
+ - 도메인 이벤트 발행 (EventCreated, EventPublished)
+ - 이벤트 상태 변경
+
+3. **Participation Command Service**: 참여 및 당첨자 관리
+ - 참여 접수 및 검증
+ - 당첨자 추첨 실행
+ - 도메인 이벤트 발행 (ParticipantRegistered, WinnerSelected)
+
+#### Query Services (읽기 전용)
+1. **Event Query Service**: 이벤트 조회 최적화
+ - 이벤트 목록/상세 조회
+ - 이벤트 검색 및 필터링
+ - 읽기 최적화 데이터 모델 (비정규화)
+
+2. **Participation Query Service**: 참여자/당첨자 조회
+ - 참여자 목록 조회
+ - 당첨자 조회
+ - 읽기 최적화 집계 데이터
+
+3. **Analytics Query Service**: 실시간 성과 분석
+ - 대시보드 데이터 조회
+ - 채널별 성과 집계
+ - ROI 계산 및 분석
+
+#### Async Services (비동기 처리)
+1. **AI Service**: AI 기반 이벤트 추천
+ - Job Queue를 통한 비동기 처리
+ - Circuit Breaker 적용 (외부 AI API)
+ - 결과 캐싱 (Redis)
+
+2. **Content Service**: SNS 이미지 생성
+ - Job Queue를 통한 비동기 처리
+ - Circuit Breaker 적용 (외부 이미지 API)
+ - CDN 업로드 및 캐싱
+
+3. **Distribution Service**: 다중 채널 배포
+ - Event Bus를 통한 EventPublished 구독
+ - 병렬 배포 및 Circuit Breaker 적용
+ - 배포 완료 이벤트 발행 (DistributionCompleted)
+
+#### Event Bus (Kafka/SQS)
+- **도메인 이벤트 발행/구독**: 서비스 간 비동기 통신
+- **이벤트 종류**:
+ - EventCreated: 이벤트 생성 시
+ - EventPublished: 이벤트 배포 승인 시
+ - ParticipantRegistered: 참여자 등록 시
+ - WinnerSelected: 당첨자 선정 시
+ - DistributionCompleted: 배포 완료 시
+- **보장 수준**: At-Least-Once Delivery
+
+#### Job Queue (RabbitMQ)
+- **장시간 비동기 작업**: AI 추천, 이미지 생성
+- **Priority Queue**: 작업 우선순위 관리
+- **Dead Letter Queue**: 실패 작업 처리
#### Data Layer
-- **Redis Cache**:
- - 세션 정보 (User)
- - AI 추천 결과 (TTL 24시간)
- - 이미지 생성 결과 (TTL 7일)
- - 사업자번호 검증 결과 (TTL 7일)
- - 대시보드 데이터 (TTL 5분)
-- **Message Queue** (RabbitMQ/Kafka):
- - AI 작업 큐 (비동기 처리)
- - 이미지 생성 큐
- - 배포 작업 큐
-- **Database** (PostgreSQL):
- - 서비스별 독립 데이터베이스
- - User DB, Event DB, Participation DB, Analytics DB
+- **Redis Cache**: 세션, AI 결과, 이미지 URL, 대시보드 캐싱
+- **PostgreSQL**: 서비스별 독립 데이터베이스
+ - User DB, Event Write DB, Event Read DB, Participation Write DB, Participation Read DB, Analytics DB
+- **읽기 전용 복제본**: Query Service 성능 최적화
-#### External APIs
-- **국세청 사업자등록정보 진위확인 API**: 사업자번호 검증
-- **Claude API / GPT-4 API**: AI 트렌드 분석 및 이벤트 추천
-- **Stable Diffusion / DALL-E API**: SNS 이미지 생성
-- **우리동네TV API**: 영상 배포
-- **링고비즈 API**: 연결음 업데이트
-- **지니TV 광고 API**: TV 광고 배포
-- **SNS APIs** (Instagram, Naver, Kakao): SNS 자동 포스팅
+#### External Systems
+- **국세청 API**: 사업자번호 검증
+- **AI APIs**: Claude/GPT-4 (트렌드 분석)
+- **이미지 생성 APIs**: Stable Diffusion/DALL-E
+- **배포 채널 APIs**: 우리동네TV, 링고비즈, 지니TV, SNS APIs
---
## 2. 서비스 아키텍처
-### 2.1 서비스별 책임
+### 2.1 CQRS 패턴 적용
+
+#### 설계 원칙
+- **Command와 Query 분리**: 쓰기와 읽기 책임을 독립된 서비스로 분리
+- **독립적 확장**: 읽기/쓰기 부하에 따라 독립적으로 스케일링
+- **최적화된 데이터 모델**: Query Service는 비정규화된 읽기 최적화 모델 사용
+- **이벤트 동기화**: Command Service가 발행한 도메인 이벤트로 Query Service 동기화
+
+### 2.2 Command Services (쓰기 전용)
#### User Service
**핵심 책임**:
- 회원가입/로그인 (JWT 토큰 발급)
-- 프로필 관리 (매장 정보 포함)
+- 프로필 수정 (매장 정보 포함)
- 사업자번호 검증 (국세청 API 연동)
-- 로그아웃 및 세션 관리
+- 세션 관리
**관련 유저스토리**: UFR-USER-010, 020, 030, 040
-**주요 기능**:
-- JWT 기반 인증/인가
-- Redis를 통한 세션 관리
-- 사업자번호 검증 결과 캐싱 (TTL 7일)
-- 매장 정보 CRUD
+**Resilience 패턴**:
+- **Circuit Breaker**: 국세청 API 호출 시 (실패율 5% 초과 시 Open)
+- **Retry**: 최대 3회 재시도 (지수 백오프: 1초, 2초, 4초)
+- **Timeout**: 5초
+- **Fallback**: 사업자번호 검증 스킵 (수동 확인 안내)
**데이터 저장**:
- User DB: users, stores 테이블
-- Redis: 세션 정보, 사업자번호 검증 결과
+- Redis: 세션 정보 (TTL 7일), 사업자번호 검증 결과 (TTL 7일)
-#### Event Service
+#### Event Command Service
**핵심 책임**:
-- 이벤트 CRUD 및 상태 관리
+- 이벤트 생성/수정/삭제
- 이벤트 생성 플로우 오케스트레이션
-- 이벤트 목록 조회 및 필터링
-- 이벤트 상세 정보 조회
+- 도메인 이벤트 발행 (EventCreated, EventPublished)
**관련 유저스토리**: UFR-EVENT-010, 020, 030, 040, 050, 060, 070
-**주요 기능**:
-- 이벤트 생성 플로우 관리 (목적 선택 → AI 추천 → 콘텐츠 생성 → 배포)
-- 이벤트 상태 관리 (진행중/예정/종료)
-- 대시보드용 이벤트 목록 제공
-- 이벤트 검색 및 필터링
+**도메인 이벤트**:
+1. **EventCreated**: 이벤트 생성 완료 시
+ - Payload: eventId, storeId, title, objective, createdAt
+ - 구독자: Event Query Service, Analytics Query Service
+
+2. **EventPublished**: 이벤트 배포 승인 시
+ - Payload: eventId, distributionChannels, publishedAt
+ - 구독자: Distribution Service
+
+**주요 플로우**:
+1. 이벤트 목적 선택 → Event DB 저장
+2. AI 추천 요청 → Job Queue 발행
+3. 이미지 생성 요청 → Job Queue 발행
+4. 배포 승인 → EventPublished 이벤트 발행
**데이터 저장**:
-- Event DB: events, event_objectives, event_prizes 테이블
+- Event Write DB: events, event_objectives, event_prizes 테이블
+
+#### Participation Command Service
+**핵심 책임**:
+- 이벤트 참여 접수 및 검증
+- 당첨자 추첨 실행
+- 도메인 이벤트 발행 (ParticipantRegistered, WinnerSelected)
+
+**관련 유저스토리**: UFR-PART-010, 020, 030
+
+**도메인 이벤트**:
+1. **ParticipantRegistered**: 참여자 등록 시
+ - Payload: participantId, eventId, phoneNumber, registeredAt
+ - 구독자: Participation Query Service, Analytics Query Service
+
+2. **WinnerSelected**: 당첨자 선정 시
+ - Payload: winnerId, eventId, selectedAt
+ - 구독자: Participation Query Service
+
+**주요 기능**:
+- 중복 참여 체크 (전화번호 기반)
+- 난수 기반 무작위 추첨
+- 매장 방문 고객 가산점 적용
+
+**데이터 저장**:
+- Participation Write DB: participants, winners 테이블
+
+### 2.3 Query Services (읽기 전용)
+
+#### Event Query Service
+**핵심 책임**:
+- 이벤트 목록/상세 조회
+- 이벤트 검색 및 필터링
+- 읽기 최적화 데이터 제공
+
+**이벤트 구독**:
+- **EventCreated**: 읽기 DB에 이벤트 데이터 동기화
+
+**데이터 모델**:
+- **비정규화**: 조인 없이 단일 쿼리로 조회 가능
+- **인덱스 최적화**: storeId, status, createdAt
+
+**데이터 저장**:
+- Event Read DB: events_view (비정규화 테이블)
+
+#### Participation Query Service
+**핵심 책임**:
+- 참여자 목록 조회
+- 당첨자 조회
+- 집계 데이터 제공
+
+**이벤트 구독**:
+- **ParticipantRegistered**: 참여자 데이터 동기화
+- **WinnerSelected**: 당첨자 데이터 동기화
+
+**데이터 모델**:
+- **집계 테이블**: 이벤트별 참여자 수, 당첨자 수 사전 계산
+
+**데이터 저장**:
+- Participation Read DB: participants_view, winners_view, event_participant_stats
+
+#### Analytics Query Service
+**핵심 책임**:
+- 실시간 성과 대시보드
+- 채널별 성과 분석
+- ROI 계산
+
+**관련 유저스토리**: UFR-ANAL-010
+
+**이벤트 구독**:
+- **EventCreated**: 이벤트 기본 정보 동기화
+- **ParticipantRegistered**: 참여자 수 실시간 업데이트
+- **DistributionCompleted**: 배포 통계 업데이트
+
+**Resilience 패턴**:
+- **Circuit Breaker**: 외부 채널 API 조회 시
+- **Fallback**: 캐시된 이전 데이터 반환
+- **Cache-Aside**: Redis 캐싱 (TTL 5분)
+
+**데이터 통합**:
+- Event Query Service: 이벤트 정보
+- Participation Query Service: 참여자/당첨자 데이터
+- Distribution Service: 배포 통계
+- 외부 APIs: 우리동네TV, 지니TV, SNS 통계
+
+**데이터 저장**:
+- Analytics DB: event_stats, channel_stats
+- Redis: 대시보드 데이터 (TTL 5분)
+
+### 2.4 Async Services (비동기 처리)
#### AI Service
**핵심 책임**:
- 업종/지역/시즌 트렌드 분석
- 3가지 이벤트 기획안 자동 생성
-- 예상 성과 계산 (참여자 수, 비용, ROI)
+- 예상 성과 계산
**관련 유저스토리**: UFR-AI-010
-**주요 기능**:
-- Claude/GPT-4 API 연동
-- 비동기 처리 (Job 기반)
-- 트렌드 분석 결과 캐싱 (TTL 24시간)
-- 3가지 옵션 차별화 (저비용/중비용/고비용)
+**Resilience 패턴**:
+- **Circuit Breaker**: AI API 호출 시 (실패율 10% 초과 시 Open)
+- **Timeout**: 30초
+- **Fallback**: 캐시된 이전 추천 결과 + 안내 메시지
+- **Cache-Aside**: Redis 캐싱 (TTL 24시간)
**처리 시간**:
- 캐시 HIT: 0.1초
@@ -160,16 +307,16 @@
#### Content Service
**핵심 책임**:
- 3가지 스타일 SNS 이미지 자동 생성
-- 플랫폼별 이미지 최적화 (Instagram, Naver, Kakao)
-- 이미지 편집 기능 제공
+- 플랫폼별 이미지 최적화
+- 이미지 편집 기능
**관련 유저스토리**: UFR-CONT-010, 020
-**주요 기능**:
-- Stable Diffusion/DALL-E API 연동
-- 비동기 이미지 생성 (Job 기반)
-- 3가지 스타일 카드 생성 (심플/화려한/트렌디)
-- 생성 이미지 캐싱 및 CDN 업로드
+**Resilience 패턴**:
+- **Circuit Breaker**: 이미지 생성 API 호출 시
+- **Timeout**: 20초
+- **Fallback**: 기본 템플릿 이미지 제공
+- **Cache-Aside**: Redis 캐싱 (TTL 7일)
**처리 시간**:
- 캐시 HIT: 0.1초
@@ -181,222 +328,353 @@
#### Distribution Service
**핵심 책임**:
-- 다중 채널 동시 배포 (우리동네TV, 링고비즈, 지니TV, SNS)
+- 다중 채널 동시 배포
- 배포 상태 모니터링
-- 채널별 독립적 처리 및 실패 재시도
+- 도메인 이벤트 발행 (DistributionCompleted)
**관련 유저스토리**: UFR-DIST-010, 020
-**주요 기능**:
-- 7개 외부 API 병렬 연동 (Circuit Breaker 적용)
-- 채널별 독립 처리 (하나 실패해도 다른 채널 계속)
-- 자동 재시도 (최대 3회)
-- Fallback 전략 (배포 스킵 + 알림)
+**이벤트 구독**:
+- **EventPublished**: 배포 작업 시작 트리거
+
+**도메인 이벤트**:
+- **DistributionCompleted**: 배포 완료 시
+ - Payload: eventId, distributedChannels, completedAt
+ - 구독자: Analytics Query Service
+
+**Resilience 패턴**:
+- **Circuit Breaker**: 각 외부 채널 API별 독립 적용
+- **Retry**: 최대 3회 재시도 (지수 백오프)
+- **Bulkhead**: 채널별 스레드 풀 격리 (장애 전파 방지)
+- **Fallback**: 실패 채널 스킵 + 알림
**처리 시간**: 1분 이내 (모든 채널 배포 완료)
**데이터 저장**:
-- Event DB: distribution_logs 테이블
+- Event Read DB: distribution_logs 테이블
-#### Participation Service
-**핵심 책임**:
-- 고객 이벤트 참여 접수
-- 참여자 목록 관리
-- 당첨자 자동 추첨
+### 2.5 Event-Driven 통신 전략
-**관련 유저스토리**: UFR-PART-010, 020, 030
+#### Event Bus 아키텍처
+**기술 스택**: Kafka 또는 AWS SQS
+**보장 수준**: At-Least-Once Delivery
+**메시지 포맷**: JSON
-**주요 기능**:
-- 중복 참여 체크 (전화번호 기반)
-- 참여자 목록 조회 및 필터링
-- 난수 기반 무작위 추첨
-- 매장 방문 고객 가산점 옵션
+#### 도메인 이벤트 정의
-**데이터 저장**:
-- Participation DB: participants, winners 테이블
+| 이벤트명 | 발행자 | 구독자 | Payload | 용도 |
+|---------|--------|--------|---------|------|
+| **EventCreated** | Event Command | Event Query
Analytics Query | eventId, storeId, title, objective, createdAt | 이벤트 생성 동기화 |
+| **EventPublished** | Event Command | Distribution Service | eventId, distributionChannels, publishedAt | 배포 작업 트리거 |
+| **ParticipantRegistered** | Participation Command | Participation Query
Analytics Query | participantId, eventId, phoneNumber, registeredAt | 참여자 등록 동기화 |
+| **WinnerSelected** | Participation Command | Participation Query | winnerId, eventId, selectedAt | 당첨자 선정 동기화 |
+| **DistributionCompleted** | Distribution Service | Analytics Query | eventId, distributedChannels, completedAt | 배포 완료 통계 업데이트 |
-#### Analytics Service
-**핵심 책임**:
-- 실시간 성과 대시보드
-- 채널별 성과 분석
-- 투자 대비 수익률 계산
+#### 통신 패턴별 설계
-**관련 유저스토리**: UFR-ANAL-010
+**1. Event-Driven 통신 (비동기 메시징)**
+- **사용 시나리오**: 서비스 간 상태 동기화, 느슨한 결합 필요 시
+- **장점**:
+ - 서비스 독립성 보장
+ - 장애 격리
+ - 확장 용이
+- **단점**:
+ - 최종 일관성 (Eventual Consistency)
+ - 디버깅 복잡도 증가
-**주요 기능**:
-- 다중 데이터 소스 통합 (7개 외부 API + 내부 서비스)
-- 5분 간격 데이터 폴링 및 캐싱
-- 실시간 차트 및 그래프 생성
-- POS 시스템 연동 (선택)
+**2. Job Queue 통신 (비동기 작업)**
+- **사용 시나리오**: 장시간 작업 (AI 추천, 이미지 생성)
+- **기술 스택**: RabbitMQ
+- **패턴**: Asynchronous Request-Reply
+- **처리 플로우**:
+ 1. Command Service → Job Queue: Job 발행
+ 2. Async Service → Job Queue: Job 수신 및 처리
+ 3. Client → Command Service: Job 상태 폴링 (5초 간격)
+ 4. Async Service → Redis: 결과 캐싱
+ 5. Command Service → Client: 완료 응답
-**처리 시간**: 0.5초 (캐시 기반)
+**3. Query Service 간 통신**
+- **사용 시나리오**: Analytics Query가 다른 Query Service 데이터 필요 시
+- **패턴**: Cache-Aside
+- **통신 방식**: REST API (HTTP/JSON)
+- **특징**: 읽기 전용이므로 직접 호출 허용
-**데이터 저장**:
-- Analytics DB: event_stats, channel_stats 테이블
-- Redis: 대시보드 데이터 (TTL 5분)
+#### Cache-Aside 전략
-### 2.2 서비스 간 통신 전략
+| 서비스 | 캐시 키 패턴 | TTL | 히트율 목표 | 효과 |
+|--------|-------------|-----|-----------|------|
+| AI Service | `ai:recommendation:{업종}:{지역}:{목적}` | 24시간 | 80% | 10초 → 0.1초 (99% 개선) |
+| Content Service | `content:image:{이벤트ID}:{스타일}` | 7일 | 80% | 5초 → 0.1초 (98% 개선) |
+| User Service | `user:business:{사업자번호}` | 7일 | 90% | - |
+| Analytics Query | `analytics:dashboard:{이벤트ID}` | 5분 | 95% | 3초 → 0.5초 (83% 개선) |
-#### 동기 통신 (Synchronous)
-**사용 시나리오**: 즉시 응답이 필요한 단순 조회
+#### Resilience 패턴 적용
-- **User → Redis**: 세션 정보 조회
-- **Event → User**: 사용자 정보 검증 (Token 검증은 API Gateway에서 처리)
-- **Participation → Event**: 이벤트 정보 조회
-- **Analytics → Event/Participation**: 통계 데이터 조회
+**1. Circuit Breaker 패턴**
+- **적용 대상**: 모든 외부 API 호출
+- **라이브러리**: Resilience4j 또는 Hystrix
+- **설정**:
+ ```yaml
+ circuit-breaker:
+ failure-rate-threshold: 50% # 실패율 50% 초과 시 Open
+ slow-call-rate-threshold: 50% # 느린 호출 50% 초과 시 Open
+ slow-call-duration-threshold: 5s # 5초 초과 시 느린 호출로 간주
+ wait-duration-in-open-state: 30s # Open 상태 30초 유지 후 Half-Open
+ permitted-calls-in-half-open: 3 # Half-Open 상태에서 3개 요청 테스트
+ ```
-**통신 방식**: REST API (HTTP/JSON)
+**2. Retry 패턴**
+- **적용 대상**: 일시적 장애가 예상되는 외부 API
+- **재시도 전략**: 지수 백오프 (Exponential Backoff)
+- **설정**:
+ ```yaml
+ retry:
+ max-attempts: 3 # 최대 3회 재시도
+ wait-duration: 1s # 초기 대기 시간 1초
+ exponential-backoff-multiplier: 2 # 2배씩 증가 (1초, 2초, 4초)
+ retry-exceptions:
+ - java.net.SocketTimeoutException
+ - java.net.ConnectException
+ ```
-#### 캐시 우선 전략 (Cache-Aside)
-**사용 시나리오**: 자주 사용되는 데이터, 외부 API 결과
+**3. Timeout 패턴**
+- **적용 대상**: 모든 외부 API 호출
+- **설정**:
+ | 서비스 | Timeout | 이유 |
+ |--------|---------|------|
+ | User Service (국세청 API) | 5초 | 빠른 검증 필요 |
+ | AI Service (AI API) | 30초 | 복잡한 분석 작업 |
+ | Content Service (이미지 API) | 20초 | 이미지 생성 시간 고려 |
+ | Distribution Service (채널 APIs) | 10초 | 빠른 배포 필요 |
-- **AI Service**: 트렌드 분석 및 이벤트 추천 결과
- - 캐시 키: `ai:recommendation:{업종}:{지역}:{목적}`
- - TTL: 24시간
- - 히트율 목표: 80%
+**4. Bulkhead 패턴**
+- **적용 대상**: Distribution Service (다중 채널 배포)
+- **목적**: 채널별 리소스 격리로 장애 전파 차단
+- **설정**:
+ ```yaml
+ bulkhead:
+ max-concurrent-calls: 10 # 채널당 최대 10개 동시 호출
+ max-wait-duration: 0s # 대기 없이 즉시 실패
+ ```
-- **Content Service**: 생성된 이미지 URL
- - 캐시 키: `content:image:{이벤트ID}:{스타일}`
- - TTL: 7일
- - 히트율 목표: 80%
+**5. Fallback 패턴**
+- **적용 대상**: 모든 외부 API 호출
+- **전략**:
+ | 서비스 | Fallback 전략 |
+ |--------|---------------|
+ | User Service | 사업자번호 검증 스킵 (수동 확인 안내) |
+ | AI Service | 캐시된 이전 추천 결과 + 안내 메시지 |
+ | Content Service | 기본 템플릿 이미지 제공 |
+ | Distribution Service | 실패 채널 스킵 + 알림 |
+ | Analytics Query | 캐시된 이전 데이터 반환 |
-- **User Service**: 사업자번호 검증 결과
- - 캐시 키: `user:business:{사업자번호}`
- - TTL: 7일
- - 히트율 목표: 90%
+#### 이벤트 순서 보장
+- **Kafka Partition Key**: eventId 기준으로 파티션 할당
+- **동일 이벤트의 모든 이벤트**: 동일 파티션 → 순서 보장
+- **다른 이벤트**: 독립적 처리 → 병렬 처리 가능
-- **Analytics Service**: 대시보드 데이터
- - 캐시 키: `analytics:dashboard:{이벤트ID}`
- - TTL: 5분
- - 히트율 목표: 95%
-
-**효과**:
-- AI 응답 시간: 10초 → 0.1초 (99% 개선, 캐시 히트 시)
-- 이미지 생성 시간: 5초 → 0.1초 (98% 개선, 캐시 히트 시)
-- 대시보드 로딩 시간: 3초 → 0.5초 (83% 개선)
-
-#### 비동기 처리 (Asynchronous Request-Reply)
-**사용 시나리오**: 장시간 작업 (10초 이상 소요)
-
-- **AI Service**: 트렌드 분석 + 이벤트 추천 (10초)
- 1. 클라이언트 → Event Service: POST /api/ai/recommendations
- 2. Event Service → AI Service: Job 생성
- 3. AI Service → 클라이언트: Job ID 즉시 반환 (0.1초)
- 4. 백그라운드: AI Service → Claude API (10초)
- 5. 폴링: 클라이언트 → Event Service: GET /api/jobs/{id} (5초 간격)
- 6. 완료: AI Service → 클라이언트: 최종 결과 반환
-
-- **Content Service**: 이미지 생성 (5초)
- 1. 클라이언트 → Event Service: POST /api/content/images
- 2. Event Service → Content Service: Job 생성
- 3. Content Service → 클라이언트: Job ID 즉시 반환 (0.1초)
- 4. 백그라운드: Content Service → Stable Diffusion API (5초)
- 5. 폴링: 클라이언트 → Event Service: GET /api/jobs/{id} (3초 간격)
- 6. 완료: Content Service → 클라이언트: 최종 결과 반환
-
-**Message Queue 사용**:
-- RabbitMQ 또는 Kafka
-- Priority Queue: AI 작업 우선순위 관리
-- Dead Letter Queue: 실패 작업 처리
-
-#### Circuit Breaker 패턴
-**사용 시나리오**: 외부 API 장애 격리
-
-- **적용 대상**: 7개 외부 API
- - 국세청 API
- - Claude/GPT-4 API
- - Stable Diffusion/DALL-E API
- - 우리동네TV API
- - 링고비즈 API
- - 지니TV API
- - SNS APIs (Instagram, Naver, Kakao)
-
-- **동작 방식**:
- - Closed (정상): 실패율 5% 미만
- - Open (차단): 실패율 5% 초과 시 Circuit Open → 모든 요청 Fallback
- - Half-Open (테스트): 30초 후 1개 요청 시도 → 성공 시 Closed로 전환
-
-- **Fallback 전략**:
- - AI Service: 캐시된 이전 추천 결과 + 안내 메시지
- - Distribution Service: 해당 채널 배포 스킵 + 알림
- - User Service: 사업자번호 검증 스킵 (수동 확인으로 대체)
-
-**효과**: 가용성 95% → 99% 개선
+#### 이벤트 재처리 (At-Least-Once)
+- **멱등성 보장**: 구독자는 동일 이벤트 중복 처리 시 멱등성 유지
+- **방법**: 이벤트 ID 기반 중복 체크 (Redis Set 사용)
---
## 3. 주요 사용자 플로우
-### 3.1 이벤트 생성 플로우 (핵심 플로우)
+### 3.1 이벤트 생성 플로우 (CQRS + Event-Driven)
```
-1. [User] 07-이벤트목적선택
- - 클라이언트 → API Gateway → Event Service
- - Event: 목적 저장 (신규 고객 유치/재방문 유도/매출 증대/인지도 향상)
+1. [이벤트 목적 선택]
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Client → Event Command Service │
+ │ - POST /api/events (목적, 매장 정보) │
+ │ - Event Write DB에 저장 │
+ │ - EventCreated 이벤트 발행 → Event Bus │
+ └─────────────────────────────────────────────────────────────┘
-2. [AI] 08-AI이벤트추천
- - 클라이언트 → API Gateway → Event Service → AI Service
- - AI: Job ID 즉시 반환 (0.1초)
- - 백그라운드: AI Service → Claude API (10초)
- * 캐시 확인 (Cache-Aside)
- * 캐시 MISS: Claude API 호출 → 결과 캐싱 (TTL 24시간)
- - 폴링: 클라이언트 → Event Service (5초 간격)
- - 완료: AI 추천 결과 (3가지 옵션) 반환
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Event Bus → Event Query Service │
+ │ - EventCreated 이벤트 구독 │
+ │ - Event Read DB에 동기화 (비정규화) │
+ └─────────────────────────────────────────────────────────────┘
-3. [Content] 09-SNS이미지생성
- - 클라이언트 → API Gateway → Event Service → Content Service
- - Content: Job ID 즉시 반환 (0.1초)
- - 백그라운드: Content Service → Stable Diffusion API (5초)
- * 캐시 확인 (Cache-Aside)
- * 캐시 MISS: Stable Diffusion API 호출 → 이미지 CDN 업로드 → 결과 캐싱 (TTL 7일)
- - 폴링: 클라이언트 → Event Service (3초 간격)
- - 완료: 3가지 스타일 이미지 URL 반환
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Event Bus → Analytics Query Service │
+ │ - EventCreated 이벤트 구독 │
+ │ - Analytics DB에 기본 통계 초기화 │
+ └─────────────────────────────────────────────────────────────┘
-4. [Content] 10-콘텐츠편집
- - 클라이언트 → API Gateway → Content Service
- - Content: 텍스트/색상 편집 적용 → 새 이미지 생성
+2. [AI 이벤트 추천]
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Client → Event Command Service │
+ │ - POST /api/events/{id}/ai-recommendations │
+ │ - Job Queue 발행 (AI 작업 요청) │
+ │ - Job ID 즉시 반환 (0.1초) │
+ └─────────────────────────────────────────────────────────────┘
-5. [Distribution] 11-배포채널선택
- - 클라이언트 → API Gateway → Event Service
- - Event: 배포 채널 정보 저장
+ ┌─────────────────────────────────────────────────────────────┐
+ │ AI Service (Background) │
+ │ - Job Queue 구독 │
+ │ - Redis 캐시 확인 (Cache-Aside) │
+ │ - 캐시 MISS: Claude API 호출 (10초) [Circuit Breaker] │
+ │ - 결과 캐싱 (TTL 24시간) │
+ │ - Job 상태 완료로 업데이트 │
+ └─────────────────────────────────────────────────────────────┘
-6. [Event] 12-최종승인
- - 클라이언트 → API Gateway → Event Service
- - Event: 이벤트 생성 완료 → Distribution Service 호출
- - Distribution: 다중 채널 배포 시작 (Circuit Breaker 적용)
- * 우리동네TV API (영상 업로드)
- * 링고비즈 API (연결음 업데이트)
- * 지니TV API (광고 등록)
- * SNS APIs (Instagram, Naver, Kakao 자동 포스팅)
- - 배포 완료: 대시보드로 이동
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Client (Polling) │
+ │ - GET /api/jobs/{id} (5초 간격) │
+ │ - 완료 시: AI 추천 결과 반환 (3가지 옵션) │
+ └─────────────────────────────────────────────────────────────┘
+
+3. [SNS 이미지 생성]
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Client → Event Command Service │
+ │ - POST /api/events/{id}/content-generation │
+ │ - Job Queue 발행 (이미지 생성 요청) │
+ │ - Job ID 즉시 반환 (0.1초) │
+ └─────────────────────────────────────────────────────────────┘
+
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Content Service (Background) │
+ │ - Job Queue 구독 │
+ │ - Redis 캐시 확인 │
+ │ - 캐시 MISS: Stable Diffusion API (5초) [Circuit Breaker] │
+ │ - 이미지 CDN 업로드 │
+ │ - CDN URL 캐싱 (TTL 7일) │
+ │ - Job 상태 완료로 업데이트 │
+ └─────────────────────────────────────────────────────────────┘
+
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Client (Polling) │
+ │ - GET /api/jobs/{id} (3초 간격) │
+ │ - 완료 시: 3가지 스타일 이미지 URL 반환 │
+ └─────────────────────────────────────────────────────────────┘
+
+4. [최종 승인 및 배포]
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Client → Event Command Service │
+ │ - POST /api/events/{id}/publish │
+ │ - Event 상태 변경 (DRAFT → PUBLISHED) │
+ │ - EventPublished 이벤트 발행 → Event Bus │
+ └─────────────────────────────────────────────────────────────┘
+
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Event Bus → Distribution Service │
+ │ - EventPublished 이벤트 구독 │
+ │ - 다중 채널 병렬 배포 시작 [Circuit Breaker + Bulkhead] │
+ │ * 우리동네TV API (영상 업로드) [Retry: 3회] │
+ │ * 링고비즈 API (연결음 업데이트) [Retry: 3회] │
+ │ * 지니TV API (광고 등록) [Retry: 3회] │
+ │ * SNS APIs (Instagram, Naver, Kakao) [Retry: 3회] │
+ │ - 배포 완료: DistributionCompleted 이벤트 발행 │
+ └─────────────────────────────────────────────────────────────┘
+
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Event Bus → Analytics Query Service │
+ │ - DistributionCompleted 이벤트 구독 │
+ │ - Analytics DB 배포 통계 업데이트 │
+ │ - 대시보드 캐시 무효화 (다음 조회 시 갱신) │
+ └─────────────────────────────────────────────────────────────┘
```
-### 3.2 고객 참여 플로우
+### 3.2 고객 참여 플로우 (Event-Driven)
```
-1. [Participation] 15-이벤트참여
- - 외부 채널 (SNS/TV/연결음) → 이벤트 발견
- - 클라이언트 → API Gateway → Participation Service
- - Participation: 중복 참여 체크 (전화번호 기반)
- - 참여 접수 완료 → 응모 번호 발급
+1. [이벤트 참여]
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Client → Participation Command Service │
+ │ - POST /api/events/{id}/participate │
+ │ - 중복 참여 체크 (전화번호 기반) │
+ │ - Participation Write DB에 저장 │
+ │ - ParticipantRegistered 이벤트 발행 → Event Bus │
+ │ - 응모 번호 즉시 반환 │
+ └─────────────────────────────────────────────────────────────┘
+
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Event Bus → Participation Query Service │
+ │ - ParticipantRegistered 이벤트 구독 │
+ │ - Participation Read DB에 동기화 │
+ │ - 이벤트별 참여자 수 집계 테이블 업데이트 │
+ └─────────────────────────────────────────────────────────────┘
+
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Event Bus → Analytics Query Service │
+ │ - ParticipantRegistered 이벤트 구독 │
+ │ - 실시간 참여자 수 증가 │
+ │ - 대시보드 캐시 무효화 │
+ └─────────────────────────────────────────────────────────────┘
+
+2. [당첨자 추첨]
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Client → Participation Command Service │
+ │ - POST /api/events/{id}/draw-winners │
+ │ - 난수 기반 무작위 추첨 │
+ │ - Winners Write DB에 저장 │
+ │ - WinnerSelected 이벤트 발행 → Event Bus │
+ └─────────────────────────────────────────────────────────────┘
+
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Event Bus → Participation Query Service │
+ │ - WinnerSelected 이벤트 구독 │
+ │ - Winners Read DB에 동기화 │
+ └─────────────────────────────────────────────────────────────┘
```
-### 3.3 성과 분석 플로우
+### 3.3 성과 분석 플로우 (Query Service + Event 구독)
```
-1. [Analytics] 17-실시간대시보드
- - 클라이언트 → API Gateway → Analytics Service
- - Analytics: 캐시 확인 (TTL 5분)
- * 캐시 HIT: 즉시 반환 (0.5초)
- * 캐시 MISS: 다중 데이터 소스 통합
- - Participation Service: 참여자 데이터
- - Distribution Service: 채널별 노출 수
- - 외부 APIs: 우리동네TV, 지니TV, SNS 통계
- - POS 시스템: 매출 데이터 (선택)
- * 결과 캐싱 (TTL 5분)
- - 실시간 차트/그래프 렌더링
+1. [실시간 대시보드 조회]
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Client → Analytics Query Service │
+ │ - GET /api/events/{id}/analytics │
+ │ - Redis 캐시 확인 (TTL 5분) │
+ │ * 캐시 HIT: 즉시 반환 (0.5초) │
+ │ * 캐시 MISS: 아래 데이터 통합 │
+ └─────────────────────────────────────────────────────────────┘
+
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Analytics Query Service (데이터 통합) │
+ │ - Analytics DB: 이벤트 통계 조회 │
+ │ - Event Query Service: 이벤트 정보 조회 (REST) │
+ │ - Participation Query Service: 참여자/당첨자 조회 (REST) │
+ │ - 외부 APIs: 채널별 노출/클릭 수 [Circuit Breaker + Fallback] │
+ │ * 우리동네TV API (조회수) │
+ │ * 지니TV API (광고 노출 수) │
+ │ * SNS APIs (좋아요, 댓글, 공유 수) │
+ │ - Redis 캐싱 (TTL 5분) │
+ │ - 대시보드 데이터 반환 │
+ └─────────────────────────────────────────────────────────────┘
+
+2. [실시간 업데이트 (Event 구독)]
+ ┌─────────────────────────────────────────────────────────────┐
+ │ Analytics Query Service (Background) │
+ │ - EventCreated 구독: 이벤트 기본 정보 초기화 │
+ │ - ParticipantRegistered 구독: 참여자 수 실시간 증가 │
+ │ - DistributionCompleted 구독: 배포 채널 통계 업데이트 │
+ │ - 캐시 무효화: 다음 조회 시 최신 데이터 갱신 │
+ └─────────────────────────────────────────────────────────────┘
```
+### 3.4 플로우 특징
+
+#### CQRS 이점
+- **Command Service**: 쓰기 작업에 집중, 트랜잭션 보장
+- **Query Service**: 읽기 최적화 데이터 모델, 빠른 조회
+- **독립적 확장**: 읽기/쓰기 부하에 따라 독립 스케일링
+
+#### Event-Driven 이점
+- **느슨한 결합**: 서비스 간 직접 의존성 제거
+- **장애 격리**: 한 서비스 장애가 다른 서비스에 영향 없음
+- **확장 용이**: 새로운 구독자 추가로 기능 확장
+- **비동기 처리**: 사용자 응답 시간 단축
+
+#### Resilience 이점
+- **Circuit Breaker**: 외부 API 장애 시 빠른 실패 및 복구
+- **Retry**: 일시적 장애 자동 복구
+- **Fallback**: 장애 시에도 서비스 지속 (Graceful Degradation)
+- **Bulkhead**: 리소스 격리로 장애 전파 차단
+
---
## 4. 데이터 흐름 및 캐싱 전략
@@ -606,21 +884,27 @@
- [클라우드 디자인 패턴](../../../claude/cloud-design-patterns.md)
### B. 주요 결정사항
-1. **Cache-Aside 패턴 채택**: AI 응답 시간 90% 개선 목표
-2. **Asynchronous Request-Reply 패턴 채택**: AI/이미지 생성 비동기 처리
-3. **Circuit Breaker 패턴 채택**: 외부 API 장애 격리
-4. **서비스별 독립 Database**: 마이크로서비스 독립성 보장
-5. **Redis 캐시 우선 전략**: 서비스 간 직접 의존성 최소화
+1. **CQRS 패턴 채택**: 읽기/쓰기 책임 분리로 독립적 확장 및 성능 최적화
+2. **Event-Driven 아키텍처 채택**: Event Bus(Kafka/SQS)를 통한 서비스 간 느슨한 결합
+3. **도메인 이벤트 정의**: 5개 핵심 이벤트로 서비스 간 상태 동기화
+4. **Resilience 패턴 전면 적용**: Circuit Breaker, Retry, Timeout, Bulkhead, Fallback
+5. **At-Least-Once Delivery**: 이벤트 보장 수준 및 멱등성 설계
+6. **Cache-Aside 패턴**: AI/이미지 생성 결과 캐싱으로 응답 시간 90% 개선
+7. **Job Queue 분리**: RabbitMQ로 장시간 비동기 작업 처리
+8. **서비스별 독립 Database**: Command/Query별 독립 DB로 CQRS 지원
### C. 향후 개선 방안 (Phase 2 이후)
-1. **Saga 패턴**: 복잡한 분산 트랜잭션 관리
-2. **CQRS 패턴**: 읽기/쓰기 분리로 대시보드 성능 최적화
-3. **Event Sourcing**: 이벤트 변경 이력 추적 및 감사
-4. **Service Mesh**: Istio를 통한 고급 트래픽 관리
-5. **Database Sharding**: 쓰기 확장성 개선
+1. **Event Sourcing 완전 적용**: 모든 상태 변경을 이벤트로 저장하여 시간 여행 및 감사 추적 강화
+2. **Saga 패턴 적용**: 복잡한 분산 트랜잭션 보상 로직 체계화
+3. **Service Mesh 도입**: Istio를 통한 서비스 간 통신 관찰성 및 보안 강화
+4. **Database Sharding**: Event/Participation Write DB 샤딩으로 쓰기 확장성 개선
+5. **WebSocket 기반 실시간 푸시**: 대시보드 실시간 업데이트 (폴링 대체)
+6. **GraphQL API Gateway**: 클라이언트 맞춤형 데이터 조회 최적화
+7. **Dead Letter Queue 고도화**: 실패 이벤트 재처리 및 알림 자동화
---
-**문서 버전**: 1.0
-**최종 수정일**: 2025-10-21
+**문서 버전**: 2.0
+**최종 수정일**: 2025-10-22
**작성자**: System Architect
+**변경 사항**: CQRS 패턴 및 Event-Driven 아키텍처 전환, Resilience 패턴 전면 적용
diff --git a/design/backend/logical/logical-architecture.md.backup b/design/backend/logical/logical-architecture.md.backup
new file mode 100644
index 0000000..a8f3553
--- /dev/null
+++ b/design/backend/logical/logical-architecture.md.backup
@@ -0,0 +1,626 @@
+# KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 논리 아키텍처
+
+## 문서 정보
+- **작성일**: 2025-10-21
+- **버전**: 1.0
+- **작성자**: System Architect
+- **관련 문서**:
+ - [유저스토리](../../userstory.md)
+ - [아키텍처 패턴](../../pattern/architecture-pattern.md)
+ - [UI/UX 설계서](../../uiux/uiux.md)
+
+---
+
+## 목차
+1. [개요](#1-개요)
+2. [서비스 아키텍처](#2-서비스-아키텍처)
+3. [주요 사용자 플로우](#3-주요-사용자-플로우)
+4. [데이터 흐름 및 캐싱 전략](#4-데이터-흐름-및-캐싱-전략)
+5. [확장성 및 성능 고려사항](#5-확장성-및-성능-고려사항)
+6. [보안 고려사항](#6-보안-고려사항)
+7. [논리 아키텍처 다이어그램](#7-논리-아키텍처-다이어그램)
+
+---
+
+## 1. 개요
+
+### 1.1 설계 원칙
+
+본 논리 아키텍처는 다음 원칙을 기반으로 설계되었습니다:
+
+#### 유저스토리 기반 설계
+- 20개 유저스토리와 정확히 매칭
+- 불필요한 추가 기능 배제
+- 비즈니스 요구사항 우선 반영
+
+#### 마이크로서비스 아키텍처
+- **서비스 독립성**: 각 서비스는 독립적으로 배포 및 확장 가능
+- **캐시 우선 전략**: Redis를 통한 서비스 간 데이터 공유 최소화
+- **선택적 비동기**: AI 및 이미지 생성 등 장시간 작업만 비동기 처리
+- **느슨한 결합**: 서비스 간 직접 의존성 최소화
+
+#### 클라우드 디자인 패턴 적용
+- **Cache-Aside**: AI 응답, 이미지 생성 결과 캐싱 (응답 시간 90% 개선)
+- **API Gateway**: 중앙집중식 인증/라우팅/Rate Limiting
+- **Asynchronous Request-Reply**: AI 추천, 이미지 생성 비동기 처리
+- **Circuit Breaker**: 7개 외부 API 장애 격리 (가용성 99% 목표)
+
+### 1.2 핵심 컴포넌트 정의
+
+#### Client Layer
+- **Web/Mobile Client**: 반응형 React 애플리케이션
+ - Mobile First 설계 (60% 모바일 사용자)
+ - Progressive Web App (PWA) 지원
+
+#### Gateway Layer
+- **API Gateway**: Kong 또는 AWS API Gateway
+ - JWT 토큰 기반 인증/인가
+ - URL 기반 서비스 라우팅
+ - Rate Limiting (사용자당 100 req/min)
+ - 중앙집중식 로깅 및 모니터링
+
+#### Service Layer (7개 마이크로서비스)
+1. **User Service**: 사용자 인증 및 매장정보 관리
+2. **Event Service**: 이벤트 CRUD 및 상태 관리
+3. **AI Service**: 트렌드 분석 및 이벤트 추천
+4. **Content Service**: SNS 이미지 자동 생성
+5. **Distribution Service**: 다중 채널 배포 관리
+6. **Participation Service**: 이벤트 참여 및 당첨자 관리
+7. **Analytics Service**: 실시간 성과 대시보드
+
+#### Data Layer
+- **Redis Cache**:
+ - 세션 정보 (User)
+ - AI 추천 결과 (TTL 24시간)
+ - 이미지 생성 결과 (TTL 7일)
+ - 사업자번호 검증 결과 (TTL 7일)
+ - 대시보드 데이터 (TTL 5분)
+- **Message Queue** (RabbitMQ/Kafka):
+ - AI 작업 큐 (비동기 처리)
+ - 이미지 생성 큐
+ - 배포 작업 큐
+- **Database** (PostgreSQL):
+ - 서비스별 독립 데이터베이스
+ - User DB, Event DB, Participation DB, Analytics DB
+
+#### External APIs
+- **국세청 사업자등록정보 진위확인 API**: 사업자번호 검증
+- **Claude API / GPT-4 API**: AI 트렌드 분석 및 이벤트 추천
+- **Stable Diffusion / DALL-E API**: SNS 이미지 생성
+- **우리동네TV API**: 영상 배포
+- **링고비즈 API**: 연결음 업데이트
+- **지니TV 광고 API**: TV 광고 배포
+- **SNS APIs** (Instagram, Naver, Kakao): SNS 자동 포스팅
+
+---
+
+## 2. 서비스 아키텍처
+
+### 2.1 서비스별 책임
+
+#### User Service
+**핵심 책임**:
+- 회원가입/로그인 (JWT 토큰 발급)
+- 프로필 관리 (매장 정보 포함)
+- 사업자번호 검증 (국세청 API 연동)
+- 로그아웃 및 세션 관리
+
+**관련 유저스토리**: UFR-USER-010, 020, 030, 040
+
+**주요 기능**:
+- JWT 기반 인증/인가
+- Redis를 통한 세션 관리
+- 사업자번호 검증 결과 캐싱 (TTL 7일)
+- 매장 정보 CRUD
+
+**데이터 저장**:
+- User DB: users, stores 테이블
+- Redis: 세션 정보, 사업자번호 검증 결과
+
+#### Event Service
+**핵심 책임**:
+- 이벤트 CRUD 및 상태 관리
+- 이벤트 생성 플로우 오케스트레이션
+- 이벤트 목록 조회 및 필터링
+- 이벤트 상세 정보 조회
+
+**관련 유저스토리**: UFR-EVENT-010, 020, 030, 040, 050, 060, 070
+
+**주요 기능**:
+- 이벤트 생성 플로우 관리 (목적 선택 → AI 추천 → 콘텐츠 생성 → 배포)
+- 이벤트 상태 관리 (진행중/예정/종료)
+- 대시보드용 이벤트 목록 제공
+- 이벤트 검색 및 필터링
+
+**데이터 저장**:
+- Event DB: events, event_objectives, event_prizes 테이블
+
+#### AI Service
+**핵심 책임**:
+- 업종/지역/시즌 트렌드 분석
+- 3가지 이벤트 기획안 자동 생성
+- 예상 성과 계산 (참여자 수, 비용, ROI)
+
+**관련 유저스토리**: UFR-AI-010
+
+**주요 기능**:
+- Claude/GPT-4 API 연동
+- 비동기 처리 (Job 기반)
+- 트렌드 분석 결과 캐싱 (TTL 24시간)
+- 3가지 옵션 차별화 (저비용/중비용/고비용)
+
+**처리 시간**:
+- 캐시 HIT: 0.1초
+- 캐시 MISS: 10초 이내 (비동기 Job 처리)
+
+**데이터 저장**:
+- Redis: AI 추천 결과 (TTL 24시간)
+- Redis: Job 상태 정보 (TTL 1시간)
+
+#### Content Service
+**핵심 책임**:
+- 3가지 스타일 SNS 이미지 자동 생성
+- 플랫폼별 이미지 최적화 (Instagram, Naver, Kakao)
+- 이미지 편집 기능 제공
+
+**관련 유저스토리**: UFR-CONT-010, 020
+
+**주요 기능**:
+- Stable Diffusion/DALL-E API 연동
+- 비동기 이미지 생성 (Job 기반)
+- 3가지 스타일 카드 생성 (심플/화려한/트렌디)
+- 생성 이미지 캐싱 및 CDN 업로드
+
+**처리 시간**:
+- 캐시 HIT: 0.1초
+- 캐시 MISS: 5초 이내 (비동기 Job 처리)
+
+**데이터 저장**:
+- Redis: 이미지 생성 결과 (CDN URL, TTL 7일)
+- CDN: 생성된 이미지 파일
+
+#### Distribution Service
+**핵심 책임**:
+- 다중 채널 동시 배포 (우리동네TV, 링고비즈, 지니TV, SNS)
+- 배포 상태 모니터링
+- 채널별 독립적 처리 및 실패 재시도
+
+**관련 유저스토리**: UFR-DIST-010, 020
+
+**주요 기능**:
+- 7개 외부 API 병렬 연동 (Circuit Breaker 적용)
+- 채널별 독립 처리 (하나 실패해도 다른 채널 계속)
+- 자동 재시도 (최대 3회)
+- Fallback 전략 (배포 스킵 + 알림)
+
+**처리 시간**: 1분 이내 (모든 채널 배포 완료)
+
+**데이터 저장**:
+- Event DB: distribution_logs 테이블
+
+#### Participation Service
+**핵심 책임**:
+- 고객 이벤트 참여 접수
+- 참여자 목록 관리
+- 당첨자 자동 추첨
+
+**관련 유저스토리**: UFR-PART-010, 020, 030
+
+**주요 기능**:
+- 중복 참여 체크 (전화번호 기반)
+- 참여자 목록 조회 및 필터링
+- 난수 기반 무작위 추첨
+- 매장 방문 고객 가산점 옵션
+
+**데이터 저장**:
+- Participation DB: participants, winners 테이블
+
+#### Analytics Service
+**핵심 책임**:
+- 실시간 성과 대시보드
+- 채널별 성과 분석
+- 투자 대비 수익률 계산
+
+**관련 유저스토리**: UFR-ANAL-010
+
+**주요 기능**:
+- 다중 데이터 소스 통합 (7개 외부 API + 내부 서비스)
+- 5분 간격 데이터 폴링 및 캐싱
+- 실시간 차트 및 그래프 생성
+- POS 시스템 연동 (선택)
+
+**처리 시간**: 0.5초 (캐시 기반)
+
+**데이터 저장**:
+- Analytics DB: event_stats, channel_stats 테이블
+- Redis: 대시보드 데이터 (TTL 5분)
+
+### 2.2 서비스 간 통신 전략
+
+#### 동기 통신 (Synchronous)
+**사용 시나리오**: 즉시 응답이 필요한 단순 조회
+
+- **User → Redis**: 세션 정보 조회
+- **Event → User**: 사용자 정보 검증 (Token 검증은 API Gateway에서 처리)
+- **Participation → Event**: 이벤트 정보 조회
+- **Analytics → Event/Participation**: 통계 데이터 조회
+
+**통신 방식**: REST API (HTTP/JSON)
+
+#### 캐시 우선 전략 (Cache-Aside)
+**사용 시나리오**: 자주 사용되는 데이터, 외부 API 결과
+
+- **AI Service**: 트렌드 분석 및 이벤트 추천 결과
+ - 캐시 키: `ai:recommendation:{업종}:{지역}:{목적}`
+ - TTL: 24시간
+ - 히트율 목표: 80%
+
+- **Content Service**: 생성된 이미지 URL
+ - 캐시 키: `content:image:{이벤트ID}:{스타일}`
+ - TTL: 7일
+ - 히트율 목표: 80%
+
+- **User Service**: 사업자번호 검증 결과
+ - 캐시 키: `user:business:{사업자번호}`
+ - TTL: 7일
+ - 히트율 목표: 90%
+
+- **Analytics Service**: 대시보드 데이터
+ - 캐시 키: `analytics:dashboard:{이벤트ID}`
+ - TTL: 5분
+ - 히트율 목표: 95%
+
+**효과**:
+- AI 응답 시간: 10초 → 0.1초 (99% 개선, 캐시 히트 시)
+- 이미지 생성 시간: 5초 → 0.1초 (98% 개선, 캐시 히트 시)
+- 대시보드 로딩 시간: 3초 → 0.5초 (83% 개선)
+
+#### 비동기 처리 (Asynchronous Request-Reply)
+**사용 시나리오**: 장시간 작업 (10초 이상 소요)
+
+- **AI Service**: 트렌드 분석 + 이벤트 추천 (10초)
+ 1. 클라이언트 → Event Service: POST /api/ai/recommendations
+ 2. Event Service → AI Service: Job 생성
+ 3. AI Service → 클라이언트: Job ID 즉시 반환 (0.1초)
+ 4. 백그라운드: AI Service → Claude API (10초)
+ 5. 폴링: 클라이언트 → Event Service: GET /api/jobs/{id} (5초 간격)
+ 6. 완료: AI Service → 클라이언트: 최종 결과 반환
+
+- **Content Service**: 이미지 생성 (5초)
+ 1. 클라이언트 → Event Service: POST /api/content/images
+ 2. Event Service → Content Service: Job 생성
+ 3. Content Service → 클라이언트: Job ID 즉시 반환 (0.1초)
+ 4. 백그라운드: Content Service → Stable Diffusion API (5초)
+ 5. 폴링: 클라이언트 → Event Service: GET /api/jobs/{id} (3초 간격)
+ 6. 완료: Content Service → 클라이언트: 최종 결과 반환
+
+**Message Queue 사용**:
+- RabbitMQ 또는 Kafka
+- Priority Queue: AI 작업 우선순위 관리
+- Dead Letter Queue: 실패 작업 처리
+
+#### Circuit Breaker 패턴
+**사용 시나리오**: 외부 API 장애 격리
+
+- **적용 대상**: 7개 외부 API
+ - 국세청 API
+ - Claude/GPT-4 API
+ - Stable Diffusion/DALL-E API
+ - 우리동네TV API
+ - 링고비즈 API
+ - 지니TV API
+ - SNS APIs (Instagram, Naver, Kakao)
+
+- **동작 방식**:
+ - Closed (정상): 실패율 5% 미만
+ - Open (차단): 실패율 5% 초과 시 Circuit Open → 모든 요청 Fallback
+ - Half-Open (테스트): 30초 후 1개 요청 시도 → 성공 시 Closed로 전환
+
+- **Fallback 전략**:
+ - AI Service: 캐시된 이전 추천 결과 + 안내 메시지
+ - Distribution Service: 해당 채널 배포 스킵 + 알림
+ - User Service: 사업자번호 검증 스킵 (수동 확인으로 대체)
+
+**효과**: 가용성 95% → 99% 개선
+
+---
+
+## 3. 주요 사용자 플로우
+
+### 3.1 이벤트 생성 플로우 (핵심 플로우)
+
+```
+1. [User] 07-이벤트목적선택
+ - 클라이언트 → API Gateway → Event Service
+ - Event: 목적 저장 (신규 고객 유치/재방문 유도/매출 증대/인지도 향상)
+
+2. [AI] 08-AI이벤트추천
+ - 클라이언트 → API Gateway → Event Service → AI Service
+ - AI: Job ID 즉시 반환 (0.1초)
+ - 백그라운드: AI Service → Claude API (10초)
+ * 캐시 확인 (Cache-Aside)
+ * 캐시 MISS: Claude API 호출 → 결과 캐싱 (TTL 24시간)
+ - 폴링: 클라이언트 → Event Service (5초 간격)
+ - 완료: AI 추천 결과 (3가지 옵션) 반환
+
+3. [Content] 09-SNS이미지생성
+ - 클라이언트 → API Gateway → Event Service → Content Service
+ - Content: Job ID 즉시 반환 (0.1초)
+ - 백그라운드: Content Service → Stable Diffusion API (5초)
+ * 캐시 확인 (Cache-Aside)
+ * 캐시 MISS: Stable Diffusion API 호출 → 이미지 CDN 업로드 → 결과 캐싱 (TTL 7일)
+ - 폴링: 클라이언트 → Event Service (3초 간격)
+ - 완료: 3가지 스타일 이미지 URL 반환
+
+4. [Content] 10-콘텐츠편집
+ - 클라이언트 → API Gateway → Content Service
+ - Content: 텍스트/색상 편집 적용 → 새 이미지 생성
+
+5. [Distribution] 11-배포채널선택
+ - 클라이언트 → API Gateway → Event Service
+ - Event: 배포 채널 정보 저장
+
+6. [Event] 12-최종승인
+ - 클라이언트 → API Gateway → Event Service
+ - Event: 이벤트 생성 완료 → Distribution Service 호출
+ - Distribution: 다중 채널 배포 시작 (Circuit Breaker 적용)
+ * 우리동네TV API (영상 업로드)
+ * 링고비즈 API (연결음 업데이트)
+ * 지니TV API (광고 등록)
+ * SNS APIs (Instagram, Naver, Kakao 자동 포스팅)
+ - 배포 완료: 대시보드로 이동
+```
+
+### 3.2 고객 참여 플로우
+
+```
+1. [Participation] 15-이벤트참여
+ - 외부 채널 (SNS/TV/연결음) → 이벤트 발견
+ - 클라이언트 → API Gateway → Participation Service
+ - Participation: 중복 참여 체크 (전화번호 기반)
+ - 참여 접수 완료 → 응모 번호 발급
+```
+
+### 3.3 성과 분석 플로우
+
+```
+1. [Analytics] 17-실시간대시보드
+ - 클라이언트 → API Gateway → Analytics Service
+ - Analytics: 캐시 확인 (TTL 5분)
+ * 캐시 HIT: 즉시 반환 (0.5초)
+ * 캐시 MISS: 다중 데이터 소스 통합
+ - Participation Service: 참여자 데이터
+ - Distribution Service: 채널별 노출 수
+ - 외부 APIs: 우리동네TV, 지니TV, SNS 통계
+ - POS 시스템: 매출 데이터 (선택)
+ * 결과 캐싱 (TTL 5분)
+ - 실시간 차트/그래프 렌더링
+```
+
+---
+
+## 4. 데이터 흐름 및 캐싱 전략
+
+### 4.1 데이터 흐름
+
+#### 읽기 플로우 (Cache-Aside 패턴)
+```
+1. Application → Cache 확인
+ - Cache HIT: 캐시된 데이터 즉시 반환
+ - Cache MISS:
+ 2. Application → Database/External API 조회
+ 3. Database/External API → Application 데이터 반환
+ 4. Application → Cache 데이터 저장 (TTL 설정)
+ 5. Application → Client 데이터 반환
+```
+
+#### 쓰기 플로우 (Write-Through 패턴)
+```
+1. Application → Database 쓰기
+2. Database → Application 성공 응답
+3. Application → Cache 무효화 또는 업데이트
+4. Application → Client 성공 응답
+```
+
+### 4.2 캐싱 전략
+
+#### Redis 캐시 구조
+
+| 서비스 | 캐시 키 패턴 | 데이터 타입 | TTL | 예상 크기 | 히트율 목표 |
+|--------|-------------|-----------|-----|----------|-----------|
+| User | `user:session:{token}` | String | 7일 | 1KB | - |
+| User | `user:business:{사업자번호}` | String | 7일 | 0.5KB | 90% |
+| AI | `ai:recommendation:{업종}:{지역}:{목적}` | Hash | 24시간 | 10KB | 80% |
+| Content | `content:image:{이벤트ID}:{스타일}` | String | 7일 | 0.2KB (URL) | 80% |
+| Analytics | `analytics:dashboard:{이벤트ID}` | Hash | 5분 | 5KB | 95% |
+| AI | `job:{jobId}` | Hash | 1시간 | 1KB | - |
+| Content | `job:{jobId}` | Hash | 1시간 | 1KB | - |
+
+#### Redis 메모리 산정
+- **예상 동시 사용자**: 100명
+- **예상 이벤트 수**: 50개
+- **예상 캐시 항목 수**: 10,000개
+- **예상 총 메모리**: 약 50MB (운영 환경 2GB 할당)
+
+#### 캐시 무효화 전략
+- **TTL 기반 자동 만료**: 대부분의 캐시
+- **수동 무효화**: 이벤트 수정/삭제 시 관련 캐시 삭제
+- **Lazy 무효화**: 데이터 변경 시 다음 조회 시점에 갱신
+
+### 4.3 데이터베이스 전략
+
+#### 서비스별 독립 데이터베이스
+- **User DB**: users, stores
+- **Event DB**: events, event_objectives, event_prizes, distribution_logs
+- **Participation DB**: participants, winners
+- **Analytics DB**: event_stats, channel_stats
+
+#### 데이터 일관성 전략
+- **Eventual Consistency**: 서비스 간 데이터는 최종 일관성 보장
+- **Strong Consistency**: 서비스 내부 트랜잭션은 강한 일관성 보장
+- **Saga 패턴**: 이벤트 생성 플로우 (보상 트랜잭션)
+
+---
+
+## 5. 확장성 및 성능 고려사항
+
+### 5.1 수평 확장 전략
+
+#### 서비스별 확장 전략
+| 서비스 | 초기 인스턴스 | 확장 조건 | 최대 인스턴스 | Auto-scaling 메트릭 |
+|--------|-------------|----------|-------------|-------------------|
+| User | 2 | CPU > 70% | 5 | CPU, 메모리 |
+| Event | 2 | CPU > 70% | 10 | CPU, 메모리 |
+| AI | 1 | Job Queue > 10 | 3 | Queue 길이 |
+| Content | 1 | Job Queue > 10 | 3 | Queue 길이 |
+| Distribution | 2 | CPU > 70% | 5 | CPU, 메모리 |
+| Participation | 1 | CPU > 70% | 3 | CPU, 메모리 |
+| Analytics | 1 | CPU > 70% | 3 | CPU, 메모리 |
+
+#### Redis Cluster
+- **초기 구성**: 3 노드 (Master 3, Replica 3)
+- **확장**: 노드 추가를 통한 수평 확장
+- **HA**: Redis Sentinel을 통한 자동 Failover
+
+#### Database Replication
+- **Primary-Replica 구조**: 읽기 부하 분산
+- **읽기 확장**: Read Replica 추가 (필요 시)
+- **쓰기 확장**: Sharding (Phase 2 이후)
+
+### 5.2 성능 목표
+
+#### 응답 시간 목표
+| 기능 | 목표 시간 | 캐시 HIT | 캐시 MISS |
+|------|----------|---------|----------|
+| 로그인 | 0.5초 | - | - |
+| 이벤트 목록 조회 | 0.3초 | - | - |
+| AI 트렌드 분석 + 추천 | 0.1초 | ✅ | 10초 (비동기) |
+| SNS 이미지 생성 | 0.1초 | ✅ | 5초 (비동기) |
+| 다중 채널 배포 | 1분 | - | - |
+| 대시보드 로딩 | 0.5초 | ✅ | 3초 |
+
+#### 처리량 목표
+- **동시 사용자**: 100명 (MVP 목표)
+- **API 요청**: 1,000 req/min
+- **AI 작업**: 10 jobs/min
+- **이미지 생성**: 10 jobs/min
+
+### 5.3 성능 최적화 기법
+
+#### Frontend 최적화
+- **Code Splitting**: 페이지별 번들 분할
+- **Lazy Loading**: 차트 라이브러리 지연 로딩
+- **CDN**: 정적 자산 CDN 배포
+- **Compression**: Gzip/Brotli 압축
+
+#### Backend 최적화
+- **Connection Pooling**: 데이터베이스 연결 풀 관리
+- **Query Optimization**: 인덱스 최적화, N+1 쿼리 방지
+- **Batch Processing**: 대량 데이터 일괄 처리
+- **Pagination**: 목록 조회 페이지네이션
+
+#### Cache 최적화
+- **Multi-Level Caching**: Browser Cache → CDN → Redis → Database
+- **Cache Warming**: 자주 사용되는 데이터 사전 로딩
+- **Cache Preloading**: 피크 시간 전 캐시 준비
+
+---
+
+## 6. 보안 고려사항
+
+### 6.1 인증 및 인가
+
+#### JWT 기반 인증
+- **토큰 발급**: User Service에서 로그인 시 JWT 토큰 발급
+- **토큰 검증**: API Gateway에서 모든 요청의 JWT 토큰 검증
+- **토큰 저장**: Redis에 세션 정보 저장 (TTL 7일)
+- **토큰 갱신**: Refresh Token 패턴 (선택)
+
+#### 역할 기반 접근 제어 (RBAC)
+- **역할**: OWNER (매장 사장님), CUSTOMER (이벤트 참여자)
+- **권한 관리**: API별 필요 역할 정의
+- **API Gateway 검증**: 요청자의 역할 확인
+
+### 6.2 데이터 보안
+
+#### 민감 정보 암호화
+- **비밀번호**: bcrypt 해싱 (Cost Factor: 10)
+- **사업자번호**: AES-256 암호화 저장
+- **개인정보**: 전화번호 마스킹 (010-****-1234)
+
+#### 전송 보안
+- **HTTPS**: 모든 통신 TLS 1.3 암호화
+- **API Key**: 외부 API 호출 시 안전한 Key 관리 (AWS Secrets Manager)
+
+#### 데이터 접근 통제
+- **Database**: 서비스별 독립 계정, 최소 권한 원칙
+- **Redis**: 비밀번호 설정, ACL 적용
+- **백업**: 암호화된 백업 저장
+
+### 6.3 보안 모니터링
+
+#### 위협 탐지
+- **Rate Limiting**: API Gateway에서 사용자당 100 req/min
+- **Brute Force 방지**: 로그인 5회 실패 시 계정 잠금 (삭제됨, 향후 추가 가능)
+- **SQL Injection 방지**: Prepared Statement 사용
+- **XSS 방지**: 입력 데이터 Sanitization
+
+#### 로깅 및 감사
+- **Access Log**: 모든 API 요청 로깅
+- **Audit Log**: 민감 작업 (로그인, 이벤트 생성, 당첨자 추첨) 감사 로그
+- **중앙집중식 로깅**: ELK Stack 또는 CloudWatch Logs
+
+---
+
+## 7. 논리 아키텍처 다이어그램
+
+논리 아키텍처 다이어그램은 별도 Mermaid 파일로 작성되었습니다.
+
+**파일 위치**: `logical-architecture.mmd`
+
+**다이어그램 확인 방법**:
+1. https://mermaid.live/edit 접속
+2. `logical-architecture.mmd` 파일 내용 붙여넣기
+3. 다이어그램 시각적 확인
+
+**다이어그램 구성**:
+- Client Layer: Web/Mobile Client
+- Gateway Layer: API Gateway
+- Service Layer: 7개 마이크로서비스
+- Data Layer: Redis Cache, Message Queue, Databases
+- External APIs: 7개 외부 API
+
+**의존성 표현**:
+- 실선 화살표 (→): 동기적 의존성
+- 점선 화살표 (-.->): 비동기 의존성 또는 캐시 접근
+- 화살표 레이블: 의존성 목적 명시
+
+---
+
+## 부록
+
+### A. 참고 문서
+- [유저스토리](../../userstory.md)
+- [아키텍처 패턴](../../pattern/architecture-pattern.md)
+- [UI/UX 설계서](../../uiux/uiux.md)
+- [클라우드 디자인 패턴](../../../claude/cloud-design-patterns.md)
+
+### B. 주요 결정사항
+1. **Cache-Aside 패턴 채택**: AI 응답 시간 90% 개선 목표
+2. **Asynchronous Request-Reply 패턴 채택**: AI/이미지 생성 비동기 처리
+3. **Circuit Breaker 패턴 채택**: 외부 API 장애 격리
+4. **서비스별 독립 Database**: 마이크로서비스 독립성 보장
+5. **Redis 캐시 우선 전략**: 서비스 간 직접 의존성 최소화
+
+### C. 향후 개선 방안 (Phase 2 이후)
+1. **Saga 패턴**: 복잡한 분산 트랜잭션 관리
+2. **CQRS 패턴**: 읽기/쓰기 분리로 대시보드 성능 최적화
+3. **Event Sourcing**: 이벤트 변경 이력 추적 및 감사
+4. **Service Mesh**: Istio를 통한 고급 트래픽 관리
+5. **Database Sharding**: 쓰기 확장성 개선
+
+---
+
+**문서 버전**: 1.0
+**최종 수정일**: 2025-10-21
+**작성자**: System Architect
diff --git a/design/backend/logical/logical-architecture.mmd b/design/backend/logical/logical-architecture.mmd
index 5148b9a..4f71ff3 100644
--- a/design/backend/logical/logical-architecture.mmd
+++ b/design/backend/logical/logical-architecture.mmd
@@ -1,48 +1,80 @@
graph TB
- %% KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 논리 아키텍처 (간소화 버전)
+ %% KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 논리 아키텍처 (CQRS + Event-Driven)
- %% Service Layer
- subgraph "Service Layer"
- UserSvc["User Service
• 회원가입/로그인
• 프로필 관리
• 사업자번호 검증"]
- EventSvc["Event Service
• 이벤트 CRUD
• 플로우 오케스트레이션
• 상태 관리"]
- AISvc["AI Service
• 트렌드 분석
• 3가지 이벤트 추천
• 비동기 Job 처리"]
- ContentSvc["Content Service
• SNS 이미지 생성
• 3가지 스타일
• 비동기 Job 처리"]
- DistSvc["Distribution Service
• 다중 채널 배포
• Circuit Breaker
• 배포 모니터링"]
- PartSvc["Participation Service
• 이벤트 참여
• 참여자 관리
• 당첨자 추첨"]
- AnalSvc["Analytics Service
• 실시간 대시보드
• 채널별 성과
• ROI 분석"]
+ %% Command Services (Write)
+ subgraph "Command Services"
+ UserCmd["User Service
• 회원가입/로그인
• 프로필 관리
• 사업자번호 검증"]
+ EventCmd["Event Command
Service
• 이벤트 생성/수정/삭제
• 플로우 오케스트레이션"]
+ PartCmd["Participation
Command Service
• 참여 접수
• 당첨자 추첨"]
end
- %% Message Queue
- Queue["Message Queue
• AI 작업 큐
• 이미지 생성 큐
• 배포 작업 큐"]
+ %% Query Services (Read)
+ subgraph "Query Services"
+ EventQuery["Event Query
Service
• 이벤트 목록/상세
• 이벤트 검색"]
+ PartQuery["Participation
Query Service
• 참여자 목록
• 당첨자 조회"]
+ AnalQuery["Analytics Query
Service
• 실시간 대시보드
• 성과 분석"]
+ end
+
+ %% Async Services
+ subgraph "Async Services"
+ AISvc["AI Service
• 트렌드 분석
• 이벤트 추천
[Circuit Breaker]"]
+ ContentSvc["Content Service
• SNS 이미지 생성
• 3가지 스타일
[Circuit Breaker]"]
+ DistSvc["Distribution
Service
• 다중 채널 배포
[Circuit Breaker]
[Retry Pattern]"]
+ end
+
+ %% Event Bus
+ EventBus["Event Bus
(Kafka/SQS)
━━━━━━━━━━
• EventCreated
• EventPublished
• ParticipantRegistered
• WinnerSelected
• DistributionCompleted"]
+
+ %% Job Queue
+ JobQueue["Job Queue
(RabbitMQ)
━━━━━━━━━━
• AI 작업 큐
• 이미지 생성 큐"]
%% External System
- External["외부시스템
• 국세청 API
• AI API
• 이미지 생성 API
• 배포 채널 APIs"]
+ External["외부시스템
[Circuit Breaker]
━━━━━━━━━━
• 국세청 API
• AI API
• 이미지 생성 API
• 배포 채널 APIs"]
- %% Service to Queue
- EventSvc -.->|AI 추천 요청| Queue
- EventSvc -.->|이미지 생성 요청| Queue
- Queue -.->|비동기 작업 처리| AISvc
- Queue -.->|비동기 작업 처리| ContentSvc
+ %% Command to Event Bus (이벤트 발행)
+ EventCmd ==>|"1. EventCreated
발행"| EventBus
+ EventCmd ==>|"2. EventPublished
발행"| EventBus
+ PartCmd ==>|"3. ParticipantRegistered
발행"| EventBus
+ PartCmd ==>|"4. WinnerSelected
발행"| EventBus
+ DistSvc ==>|"5. DistributionCompleted
발행"| EventBus
- %% Service to Service
- EventSvc -->|배포 시작| DistSvc
- PartSvc -->|이벤트 정보 조회| EventSvc
- AnalSvc -->|이벤트 정보| EventSvc
- AnalSvc -->|참여자 데이터| PartSvc
- AnalSvc -->|배포 통계| DistSvc
+ %% Event Bus to Services (이벤트 구독)
+ EventBus -.->|"EventCreated
구독"| EventQuery
+ EventBus -.->|"EventCreated
구독"| AnalQuery
+ EventBus -.->|"EventPublished
구독"| DistSvc
+ EventBus -.->|"ParticipantRegistered
구독"| PartQuery
+ EventBus -.->|"ParticipantRegistered
구독"| AnalQuery
+ EventBus -.->|"WinnerSelected
구독"| PartQuery
+ EventBus -.->|"DistributionCompleted
구독"| AnalQuery
- %% Service to External
- UserSvc -->|사업자번호 검증| External
- AISvc -->|트렌드 분석/추천| External
- ContentSvc -->|이미지 생성| External
- DistSvc -->|다중 채널 배포| External
- AnalSvc -->|채널별 통계| External
+ %% Command to Job Queue (비동기 작업)
+ EventCmd -->|"AI 추천 요청"| JobQueue
+ EventCmd -->|"이미지 생성 요청"| JobQueue
+ JobQueue -->|작업 처리| AISvc
+ JobQueue -->|작업 처리| ContentSvc
+
+ %% Query to Query (읽기 최적화)
+ AnalQuery -.->|캐시 조회| EventQuery
+ AnalQuery -.->|캐시 조회| PartQuery
+
+ %% Services to External (Resilience 패턴)
+ UserCmd -->|"사업자번호 검증
[Circuit Breaker]
[Retry: 3회]"| External
+ AISvc -->|"트렌드 분석/추천
[Circuit Breaker]
[Timeout: 30s]"| External
+ ContentSvc -->|"이미지 생성
[Circuit Breaker]
[Timeout: 20s]"| External
+ DistSvc -->|"다중 채널 배포
[Circuit Breaker]
[Retry: 3회]
[Bulkhead]"| External
+ AnalQuery -->|"채널별 통계
[Circuit Breaker]
[Fallback: Cache]"| External
%% Styling
- classDef service fill:#4ECDC4,stroke:#14B8A6,stroke-width:2px
- classDef queue fill:#FB923C,stroke:#EA580C,stroke-width:2px
+ classDef command fill:#4ECDC4,stroke:#14B8A6,stroke-width:3px
+ classDef query fill:#10B981,stroke:#059669,stroke-width:3px
+ classDef async fill:#8B5CF6,stroke:#7C3AED,stroke-width:3px,color:#fff
+ classDef eventbus fill:#F59E0B,stroke:#D97706,stroke-width:3px
+ classDef jobqueue fill:#FB923C,stroke:#EA580C,stroke-width:3px
classDef external fill:#E5E7EB,stroke:#9CA3AF,stroke-width:2px
- class UserSvc,EventSvc,AISvc,ContentSvc,DistSvc,PartSvc,AnalSvc service
- class Queue queue
+ class UserCmd,EventCmd,PartCmd command
+ class EventQuery,PartQuery,AnalQuery query
+ class AISvc,ContentSvc,DistSvc async
+ class EventBus eventbus
+ class JobQueue jobqueue
class External external
diff --git a/design/backend/logical/logical-architecture.mmd.backup b/design/backend/logical/logical-architecture.mmd.backup
new file mode 100644
index 0000000..5148b9a
--- /dev/null
+++ b/design/backend/logical/logical-architecture.mmd.backup
@@ -0,0 +1,48 @@
+graph TB
+ %% KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 논리 아키텍처 (간소화 버전)
+
+ %% Service Layer
+ subgraph "Service Layer"
+ UserSvc["User Service
• 회원가입/로그인
• 프로필 관리
• 사업자번호 검증"]
+ EventSvc["Event Service
• 이벤트 CRUD
• 플로우 오케스트레이션
• 상태 관리"]
+ AISvc["AI Service
• 트렌드 분석
• 3가지 이벤트 추천
• 비동기 Job 처리"]
+ ContentSvc["Content Service
• SNS 이미지 생성
• 3가지 스타일
• 비동기 Job 처리"]
+ DistSvc["Distribution Service
• 다중 채널 배포
• Circuit Breaker
• 배포 모니터링"]
+ PartSvc["Participation Service
• 이벤트 참여
• 참여자 관리
• 당첨자 추첨"]
+ AnalSvc["Analytics Service
• 실시간 대시보드
• 채널별 성과
• ROI 분석"]
+ end
+
+ %% Message Queue
+ Queue["Message Queue
• AI 작업 큐
• 이미지 생성 큐
• 배포 작업 큐"]
+
+ %% External System
+ External["외부시스템
• 국세청 API
• AI API
• 이미지 생성 API
• 배포 채널 APIs"]
+
+ %% Service to Queue
+ EventSvc -.->|AI 추천 요청| Queue
+ EventSvc -.->|이미지 생성 요청| Queue
+ Queue -.->|비동기 작업 처리| AISvc
+ Queue -.->|비동기 작업 처리| ContentSvc
+
+ %% Service to Service
+ EventSvc -->|배포 시작| DistSvc
+ PartSvc -->|이벤트 정보 조회| EventSvc
+ AnalSvc -->|이벤트 정보| EventSvc
+ AnalSvc -->|참여자 데이터| PartSvc
+ AnalSvc -->|배포 통계| DistSvc
+
+ %% Service to External
+ UserSvc -->|사업자번호 검증| External
+ AISvc -->|트렌드 분석/추천| External
+ ContentSvc -->|이미지 생성| External
+ DistSvc -->|다중 채널 배포| External
+ AnalSvc -->|채널별 통계| External
+
+ %% Styling
+ classDef service fill:#4ECDC4,stroke:#14B8A6,stroke-width:2px
+ classDef queue fill:#FB923C,stroke:#EA580C,stroke-width:2px
+ classDef external fill:#E5E7EB,stroke:#9CA3AF,stroke-width:2px
+
+ class UserSvc,EventSvc,AISvc,ContentSvc,DistSvc,PartSvc,AnalSvc service
+ class Queue queue
+ class External external