외부 시퀀스 설계 완료

- 7개 주요 비즈니스 플로우 설계 완료
  1. 회의예약및참석자초대 (2.5KB)
  2. 회의시작및실시간회의록작성 (4.9KB)
  3. 회의종료및최종확정 (4.6KB)
  4. 회의록공유 (2.1KB)
  5. Todo완료및회의록반영 (1.9KB)
  6. 대시보드조회 (1.6KB)
  7. 회의록상세조회및수정 (4.4KB)

- 설계 특징
  - 병렬 처리 전략: 서브 에이전트 활용 동시 작성
  - 5개 서비스 통합 아키텍처 (User, Meeting, STT, AI, Notification)
  - Azure Event Hubs를 통한 Pub/Sub 이벤트 기반 통신
  - Redis Cache-Aside 패턴을 통한 성능 최적화
  - AI 병렬 처리 (회의록 정리 + 전문용어 설명 + 관련 자료 검색)
  - WebSocket 실시간 동기화 (델타 전송)

- 작성원칙 준수
  - 유저스토리와 1:1 매칭
  - 논리 아키텍처에 정의된 참여자 표시
  - UI/UX 사용자 플로우 참조
  - 동기/비동기 통신 명확히 구분 (실선/점선)
  - 한글 설명 추가
  - PlantUML 표준 (!theme mono, 올바른 화살표 문법)

- PlantUML 문법 검증 완료 (수동)
  - @startuml, !theme mono 사용
  - 금지된 ..> 화살표 미사용
  - 동기 (→), 비동기 (->>), 캐시 (-.->) 구분

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

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
kimjh
2025-10-22 14:58:20 +09:00
parent 1b5efd76d8
commit a43b0c63cb
7 changed files with 664 additions and 0 deletions
@@ -0,0 +1,136 @@
@startuml
!theme mono
title 외부 시퀀스 - 회의 종료 및 최종 확정
actor "사용자" as User
participant "Web App" as WebApp
participant "API Gateway" as Gateway
participant "Meeting Service" as Meeting
participant "STT Service" as STT
participant "AI Service" as AI
participant "Notification Service" as Notification
participant "Azure Event Hubs" as EventHub
== 회의 종료 ==
User -> WebApp: 회의 종료 버튼 클릭
WebApp -> Gateway: POST /meetings/{meetingId}/end
note right
요청 헤더에 JWT 토큰 포함
요청 바디에 사용자 정보 포함
(userId, userName, email)
end note
Gateway -> Meeting: 회의 종료 요청
Meeting -> Meeting: 회의 종료 처리\n- 종료 시간 기록\n- 회의 통계 생성\n (총 시간, 참석자 수, 발언 횟수 등)
Meeting -> Meeting: DB 저장
Meeting -> Meeting: Redis 캐시 무효화\n(meeting:info:{meetingId})
Meeting ->> EventHub: MeetingEnded 이벤트 발행\n(meetingId, userId, endTime)
note right
Partition Key: {meetingId}
Consumer Group:
- stt-service-group
- ai-service-group
- notification-service-group
end note
Meeting -> Gateway: 202 Accepted\n(회의 종료 완료)
Gateway -> WebApp: 회의 종료 완료 응답
WebApp -> User: 회의 통계 표시\n(총 시간, 참석자, 발언 횟수 등)
== 비동기 처리 - STT 종료 ==
EventHub -->> STT: MeetingEnded 이벤트 수신
STT -> STT: 음성 녹음 중지
STT -> STT: 최종 STT 변환 완료 확인
== 비동기 처리 - AI Todo 추출 ==
EventHub -->> AI: MeetingEnded 이벤트 수신
AI -> AI: 최종 회의록 분석
AI -> AI: Todo 자동 추출\n- 액션 아이템 식별\n- 담당자 자동 식별\n- 마감일 추출
AI -> AI: DB 저장 (AiTaskStatus)
AI -> Meeting: POST /meetings/{meetingId}/todos\n(Todo 정보 전송)
note right
Todo 정보:
- Todo 내용
- 담당자 (자동 식별)
- 마감일 (언급된 경우)
- 우선순위
- 관련 회의록 섹션 링크
end note
Meeting -> Meeting: Todo 생성 및 할당\n(내부 처리)
Meeting -> Meeting: 회의록 섹션 링크 연결
Meeting -> Meeting: DB 저장 (Todo 테이블)
Meeting -> Meeting: Redis 캐시 무효화\n(todo:user:{userId})
Meeting ->> EventHub: TodoCreated 이벤트 발행\n(todoId, assignee, dueDate)
note right
Partition Key: {userId}
Consumer Group:
- notification-service-group
end note
Meeting -> AI: 200 OK (Todo 생성 완료)
== 비동기 처리 - 회의 종료 알림 ==
EventHub -->> Notification: MeetingEnded 이벤트 수신
Notification -> Notification: 회의 종료 알림 준비\n(참석자 전원)
Notification -> Notification: 이메일 발송
note right
알림 내용:
- 회의 제목
- 회의 종료 시간
- 회의 통계
- 회의록 링크
end note
== 비동기 처리 - Todo 할당 알림 ==
EventHub -->> Notification: TodoCreated 이벤트 수신
Notification -> Notification: Todo 할당 알림 준비
Notification -> Notification: 담당자에게 이메일 발송
note right
알림 내용:
- Todo 내용
- 마감일
- 우선순위
- 회의록 링크 (해당 섹션)
end note
== 최종 회의록 확정 ==
User -> WebApp: 최종 회의록 확정 버튼 클릭
WebApp -> Gateway: POST /meetings/{meetingId}/transcripts/finalize
note right
요청 헤더에 JWT 토큰 포함
요청 바디에 사용자 정보 포함
end note
Gateway -> Meeting: 회의록 확정 요청
Meeting -> Meeting: 필수 항목 검사\n- 회의 제목\n- 참석자 목록\n- 주요 논의 내용\n- 결정 사항
alt 필수 항목 미작성
Meeting -> Gateway: 400 Bad Request\n(누락된 항목 정보)
Gateway -> WebApp: 검증 실패 응답
WebApp -> User: 누락된 항목 안내\n(해당 섹션으로 자동 이동)
else 필수 항목 작성 완료
Meeting -> Meeting: 회의록 최종 확정\n- 확정 버전 생성\n- 확정 시간 기록\n- 공유 가능 상태로 전환
Meeting -> Meeting: DB 저장 (TranscriptVersion)
Meeting -> Meeting: Redis 캐시 무효화
Meeting ->> EventHub: TranscriptFinalized 이벤트 발행\n(meetingId, version, finalizedAt)
note right
Partition Key: {meetingId}
Consumer Group:
- notification-service-group
end note
Meeting -> Gateway: 200 OK\n(확정 버전 정보)
Gateway -> WebApp: 회의록 확정 완료
WebApp -> User: 확정 완료 안내\n(버전 번호, 확정 시간)
EventHub -->> Notification: TranscriptFinalized 이벤트 수신
Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원)
end
@enduml