edit all sequence

This commit is contained in:
cherry2250
2025-10-22 20:13:56 +09:00
parent a8c6397edf
commit 9192e1e453
25 changed files with 106 additions and 106 deletions
@@ -30,7 +30,7 @@ activate Gateway
Gateway -> PartService: POST /participations/register\n{이름, 전화번호, 참여경로, 개인정보동의}
activate PartService
PartService -> PartDB: SELECT * FROM participants\nWHERE phone_number = ? AND event_id = ?
PartService -> PartDB: 참여자 중복 확인\n(전화번호, 이벤트ID로 조회)
activate PartDB
PartDB --> PartService: 중복 참여 여부 반환
deactivate PartDB
@@ -45,7 +45,7 @@ alt 중복 참여인 경우
else 신규 참여인 경우
PartService -> PartService: 응모 번호 생성\n(UUID 또는 시퀀스 기반)
PartService -> PartDB: INSERT INTO participants\n(name, phone_number, entry_path,\napplication_number, participated_at)
PartService -> PartDB: 참여자 정보 저장\n(이름, 전화번호, 참여경로,\n응모번호, 참여일시)
activate PartDB
PartDB --> PartService: 저장 완료
deactivate PartDB
@@ -94,19 +94,19 @@ activate Gateway
Gateway -> PartService: POST /events/{eventId}/draw-winners\n{winnerCount, visitBonus}
activate PartService
PartService -> PartDB: SELECT * FROM participants\nWHERE event_id = ? AND is_winner = false
PartService -> PartDB: 미당첨 참여자 목록 조회\n(이벤트ID로 당첨되지 않은 참여자 조회)
activate PartDB
PartDB --> PartService: 전체 참여자 목록 반환
deactivate PartDB
PartService -> PartService: 당첨자 추첨 알고리즘 실행\n1. 난수 생성 (Crypto.randomBytes)\n2. 매장방문 가산점 적용 (옵션)\n3. Fisher-Yates Shuffle\n4. 당첨인원만큼 선정
PartService -> PartDB: UPDATE participants\nSET is_winner = true, won_at = NOW()\nWHERE participant_id IN (당첨자IDs)
PartService -> PartDB: 당첨자 정보 업데이트\n(당첨 여부를 true로 설정, 당첨 일시 기록)
activate PartDB
PartDB --> PartService: 업데이트 완료
deactivate PartDB
PartService -> PartDB: INSERT INTO draw_logs\n(event_id, draw_method, winner_count,\nalgorithm, drawn_at)
PartService -> PartDB: 추첨 로그 저장\n(이벤트ID, 추첨방법, 당첨인원,\n알고리즘, 추첨일시)
activate PartDB
note right of PartDB
추첨 로그 저장:
@@ -27,7 +27,7 @@ activate UserService
UserService -> UserService: 서버 측 유효성 검증\n(이름 2자 이상, 전화번호 형식 등)
UserService -> UserDB: SELECT users\nWHERE phone_number = ?
UserService -> UserDB: 전화번호로 사용자 조회\n(중복 가입 확인)
activate UserDB
UserDB --> UserService: 기존 사용자 확인 결과
deactivate UserDB
@@ -42,16 +42,16 @@ else 신규 사용자
UserService -> UserService: 사업자번호 암호화\n(AES-256)
UserService -> UserDB: BEGIN TRANSACTION
UserService -> UserDB: 트랜잭션 시작
activate UserDB
UserService -> UserDB: INSERT INTO users\n(name, phone_number, email,\npassword_hash, created_at)
UserService -> UserDB: 사용자 정보 저장\n(이름, 전화번호, 이메일,\n비밀번호해시, 생성일시)
UserDB --> UserService: user_id 반환
UserService -> UserDB: INSERT INTO stores\n(user_id, store_name, industry,\naddress, business_number_encrypted,\nbusiness_hours)
UserService -> UserDB: 매장 정보 저장\n(사용자ID, 매장명, 업종,\n주소, 암호화된사업자번호,\n영업시간)
UserDB --> UserService: store_id 반환
UserService -> UserDB: COMMIT TRANSACTION
UserService -> UserDB: 트랜잭션 커밋
deactivate UserDB
UserService -> UserService: JWT 토큰 생성\n(user_id, role=OWNER,\nexp=7일)
@@ -87,7 +87,7 @@ Gateway -> Gateway: Request 검증
Gateway -> UserService: POST /api/users/login\n(전화번호, 비밀번호)
activate UserService
UserService -> UserDB: SELECT users\nWHERE phone_number = ?
UserService -> UserDB: 전화번호로 사용자 조회\n(로그인 인증용)
activate UserDB
UserDB --> UserService: 사용자 정보\n(user_id, password_hash, role)
deactivate UserDB
@@ -108,7 +108,7 @@ else 사용자 존재
UserService -> UserService: JWT 토큰 생성\n(user_id, role=OWNER,\nexp=7일)
UserService -> UserDB: UPDATE users\nSET last_login_at = NOW()\nWHERE user_id = ?
UserService -> UserDB: 최종 로그인 시각 업데이트\n(현재 시각으로 갱신)
activate UserDB
UserDB --> UserService: 업데이트 완료
deactivate UserDB
@@ -30,7 +30,7 @@ GW -> GW: JWT 토큰 검증
GW -> Analytics: GET /api/events/{id}/analytics
activate Analytics
Analytics -> Redis: GET analytics:dashboard:{eventId}
Analytics -> Redis: 대시보드 캐시 조회\n(캐시키: analytics:dashboard:{eventId})
activate Redis
Redis --> Analytics: **Cache HIT**\n캐시된 대시보드 데이터 반환
deactivate Redis
@@ -64,7 +64,7 @@ activate GW
GW -> Analytics: GET /api/events/{id}/analytics
activate Analytics
Analytics -> Redis: GET analytics:dashboard:{eventId}
Analytics -> Redis: 대시보드 캐시 조회\n(캐시키: analytics:dashboard:{eventId})
activate Redis
Redis --> Analytics: **Cache MISS**\nnull 반환
deactivate Redis
@@ -79,7 +79,7 @@ end note
|||
== 2.1. Analytics DB 조회 (로컬 데이터) ==
Analytics -> AnalyticsDB: SELECT event_stats\nWHERE event_id = {id}
Analytics -> AnalyticsDB: 이벤트 통계 조회\n(이벤트ID로 통계 데이터 조회)
activate AnalyticsDB
AnalyticsDB --> Analytics: 이벤트 통계\n- 총 참여자 수\n- 예상 ROI\n- 매출 증가율
deactivate AnalyticsDB
@@ -87,7 +87,7 @@ deactivate AnalyticsDB
|||
== 2.2. 배치 수집된 채널 통계 데이터 조회 ==
Analytics -> AnalyticsDB: SELECT channel_stats\nWHERE event_id = {id}
Analytics -> AnalyticsDB: 채널별 통계 조회\n(배치로 수집된 채널 데이터 조회)
activate AnalyticsDB
note right of Analytics
@@ -123,7 +123,7 @@ end note
|||
== 2.4. Redis 캐싱 및 응답 ==
Analytics -> Redis: SET analytics:dashboard:{eventId}\nvalue={통합 데이터}\nTTL=300초 (5분)
Analytics -> Redis: 대시보드 데이터 캐시 저장\n(캐시키: analytics:dashboard:{eventId},\n값: 통합 데이터, TTL: 5분)
activate Redis
Redis --> Analytics: OK
deactivate Redis
@@ -149,11 +149,11 @@ end note
Kafka -> Analytics: **EventCreated** 이벤트\n{eventId, storeId, title, objective}
activate Analytics
Analytics -> AnalyticsDB: INSERT INTO event_stats\n이벤트 기본 정보 초기화
Analytics -> AnalyticsDB: 이벤트 통계 초기화\n(이벤트 기본 정보 저장)
activate AnalyticsDB
AnalyticsDB --> Analytics: OK
deactivate AnalyticsDB
Analytics -> Redis: DEL analytics:dashboard:{eventId}\n캐시 무효화
Analytics -> Redis: 캐시 무효화\n(캐시키 삭제: analytics:dashboard:{eventId})
activate Redis
Redis --> Analytics: OK
deactivate Redis
@@ -163,11 +163,11 @@ deactivate Analytics
Kafka -> Analytics: **ParticipantRegistered** 이벤트\n{participantId, eventId, phoneNumber}
activate Analytics
Analytics -> AnalyticsDB: UPDATE event_stats\nSET participant_count = participant_count + 1\nWHERE event_id = {eventId}
Analytics -> AnalyticsDB: 참여자 수 업데이트\n(참여자 수 1 증가)
activate AnalyticsDB
AnalyticsDB --> Analytics: OK
deactivate AnalyticsDB
Analytics -> Redis: DEL analytics:dashboard:{eventId}\n캐시 무효화 (다음 조회 시 갱신)
Analytics -> Redis: 캐시 무효화\n(캐시키 삭제: analytics:dashboard:{eventId})
activate Redis
Redis --> Analytics: OK
deactivate Redis
@@ -177,11 +177,11 @@ deactivate Analytics
Kafka -> Analytics: **DistributionCompleted** 이벤트\n{eventId, distributedChannels, completedAt}
activate Analytics
Analytics -> AnalyticsDB: INSERT INTO channel_stats\n배포 채널 통계 저장
Analytics -> AnalyticsDB: 채널 통계 저장\n(배포 완료된 채널 정보 저장)
activate AnalyticsDB
AnalyticsDB --> Analytics: OK
deactivate AnalyticsDB
Analytics -> Redis: DEL analytics:dashboard:{eventId}\n캐시 무효화
Analytics -> Redis: 캐시 무효화\n(캐시키 삭제: analytics:dashboard:{eventId})
activate Redis
Redis --> Analytics: OK
deactivate Redis
@@ -20,7 +20,7 @@ participant "배포 채널 APIs" as ChannelApis
User -> FE: 이벤트 목적 선택
FE -> Gateway: POST /events/purposes\n{목적, 매장정보}
Gateway -> Event: 이벤트 목적 저장 요청
Event -> EventDB: 이벤트 목적 저장
Event -> EventDB: 이벤트 목적 정보 저장\n(목적, 매장정보 저장)
EventDB --> Event: 저장 완료
Event --> Gateway: 저장 완료\n{eventDraftId}
Gateway --> FE: 200 OK
@@ -38,20 +38,20 @@ FE --> User: "AI가 분석 중입니다..." (로딩)
note over AI: Kafka Consumer\nai 이벤트 생성 topic 구독
Kafka --> AI: Consume Job Message\n{jobId, eventDraftId, ...}
AI -> EventDB: 과거 이벤트 데이터 조회
AI -> EventDB: 과거 이벤트 데이터 조회\n(업종, 지역 기반 통계 조회)
EventDB --> AI: 이벤트 통계 데이터
AI -> AIApi: 트렌드 분석 및 이벤트 추천 요청\n{목적, 업종, 지역, 과거데이터, 매장정보}
AIApi --> AI: 3가지 추천안 + 트렌드 요약\n(예: "여름철 시원한 음료 선호도 증가")
AI -> EventDB: 추천 결과 트렌드 요약 저장
AI -> EventDB: 추천 결과 저장\n(3가지 추천안, 트렌드 요약 저장)
EventDB --> AI: 저장 완료
AI -> EventDB: Job 상태 업데이트\nstatus: COMPLETED
AI -> EventDB: Job 상태 업데이트\n(상태를 COMPLETED로 변경)
AI -> Kafka: Publish to event-topic\nEventRecommended\n{jobId, eventDraftId, recommendations, trendSummary}
group Polling으로 상태 확인
loop 상태 확인 (최대 30초)
FE -> Gateway: GET /jobs/{jobId}/status
Gateway -> Event: Job 상태 조회
Event -> EventDB: Job 상태 및 결과 조회
Event -> EventDB: Job 상태 조회\n(jobId로 상태 및 결과 조회)
EventDB --> Event: {status, result}
alt Job 완료
@@ -69,7 +69,7 @@ end
User -> FE: 추천안 선택\n(제목/경품 커스텀)
FE -> Gateway: PUT /events/drafts/{eventDraftId}\n{선택한 추천안, 커스텀 정보}
Gateway -> Event: 선택 저장
Event -> EventDB: 이벤트 초안 업데이트
Event -> EventDB: 선택한 추천안 저장\n(이벤트 초안 업데이트)
EventDB --> Event: 업데이트 완료
Event --> Gateway: 200 OK
Gateway --> FE: 저장 완료
@@ -98,16 +98,16 @@ else 트렌디 스타일
ImageApi --> Content: 트렌디 이미지 URL
end
Content -> EventDB: 이미지 URL 저장
Content -> EventDB: 생성된 이미지 URL 저장\n(3가지 스타일 이미지 URL 저장)
EventDB --> Content: 저장 완료
Content -> EventDB: Job 상태 업데이트\nstatus: COMPLETED
Content -> EventDB: Job 상태 업데이트\n(상태를 COMPLETED로 변경)
Content -> Kafka: Publish to event-topic\nContentCreated\n{jobId, eventDraftId, imageUrls}
group Polling으로 상태 확인
loop 상태 확인 (최대 30초)
FE -> Gateway: GET /jobs/{jobId}/status
Gateway -> Event: Job 상태 조회
Event -> EventDB: Job 상태 및 결과 조회
Event -> EventDB: Job 상태 조회\n(jobId로 상태 및 이미지 URL 조회)
EventDB --> Event: {status, imageUrls}
alt Job 완료
@@ -125,7 +125,7 @@ end
User -> FE: 스타일 선택 및 편집
FE -> Gateway: PUT /events/drafts/{eventDraftId}/content\n{선택한 이미지, 편집내용}
Gateway -> Event: 콘텐츠 선택 저장
Event -> EventDB: 이벤트 초안 업데이트
Event -> EventDB: 선택한 콘텐츠 저장\n(이벤트 초안 업데이트)
EventDB --> Event: 업데이트 완료
Event --> Gateway: 200 OK
Gateway --> FE: 저장 완료
@@ -135,7 +135,7 @@ FE --> User: 배포 채널 선택 화면으로 이동
User -> FE: 배포 채널 선택\n최종 승인 요청
FE -> Gateway: POST /api/events/{eventDraftId}/publish\n{선택 채널 목록}
Gateway -> Event: 최종 승인 및 배포 처리
Event -> EventDB: 이벤트 상태 변경\nDRAFT → APPROVED
Event -> EventDB: 이벤트 상태 변경\n(DRAFT → APPROVED로 업데이트)
EventDB --> Event: 상태 변경 완료
Event -> Kafka: Publish to event-topic\nEventCreated\n{eventId, 이벤트정보}
@@ -176,13 +176,13 @@ else Kakao Channel
end
end
Dist -> EventDB: 배포 이력 저장
Dist -> EventDB: 배포 이력 저장\n(채널별 배포 결과 저장)
EventDB --> Dist: 저장 완료
Dist -> Kafka: Publish to event-topic\nDistributionCompleted\n{eventId, 배포결과}
Dist --> Event: REST API 응답\n200 OK\n{배포결과, 채널별 상태}
Event -> EventDB: 이벤트 상태 업데이트\nAPPROVED → ACTIVE
Event -> EventDB: 이벤트 상태 업데이트\n(APPROVED → ACTIVE로 변경)
EventDB --> Event: 업데이트 완료
Event --> Gateway: 200 OK\n{eventId, 배포결과}