@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