@startuml
!theme mono

title 회의시작및실시간회의록작성 외부 시퀀스

actor "사용자" as User
participant "Web App" as Frontend
participant "API Gateway" as Gateway
participant "Meeting Service" as Meeting
participant "STT Service" as STT
participant "AI Service" as AI
database "Redis Cache" as Cache
queue "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 -> Frontend: 회의 시작 버튼 클릭
activate Frontend

Frontend -> Gateway: POST /api/meetings/{meetingId}/start
activate Gateway

Gateway -> Meeting: POST /meetings/{meetingId}/start
activate Meeting

Meeting -> Meeting: 회의 세션 생성

Meeting -> STT: POST /stt/recording/start\n(meetingId, participantIds)
activate STT
note right
  동기 호출로 즉시 녹음 시작
  회의 시작과 음성 녹음이 원자적으로 처리
end note

STT -> STT: 음성 녹음 준비 및 시작

STT --> Meeting: 200 OK (recordingId)
deactivate STT

Meeting --> Gateway: 201 Created
deactivate Meeting

Gateway --> Frontend: 201 Created
deactivate Gateway

Frontend -> Frontend: 회의 화면으로 전환

Frontend --> User: 회의 진행 화면 표시
deactivate Frontend

== 음성 녹음 진행 ==

== 실시간 회의록 작성 (반복) ==

loop 5초 간격 배치 처리

User -> Frontend: 발언 (음성 입력)
activate Frontend

Frontend -> STT: 음성 데이터 스트리밍
activate STT

STT -> STT: 음성 인식 처리

STT -> EventHub: TranscriptReady 이벤트 발행
activate EventHub

STT --> Frontend: 음성 처리 중 표시
deactivate STT
deactivate Frontend

== AI 병렬 처리 ==

EventHub -> AI: TranscriptReady 이벤트 구독
activate AI

par 회의록 내용 정리
    AI -> AI: [1] 회의록 내용 정리 (LLM)
else 전문용어 추출
    AI -> AI: [2] 전문용어 추출 (RAG)
else 관련 자료 검색
    AI -> AI: [3] 관련 자료 검색
else 논의사항 제안
    AI -> AI: [4] 추가할 논의사항 제안 (LLM)
    note right
      실시간으로 대화 맥락 분석하여
      추가할만한 논의 항목 제안
    end note
else 결정사항 제안
    AI -> AI: [5] 결정사항 제안 (LLM)
    note right
      "~하기로 함", "~로 결정" 등의
      결정 패턴 감지 및 구조화
    end note
end

AI -> AI: AI 분석 결과 저장

AI -> EventHub: TranscriptSummaryCreated 발행
note right
  이벤트 데이터:
  - 회의록 내용
  - 전문용어 목록
  - 논의사항 제안 목록
  - 결정사항 제안 목록
end note

AI --> EventHub: AI 분석 완료
deactivate AI

== 회의록 저장 및 실시간 동기화 ==

EventHub -> Meeting: TranscriptSummaryCreated 구독
activate Meeting

Meeting -> Meeting: 회의록 데이터 저장

Meeting -> Cache: 캐시 무효화
activate Cache
Cache --> Meeting: 캐시 삭제 완료
deactivate Cache

Meeting -> Frontend: WebSocket 메시지 전송
activate Frontend
note right
  WebSocket 데이터:
  - 회의록 내용
  - 논의사항 제안 (오른쪽 탭)
  - 결정사항 제안 (오른쪽 탭)
  - 전문용어 하이라이트
end note

Meeting --> EventHub: 동기화 완료
deactivate Meeting
deactivate EventHub

Frontend -> Frontend: 회의록 화면 업데이트
Frontend -> Frontend: 오른쪽 탭에 추천 항목 표시

Frontend --> User: 실시간 회의록 + 추천사항 표시
deactivate Frontend

== 사용자 추천 적용 ==

User -> Frontend: 추천 항목 "적용" 버튼 클릭
activate Frontend
note right
  논의사항/결정사항 중
  원하는 항목 선택하여 적용
end note

Frontend -> Frontend: 추천 내용을 회의록에 반영

Frontend -> Gateway: PUT /api/meetings/{meetingId}/transcript
activate Gateway
note right
  사용자가 적용한 내용으로
  회의록 업데이트
end note

Gateway -> Meeting: PUT /meetings/{meetingId}/transcript
activate Meeting

Meeting -> Meeting: 회의록 업데이트

Meeting --> Gateway: 200 OK
deactivate Meeting

Gateway --> Frontend: 200 OK
deactivate Gateway

Frontend --> User: 회의록 업데이트 완료
deactivate Frontend

end

note over User, EventHub
처리 시간:
- STT 변환: 1-3초
- AI 병렬 처리: 7-10초
  * 회의록 정리: 3-5초
  * 전문용어: 2-4초
  * 논의사항 제안: 2-3초
  * 결정사항 제안: 2-3초
- 회의록 저장: 1-2초
- 총 처리 시간: 9-15초
end note
@enduml
