hgzero/design/backend/sequence/outer/09-Todo완료및회의록반영.puml
djeon e1d411e989 외부 시퀀스 설계 가이드 및 설계서 추가
- 외부 시퀀스 설계 가이드 다운로드 (claude/sequence-outer-design.md)
- 외부 시퀀스 설계 디렉토리 생성 (design/backend/sequence/)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-22 13:23:50 +09:00

95 lines
3.4 KiB
Plaintext

@startuml
!theme mono
title Flow 9: Todo 완료 및 회의록 반영 (Todo Completion and Transcript Update)
actor User as user
participant "Web App" as web
participant "API Gateway" as gateway
participant "Todo Service" as todo
participant "RabbitMQ" as mq
participant "Meeting Service" as meeting
participant "Notification Service" as notification
participant "Redis" as redis
participant "PostgreSQL\n(Todo DB)" as tododb
participant "PostgreSQL\n(Meeting DB)" as meetingdb
participant "WebSocket\nConnection" as ws
== Todo 완료 처리 (Todo Completion Processing) ==
user -> web: Todo 완료 버튼 클릭\n(Click "Complete" button)
web -> gateway: PUT /api/todos/{todoId}/complete\n(Todo 완료 요청)
gateway -> todo: PUT /todos/{todoId}/complete\n(Todo 완료 처리 요청)
activate todo
todo -> tododb: UPDATE todos\nSET status='COMPLETED',\ncompleted_at=NOW(),\ncompleted_by={userId}\nWHERE id={todoId}
tododb --> todo: 완료 상태 저장 완료\n(Completion status saved)
todo -> redis: DEL cache:todo:{todoId}\n(Todo 캐시 무효화)
redis --> todo: 캐시 삭제 완료
todo --> gateway: 200 OK\n{todo: {..., status: "COMPLETED"}}
gateway --> web: 200 OK
web --> user: Todo 완료 표시\n(Show completion checkmark)
== 비동기 이벤트 발행 (Async Event Publishing) ==
todo ->> mq: Publish "TodoCompleted"\n{todoId, meetingId, userId,\ncompletedAt}
deactivate todo
mq ->> meeting: Consume "TodoCompleted"\n(Todo 완료 이벤트 수신)
activate meeting
== 회의록 업데이트 (Meeting Transcript Update) ==
meeting -> redis: GET cache:transcript:{meetingId}\n(회의록 캐시 조회)
alt 캐시 히트 (Cache Hit)
redis --> meeting: 회의록 데이터 반환
else 캐시 미스 (Cache Miss)
meeting -> meetingdb: SELECT * FROM transcripts\nWHERE meeting_id={meetingId}
meetingdb --> meeting: 회의록 데이터 반환
end
meeting -> meeting: Todo 섹션에 완료 상태 반영\n(Update todo section:\ncheckmark, completed_at,\ncompleted_by)
meeting -> meetingdb: UPDATE transcripts\nSET content={updatedContent},\nupdated_at=NOW()\nWHERE meeting_id={meetingId}
meetingdb --> meeting: 회의록 업데이트 완료
meeting -> redis: DEL cache:transcript:{meetingId}\n(회의록 캐시 무효화)
redis --> meeting: 캐시 삭제 완료
== 알림 발송 (Notification Sending) ==
meeting ->> mq: Publish "TranscriptUpdated"\n{meetingId, updateType:\n"TODO_COMPLETED",\ntodoId, userId}
deactivate meeting
mq ->> notification: Consume "TranscriptUpdated"\n(회의록 업데이트 이벤트 수신)
activate notification
notification -> meetingdb: SELECT creator_id\nFROM transcripts\nWHERE meeting_id={meetingId}
meetingdb --> notification: 회의록 작성자 ID 반환
notification -> notification: 알림 메시지 생성\n("Todo가 완료되었습니다")
notification ->> user: 회의록 작성자에게\n완료 알림 전송\n(Send completion notification)
deactivate notification
== 실시간 동기화 (Real-time Sync) ==
mq ->> ws: Consume "TranscriptUpdated"\n(실시간 동기화 이벤트)
activate ws
ws -> redis: GET ws:participants:{meetingId}\n(현재 회의록 조회 중인\n참여자 목록 조회)
redis --> ws: 참여자 WebSocket 세션 목록
loop 각 참여자에게 (For each participant)
ws ->> web: WebSocket Push\n{type: "TODO_COMPLETED",\ntodoId, completedAt,\ncompletedBy}
web -> web: 화면에 완료 상태 실시간 반영\n(Update UI with completion status)
end
deactivate ws
@enduml