hgzero/design/backend/sequence/outer/회의종료및최종확정.puml
yabo0812 ed9fa6f934 설계서 업데이트: 실제 구현 반영 및 불필요한 다이어그램 정리
- 외부 시퀀스 다이어그램 업데이트
  * 회의예약: 템플릿 선택 플로우 추가, API 경로 수정 (/api/meetings/reserve)
  * 회의시작: SessionResponse 구조 반영 (sessionId, minutesId, websocketUrl 등)
  * 회의종료: AI 분석 동기 처리 및 MeetingEndResponse 구조 반영, RAG용 이벤트 추가

- 불필요한 다이어그램 삭제
  * 외부: 대시보드조회.puml (Meeting Service로 이동), Todo완료및회의록반영.puml (통합됨)
  * 내부: meeting-대시보드조회.puml, meeting-최종회의록확정.puml (중복)

- 실제 API Controller 구현과 일치하도록 API 경로 및 응답 구조 정확히 반영

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 18:20:15 +09:00

145 lines
4.8 KiB
Plaintext

@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
note over Gateway
라우팅 규칙:
/api/meetings/** → Meeting Service
/api/minutes/** → Meeting Service
/api/dashboard → User Service
/api/notifications/** → Notification Service
/api/auth/** → User Service
/api/todos/** → Meeting Service
end note
== 회의 종료 ==
User -> WebApp: 회의 종료 버튼 클릭
WebApp -> Gateway: POST /meetings/{meetingId}/end
note right
요청 헤더에 JWT 토큰 포함
요청 바디에 사용자 정보 포함
(userId, userName, email)
end note
Gateway -> Meeting: 회의 종료 요청
Meeting -> Meeting: 회의 종료 처리\n- 종료 시간 기록\n- 회의록 생성 (DRAFT 상태)\n- 회의 통계 생성\n (총 시간, 참석자 수 등)
Meeting -> AI: AI 분석 요청\n- 키워드 추출\n- 안건별 요약 생성\n- Todo 항목 추출
activate AI
AI -> AI: AI 분석 수행
AI --> Meeting: AI 분석 결과\n(keywords, agendaSummaries, todos)
deactivate AI
Meeting -> Meeting: DB 저장\n- Meeting 종료 상태\n- Minutes 생성 (DRAFT)\n- AgendaSection 저장\n- Todo 저장
Meeting -> Meeting: Redis 캐시 무효화\n(meeting:info:{meetingId})
Meeting -> EventHub: MeetingEnded 이벤트 발행\n(meetingId, userId, endTime)
note right
Partition Key: {meetingId}
Consumer Group:
- stt-service-group
end note
Meeting -> EventHub: NotificationRequest 이벤트 발행\n(회의 종료 알림)
activate EventHub
note right
이벤트 데이터:
- 발송수단: EMAIL
- 대상자: 참석자 전원
- 메시지: 회의 종료 안내
- 메타데이터: 회의 통계, 회의록 링크
end note
EventHub --> Meeting: 발행 완료
deactivate EventHub
Meeting -> Gateway: 200 OK\n- minutesId\n- 회의 통계 (참석자 수, 시간, 안건 수, Todo 수)\n- 키워드 목록\n- 안건별 AI 요약 (한줄 요약, 상세 요약)\n- Todo 목록
Gateway -> WebApp: 회의 종료 완료 응답\n(MeetingEndResponse)
WebApp -> User: 회의 종료 화면 표시\n- 통계 카드\n- 키워드 태그\n- 안건 아코디언 (AI 요약 + Todo)
== 비동기 처리 - STT 종료 ==
EventHub --> STT: MeetingEnded 이벤트 수신
STT -> STT: 음성 녹음 중지
STT -> STT: 최종 STT 변환 완료 확인
== 비동기 처리 - 회의 종료 알림 ==
EventHub --> Notification: NotificationRequest 이벤트 수신
Notification -> Notification: 회의 종료 알림 발송\n(참석자 전원)
note right
알림 내용:
- 회의 제목
- 회의 종료 시간
- 회의 통계
- 회의록 링크
end note
== 최종 회의록 확정 ==
User -> WebApp: 최종 회의록 확정 버튼 클릭\n(회의록 수정 화면 또는 회의 종료 화면)
WebApp -> Gateway: POST /api/meetings/minutes/{minutesId}/finalize
note right
요청 헤더에 JWT 토큰 포함
X-User-Id, X-User-Name, X-User-Email
end note
Gateway -> Meeting: 회의록 확정 요청
Meeting -> Meeting: 회의록 상태 변경\n- DRAFT → FINALIZED\n- finalizedAt 기록\n- finalizedBy 기록
Meeting -> Meeting: DB 저장\n- Minutes 상태 업데이트
Meeting -> Meeting: Redis 캐시 저장\n(확정된 회의록, TTL: 10분)
Meeting -> Meeting: Redis 목록 캐시 무효화\n(사용자별 회의록 목록)
Meeting -> EventHub: MinutesFinalizedEvent 발행\n(알림용 - 기존)
activate EventHub
note right
간단한 이벤트 데이터:
- minutesId
- title
- userId
- userName
end note
EventHub --> Meeting: 발행 완료
deactivate EventHub
Meeting -> EventHub: MinutesFinalizedEvent 발행\n(RAG용 - 완전한 데이터)
activate EventHub
note right
완전한 이벤트 데이터:
- Meeting 정보 (meetingId, title, purpose, scheduledAt 등)
- Minutes 정보 (minutesId, status, version 등)
- Sections 정보 (모든 안건 섹션)
- 참석자 정보
end note
EventHub --> Meeting: 발행 완료
deactivate EventHub
Meeting -> Gateway: 200 OK\n(확정된 회의록 상세 정보)
Gateway -> WebApp: 회의록 확정 완료
WebApp -> User: 확정 완료 토스트 표시\n회의록 상세 조회 화면으로 이동
== 비동기 처리 - 알림 발송 ==
EventHub --> Notification: MinutesFinalizedEvent 수신\n(알림용)
Notification -> Notification: 회의록 확정 알림 발송\n(참석자 전원)
note right
알림 내용:
- 회의 제목
- 확정 시간
- 회의록 링크
end note
== 비동기 처리 - RAG 저장 ==
EventHub --> AI: MinutesFinalizedEvent 수신\n(RAG용)
activate AI
AI -> AI: RAG 서비스 연동\n- 벡터 DB 저장\n- 관련 회의록 검색 준비
deactivate AI
@enduml