@startuml 회의시작및회의록작성 !theme mono title 회의 시작 및 회의록 작성 플로우 (UFR-MEET-030, UFR-STT-010/020, UFR-AI-010, UFR-RAG-010/020, UFR-COLLAB-010) actor "참석자" as User participant "Frontend" as FE participant "API Gateway" as GW participant "Meeting Service" as MS participant "STT Service" as STT participant "AI Service" as AI participant "RAG Service" as RAG participant "Collaboration Service" as CS participant "Redis" as Cache database "Meeting DB" as MDB database "STT DB" as STTDB database "AI DB" as AIDB database "RAG DB" as RAGDB queue "RabbitMQ" as MQ participant "Azure Speech" as Azure participant "LLM Server" as LLM == 회의 시작 == User -> FE: 회의 시작 버튼 클릭 activate FE FE -> GW: POST /api/meetings/{meetingId}/start activate GW GW -> MS: 회의 시작 요청 activate MS MS -> MDB: UPDATE meetings\nSET start_time = NOW(), status = 'in_progress'\n세션 생성 activate MDB MDB --> MS: 회의 시작 시간 기록 완료 deactivate MDB MS ->> MQ: MeetingStarted 이벤트 발행\n{meetingId, sessionId, startTime} activate MQ note right of MQ 이벤트: MeetingStarted Routing Key: meeting.started end note MQ -->> MS: ACK deactivate MQ MS --> GW: 200 OK\n{sessionId, status: "in_progress"} deactivate MS GW --> FE: 회의 세션 정보 반환 deactivate GW FE --> User: 회의 진행 화면 표시 deactivate FE == 음성 녹음 시작 (비동기) == MQ ->> STT: MeetingStarted 이벤트 전달 activate STT note right of STT 구독: meeting.started 큐: stt.meeting.started end note STT -> STTDB: INSERT INTO sessions\n(세션 생성) activate STTDB STTDB --> STT: 세션 ID 반환 deactivate STTDB STT -> STT: 음성 녹음 시작\n(실시간 스트림) STT -->> MQ: ACK deactivate STT == 실시간 음성 인식 (5초 간격 반복) == loop 발언 발생 (5초마다) User -> FE: 음성 발언 activate FE FE -> STT: 오디오 스트림 전송 activate STT STT -> Azure: 음성-텍스트 변환 요청\n(실시간 스트림) activate Azure Azure --> STT: 변환된 텍스트 반환\n{speaker, text, timestamp} deactivate Azure STT -> STTDB: INSERT INTO transcripts\n(발언 텍스트 저장) activate STTDB STTDB --> STT: OK deactivate STTDB STT ->> MQ: TranscriptReady 이벤트 발행\n{sessionId, speaker, text, timestamp} activate MQ note right of MQ 이벤트: TranscriptReady Routing Key: transcript.ready 주기: 5초 end note MQ -->> STT: ACK deactivate MQ deactivate STT == AI 회의록 자동 작성 (비동기) == MQ ->> AI: TranscriptReady 이벤트 전달 activate AI note right of AI 구독: transcript.ready 큐: ai.transcript.ready end note AI -> AI: 회의 맥락 이해\n주제별 분류\n문장 다듬기 AI -> LLM: 회의록 자동 작성 요청\n{context, transcript, history} activate LLM LLM --> AI: 회의록 초안 반환\n{summary, topics, keyPoints} deactivate LLM AI -> AIDB: INSERT INTO minutes_draft\n(회의록 초안 저장) activate AIDB AIDB --> AI: OK deactivate AIDB AI -> CS: 실시간 동기화 요청\n{delta, version} activate CS CS -> FE: WebSocket 푸시\n(회의록 델타 전송) activate FE FE -> User: 회의록 실시간 업데이트 표시 deactivate FE CS --> AI: 동기화 완료 deactivate CS AI -->> MQ: ACK deactivate AI == 전문용어 자동 감지 및 설명 (비동기) == MQ ->> RAG: TranscriptReady 이벤트 전달 activate RAG note right of RAG 구독: transcript.ready 큐: rag.transcript.ready end note RAG -> RAG: 전문용어 자동 감지\n(NER, 도메인 사전) RAG -> RAGDB: SELECT explanation\nFROM terms\nWHERE term IN (detected_terms) activate RAGDB RAGDB --> RAG: 용어 설명 반환 deactivate RAGDB alt 맥락 기반 설명 필요 RAG -> LLM: 맥락 기반 설명 생성 요청\n{term, context, domain} activate LLM LLM --> RAG: 맥락적 설명 반환 deactivate LLM RAG -> RAGDB: INSERT INTO explanations\n(생성된 설명 저장) activate RAGDB RAGDB --> RAG: OK deactivate RAGDB end RAG -> FE: WebSocket 푸시\n(용어 설명 툴팁 데이터) activate FE FE -> User: 용어 설명 툴팁 표시 deactivate FE RAG -->> MQ: ACK deactivate RAG end @enduml