outer 및 inner sequence 동기화 및 한글화
변경 사항: - 이벤트생성플로우 outer: FE → Gateway → User Service 호출 패턴 추가 - user-로그인 inner: 전화번호 → 이메일 기반 인증으로 변경 - user-회원가입 inner: 국세청 API 제거, 이메일 중복검사 추가 - event-목적선택 inner: Gateway 경유, 요청/응답 한글화 - ai-트렌드분석및추천 inner: 과거 이벤트 데이터 제거, Timeout 5분으로 변경 - analytics-대시보드조회 inner: Redis TTL 5분 → 1시간으로 변경 모든 파일에 Repository CRUD 작업 한글 설명 적용 (SQL 제거) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -14,7 +14,6 @@ participant "CircuitBreakerManager" as CB <<Component>>
|
||||
participant "ExternalAIClient" as AIClient <<Component>>
|
||||
participant "JobStateManager" as JobState <<Component>>
|
||||
participant "Redis" as Redis <<Infrastructure>>
|
||||
participant "Event DB" as EventDB <<Infrastructure>>
|
||||
participant "External AI API" as ExternalAPI <<External>>
|
||||
participant "Kafka Producer" as Producer <<Component>>
|
||||
|
||||
@@ -66,24 +65,17 @@ else 유효한 메시지
|
||||
end note
|
||||
|
||||
else 캐시 미스
|
||||
TrendEngine -> EventDB: 과거 이벤트 데이터 조회\n(업종과 지역으로 필터링,\n최근 3개월 이벤트,\nROI 내림차순 정렬)
|
||||
EventDB --> TrendEngine: 이벤트 통계 데이터\n{성공 이벤트 리스트, ROI 정보}
|
||||
note right of TrendEngine
|
||||
**트렌드 분석 입력 데이터**
|
||||
- 업종 정보
|
||||
- 지역 정보
|
||||
- 현재 시즌 (계절, 월)
|
||||
- 이벤트 목적
|
||||
|
||||
TrendEngine -> TrendEngine: 트렌드 패턴 분석
|
||||
note right
|
||||
분석 항목:
|
||||
1. 업종 트렌드
|
||||
- 최근 3개월 성공 이벤트 유형
|
||||
- 고객 선호 경품 Top 5
|
||||
- 효과적인 참여 방법
|
||||
|
||||
2. 지역 특성
|
||||
- 해당 지역 이벤트 성공률
|
||||
- 지역 고객 연령대/성별 분포
|
||||
|
||||
3. 시즌 특성
|
||||
- 계절별 추천 이벤트
|
||||
- 특별 시즌 (명절, 기념일)
|
||||
**외부 AI API 호출**
|
||||
- 과거 이벤트 데이터 사용 안 함
|
||||
- 실시간 시장 트렌드 분석
|
||||
- 업종별/지역별 일반적 특성
|
||||
end note
|
||||
|
||||
TrendEngine -> CB: executeWithCircuitBreaker(\nAI API 트렌드 분석 호출)
|
||||
@@ -91,35 +83,44 @@ else 유효한 메시지
|
||||
|
||||
CB -> CB: Circuit Breaker 상태 확인
|
||||
note right
|
||||
Circuit Breaker 설정:
|
||||
**Circuit Breaker 설정**
|
||||
- Failure Rate Threshold: 50%
|
||||
- Timeout: 30초
|
||||
- Half-Open Wait Duration: 30초
|
||||
- Timeout: 5분 (300초)
|
||||
- Half-Open Wait Duration: 1분 (60초)
|
||||
- Permitted Calls in Half-Open: 3
|
||||
- Sliding Window Size: 10
|
||||
end note
|
||||
|
||||
alt Circuit CLOSED (정상)
|
||||
CB -> AIClient: callAIAPI(\nmethod: "trendAnalysis",\nprompt: 트렌드 분석 프롬프트,\ntimeout: 30초)
|
||||
CB -> AIClient: callAIAPI(\nmethod: "trendAnalysis",\nprompt: 트렌드 분석 프롬프트,\ntimeout: 5분)
|
||||
activate AIClient
|
||||
|
||||
AIClient -> AIClient: 프롬프트 구성
|
||||
note right
|
||||
프롬프트 예시:
|
||||
note right of AIClient
|
||||
**AI 프롬프트 구성**
|
||||
"당신은 마케팅 트렌드 분석 전문가입니다.
|
||||
업종: {업종}
|
||||
지역: {지역}
|
||||
과거 데이터: {이벤트 통계}
|
||||
|
||||
다음을 분석하세요:
|
||||
1. 업종 트렌드 (성공 이벤트 유형)
|
||||
2. 지역 특성 (고객 특성)
|
||||
3. 시즌 특성 (현재 시기 추천)"
|
||||
**입력 정보**
|
||||
- 업종: {업종}
|
||||
- 지역: {지역}
|
||||
- 현재 시즌: {계절/월}
|
||||
- 이벤트 목적: {목적}
|
||||
|
||||
**분석 요청사항**
|
||||
1. 업종별 일반적 트렌드
|
||||
(업종 특성 기반 효과적인 이벤트 유형)
|
||||
|
||||
2. 지역별 특성
|
||||
(지역 고객 특성, 선호도)
|
||||
|
||||
3. 시즌별 추천
|
||||
(현재 시기에 적합한 이벤트)"
|
||||
end note
|
||||
|
||||
AIClient -> ExternalAPI: POST /api/v1/analyze\nAuthorization: Bearer {API_KEY}\nTimeout: 30초
|
||||
AIClient -> ExternalAPI: AI API 호출\nPOST /api/v1/analyze\nAuthorization: Bearer {API_KEY}\nTimeout: 5분\nPayload: {업종, 지역, 시즌, 목적}
|
||||
activate ExternalAPI
|
||||
|
||||
ExternalAPI --> AIClient: 200 OK\n{트렌드 분석 결과}
|
||||
ExternalAPI --> AIClient: 200 OK\n{"industryTrend": "...",\n"regionalCharacteristics": "...",\n"seasonalRecommendation": "..."}
|
||||
deactivate ExternalAPI
|
||||
|
||||
AIClient -> AIClient: 응답 검증 및 파싱
|
||||
@@ -153,9 +154,15 @@ else 유효한 메시지
|
||||
CB -> CB: 연속 성공 시 CLOSED로 전환
|
||||
CB --> TrendEngine: 트렌드 분석 결과
|
||||
|
||||
else Timeout (30초 초과)
|
||||
else Timeout (5분 초과)
|
||||
CB --> TrendEngine: TimeoutException
|
||||
TrendEngine -> TrendEngine: Fallback 실행
|
||||
note right of TrendEngine
|
||||
**Timeout 처리**
|
||||
- 5분 초과 시 즉시 실패
|
||||
- Fallback: 기본 트렌드 사용
|
||||
- 사용자에게 안내 메시지 제공
|
||||
end note
|
||||
TrendEngine -> TrendEngine: Fallback 실행\n(기본 트렌드 템플릿 사용)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -178,7 +185,7 @@ else 유효한 메시지
|
||||
group parallel
|
||||
RecommendEngine -> CB: executeWithCircuitBreaker(\nAI API 추천 생성 - 옵션 1: 저비용)
|
||||
activate CB
|
||||
CB -> AIClient: callAIAPI(\nmethod: "generateRecommendation",\nprompt: 저비용 추천 프롬프트,\ntimeout: 10초)
|
||||
CB -> AIClient: callAIAPI(\nmethod: "generateRecommendation",\nprompt: 저비용 추천 프롬프트,\ntimeout: 5분)
|
||||
activate AIClient
|
||||
|
||||
AIClient -> AIClient: 프롬프트 구성
|
||||
@@ -207,7 +214,7 @@ else 유효한 메시지
|
||||
|
||||
RecommendEngine -> CB: executeWithCircuitBreaker(\nAI API 추천 생성 - 옵션 2: 중비용)
|
||||
activate CB
|
||||
CB -> AIClient: callAIAPI(\nmethod: "generateRecommendation",\nprompt: 중비용 추천 프롬프트,\ntimeout: 10초)
|
||||
CB -> AIClient: callAIAPI(\nmethod: "generateRecommendation",\nprompt: 중비용 추천 프롬프트,\ntimeout: 5분)
|
||||
activate AIClient
|
||||
|
||||
AIClient -> AIClient: 프롬프트 구성
|
||||
@@ -236,7 +243,7 @@ else 유효한 메시지
|
||||
|
||||
RecommendEngine -> CB: executeWithCircuitBreaker(\nAI API 추천 생성 - 옵션 3: 고비용)
|
||||
activate CB
|
||||
CB -> AIClient: callAIAPI(\nmethod: "generateRecommendation",\nprompt: 고비용 추천 프롬프트,\ntimeout: 10초)
|
||||
CB -> AIClient: callAIAPI(\nmethod: "generateRecommendation",\nprompt: 고비용 추천 프롬프트,\ntimeout: 5분)
|
||||
activate AIClient
|
||||
|
||||
AIClient -> AIClient: 프롬프트 구성
|
||||
@@ -299,23 +306,38 @@ end
|
||||
|
||||
== 예외 처리 ==
|
||||
note over Handler, Producer
|
||||
1. AI API 장애 시:
|
||||
- Circuit Breaker Open
|
||||
- Fallback: 기본 트렌드 데이터 사용
|
||||
- Job 상태: COMPLETED (안내 메시지 포함)
|
||||
**AI API 장애 시**
|
||||
- Circuit Breaker Open
|
||||
- Fallback: 기본 트렌드 템플릿 사용
|
||||
- Job 상태: COMPLETED (안내 메시지 포함)
|
||||
- 사용자에게 "AI 분석이 제한적으로 제공됩니다" 안내
|
||||
|
||||
2. Timeout (30초 초과):
|
||||
- Circuit Breaker로 즉시 실패
|
||||
- Retry 없음 (비동기 Job)
|
||||
- Job 상태: FAILED
|
||||
**Timeout (5분 초과)**
|
||||
- Circuit Breaker로 즉시 실패
|
||||
- Retry 없음 (비동기 Job)
|
||||
- Job 상태: FAILED
|
||||
- 사용자에게 재시도 요청 안내
|
||||
|
||||
3. Kafka 메시지 처리 실패:
|
||||
- DLQ로 이동
|
||||
- 수동 검토 및 재처리
|
||||
**Kafka 메시지 처리 실패**
|
||||
- DLQ(Dead Letter Queue)로 이동
|
||||
- 수동 검토 및 재처리
|
||||
- 에러 로그 기록
|
||||
|
||||
4. Redis 장애:
|
||||
- 캐싱 스킵, DB만 사용
|
||||
- Job 상태는 메모리에 임시 저장
|
||||
**Redis 장애**
|
||||
- 캐싱 스킵
|
||||
- Job 상태는 메모리에 임시 저장
|
||||
- 성능 저하 가능 (매 요청마다 AI API 호출)
|
||||
|
||||
**성능 목표**
|
||||
- 평균 응답 시간: 2분 이내
|
||||
- P95 응답 시간: 4분 이내
|
||||
- Circuit Breaker Timeout: 5분
|
||||
- Redis 캐시 TTL: 24시간
|
||||
|
||||
**데이터 처리 원칙**
|
||||
- 과거 이벤트 데이터 사용 안 함
|
||||
- 외부 AI API로 실시간 트렌드 분석
|
||||
- 업종/지역 기반 일반적 마케팅 트렌드 활용
|
||||
end note
|
||||
|
||||
@enduml
|
||||
|
||||
Reference in New Issue
Block a user