From 16f82d3553ac4d5107961b882aab7d95b6aaa7cd Mon Sep 17 00:00:00 2001 From: cherry2250 Date: Thu, 23 Oct 2025 14:36:30 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=94=8C=EB=A1=9C=EC=9A=B0=20outer=20sequence=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - User Service 회원정보 조회 로직 추가 - AI Service Redis 저장 및 5분 타임아웃 적용 - Content Service Redis 읽기/쓰기 방식으로 변경 - 이미지 생성 5분 타임아웃 적용 - Redis → Event DB 영구 저장 로직 추가 - Kafka 이미지 생성 topic 구독 제거 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../sequence/outer/이벤트생성플로우.puml | 59 +++++++++++++++---- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/design/backend/sequence/outer/이벤트생성플로우.puml b/design/backend/sequence/outer/이벤트생성플로우.puml index d11f861..7007f7f 100644 --- a/design/backend/sequence/outer/이벤트생성플로우.puml +++ b/design/backend/sequence/outer/이벤트생성플로우.puml @@ -7,11 +7,13 @@ actor "소상공인" as User participant "Frontend" as FE participant "API Gateway" as Gateway participant "Event Service" as Event +participant "User Service" as UserSvc participant "AI Service" as AI participant "Content Service" as Content participant "Distribution Service" as Dist participant "Kafka" as Kafka database "Event DB" as EventDB +database "User DB" as UserDB database "Redis" as Redis participant "외부 AI API" as AIApi participant "이미지 생성 API" as ImageApi @@ -19,8 +21,16 @@ participant "배포 채널 APIs" as ChannelApis == 1. 이벤트 목적 선택 (UFR-EVENT-020) == User -> FE: 이벤트 목적 선택 -FE -> Gateway: POST /events/purposes\n{목적, 매장정보} +FE -> Gateway: POST /events/purposes\n{목적, userId} Gateway -> Event: 이벤트 목적 저장 요청 +Event -> UserSvc: GET /api/users/{userId}/store\n회원 및 매장정보 조회 +activate UserSvc +UserSvc -> UserDB: 사용자 및 매장 정보 조회 +activate UserDB +UserDB --> UserSvc: 사용자, 매장 정보 반환 +deactivate UserDB +UserSvc --> Event: 200 OK\n{userId, storeName, industry, address} +deactivate UserSvc Event -> EventDB: 이벤트 목적 정보 저장\n(목적, 매장정보 저장) EventDB --> Event: 저장 완료 Event --> Gateway: 저장 완료\n{eventDraftId} @@ -41,12 +51,12 @@ Kafka --> AI: Consume Job Message\n{jobId, eventDraftId, ...} AI -> EventDB: 과거 이벤트 데이터 조회\n(업종, 지역 기반 통계 조회) EventDB --> AI: 이벤트 통계 데이터 -AI -> AIApi: 트렌드 분석 및 이벤트 추천 요청\n{목적, 업종, 지역, 과거데이터, 매장정보} +AI -> AIApi: 트렌드 분석 및 이벤트 추천 요청\n{목적, 업종, 지역, 과거데이터, 매장정보}\n[Circuit Breaker, Timeout: 5분] AIApi --> AI: 3가지 추천안 + 트렌드 요약\n(예: "여름철 시원한 음료 선호도 증가") -AI -> Redis: 추천 결과 캐싱\n(3가지 추천안, 트렌드 요약 저장)\nTTL: 24시간 +AI -> Redis: AI 추천 결과 저장\nKey: ai:event:{eventDraftId}\n(3가지 추천안, 트렌드 요약)\nTTL: 24시간 Redis --> AI: 저장 완료 AI -> Redis: Job 상태 업데이트\n(상태를 COMPLETED로 변경) -note over AI, Redis: AI 추천 정보는 Redis에만 저장\n최종 선택 시 Event DB에 저장 +note over AI, Redis: AI 추천 정보는 Redis에 저장\n- Content Service가 읽기 위함\n- 최종 승인 시 Event DB에 영구 저장 group Polling으로 상태 확인 loop 상태 확인 (최대 30초) @@ -78,30 +88,39 @@ FE --> User: 콘텐츠 생성 화면으로 이동 == 3. SNS 이미지 생성 - 비동기 처리 (UFR-CONT-010) == User -> FE: 이미지 생성 요청 -FE -> Gateway: POST /api/events/{eventDraftId}/content-generation\n{이벤트정보} +FE -> Gateway: POST /api/events/{eventDraftId}/content-generation Gateway -> Event: 이미지 생성 요청 -Event -> Kafka: Publish to image-job-topic\n{jobId, eventDraftId, 이벤트정보} +Event -> Event: Job 생성\n{jobId, eventDraftId, status: PENDING} Event --> Gateway: Job 생성 완료\n{jobId, status: PENDING} Gateway --> FE: 202 Accepted\n{jobId} FE --> User: "이미지 생성 중..." (로딩) -note over Content: Kafka Consumer\n이미지 생성 topic 구독 -Kafka --> Content: Consume Job Message\n{jobId, eventDraftId, ...} +note over Content: 백그라운드 워커\nRedis 폴링 또는 스케줄러 + +Content -> Redis: AI 이벤트 데이터 읽기\nKey: ai:event:{eventDraftId} +activate Redis +Redis --> Content: AI 추천 결과\n{선택된 추천안, 이벤트 정보} +deactivate Redis note over Content: inner sequence 참조:\ncontent-이미지생성.puml par 심플 스타일 - Content -> ImageApi: 심플 스타일 생성 요청 + Content -> ImageApi: 심플 스타일 생성 요청\n[Circuit Breaker, Timeout: 5분] ImageApi --> Content: 심플 이미지 URL else 화려한 스타일 - Content -> ImageApi: 화려한 스타일 생성 요청 + Content -> ImageApi: 화려한 스타일 생성 요청\n[Circuit Breaker, Timeout: 5분] ImageApi --> Content: 화려한 이미지 URL else 트렌디 스타일 - Content -> ImageApi: 트렌디 스타일 생성 요청 + Content -> ImageApi: 트렌디 스타일 생성 요청\n[Circuit Breaker, Timeout: 5분] ImageApi --> Content: 트렌디 이미지 URL end -note over Content: Redis 캐시에 이미지 URL 저장\nJob 상태를 COMPLETED로 업데이트\n\n이미지 URL은 Redis에만 저장됨\n최종 콘텐츠 선택 시 Event DB에 저장 +Content -> Redis: 이미지 URL 저장\nKey: content:image:{eventDraftId}\n{심플, 화려, 트렌디 URL}\nTTL: 7일 +activate Redis +Redis --> Content: 저장 완료 +deactivate Redis +Content -> Redis: Job 상태 업데이트\n(상태를 COMPLETED로 변경) +note over Content, Redis: 이미지 URL은 Redis에 저장\n- 최종 승인 시 Event DB에 영구 저장 group Polling으로 상태 확인 loop 상태 확인 (최대 30초) @@ -135,6 +154,22 @@ FE --> User: 배포 채널 선택 화면으로 이동 User -> FE: 배포 채널 선택\n최종 승인 요청 FE -> Gateway: POST /api/events/{eventDraftId}/publish\n{선택 채널 목록} Gateway -> Event: 최종 승인 및 배포 처리 + +note over Event: Redis 데이터를 Event DB에 영구 저장 + +Event -> Redis: AI 추천 결과 조회\nKey: ai:event:{eventDraftId} +activate Redis +Redis --> Event: AI 추천 결과 +deactivate Redis + +Event -> Redis: 이미지 URL 조회\nKey: content:image:{eventDraftId} +activate Redis +Redis --> Event: 이미지 URL 목록 +deactivate Redis + +Event -> EventDB: 이벤트 정보 영구 저장\n(AI 추천, 이미지 URL, 배포 채널 포함) +EventDB --> Event: 저장 완료 + Event -> EventDB: 이벤트 상태 변경\n(DRAFT → APPROVED로 업데이트) EventDB --> Event: 상태 변경 완료 Event -> Kafka: Publish to event-topic\nEventCreated\n{eventId, 이벤트정보}