@startuml 회의진행및실시간회의록작성 !theme mono title 회의 진행 및 실시간 회의록 작성 (Flow 4) actor "참여자 A" as UserA actor "참여자 B" as UserB participant "Web App A\n(WebSocket)" as WebA participant "Web App B\n(WebSocket)" as WebB participant "STT Service" as STT participant "AI Service" as AI participant "Collaboration\nService" as Collab participant "RabbitMQ" as MQ participant "Redis" as Cache database "PostgreSQL" as DB == 실시간 음성 인식 (5초 단위) == loop 5초마다 반복 STT -> STT: 오디오 청크 수집\n(5초분) STT -> STT: 음성-텍스트 변환\n(Speech-to-Text) STT ->> MQ: Publish "TranscriptReady" Event\n{\n sessionId,\n timestamp,\n speaker: "참여자A",\n text: "변환된 텍스트",\n confidence: 0.95\n} note right 비동기 이벤트 발행 - Exchange: transcript.events - Routing Key: transcript.ready end note end == AI 기반 회의록 자동 생성 == MQ -->> AI: Consume "TranscriptReady" Event AI -> AI: 텍스트 분석 및 구조화\n(키워드, 주제, 맥락 파악) AI -> Cache: 템플릿 구조 조회\n(sessionId) Cache --> AI: 템플릿 섹션 정보\n(agenda, decisions, tasks) AI -> AI: 템플릿 섹션에 맞춰\n내용 자동 분류 note right 예시: - "결정사항" → decisions - "TODO" → action_items - "논의내용" → discussions end note AI -> DB: INSERT INTO transcript_segments\n(session_id, section,\ncontent, timestamp) DB --> AI: 세그먼트 저장 완료 AI ->> MQ: Publish "TranscriptUpdated" Event\n{\n sessionId,\n segmentId,\n section,\n content,\n updatedAt\n} == 실시간 협업 및 동기화 == MQ -->> Collab: Consume "TranscriptUpdated" Event Collab -> Cache: 현재 회의록 상태 조회 Cache --> Collab: 최신 회의록 데이터 Collab -> Collab: 변경 사항 감지 및\n충돌 검사 (CRDT 알고리즘) Collab ->> WebA: WebSocket Push\n{\n type: "transcript.update",\n section: "decisions",\n content: "...",\n author: "AI"\n} Collab ->> WebB: WebSocket Push\n{\n type: "transcript.update",\n section: "decisions",\n content: "...",\n author: "AI"\n} WebA --> UserA: 회의록 UI 실시간 업데이트 WebB --> UserB: 회의록 UI 실시간 업데이트 == 참여자 실시간 편집 == UserA -> WebA: 회의록 내용 수정\n("결정사항" 섹션 편집) WebA ->> Collab: WebSocket Send\n{\n type: "edit",\n section: "decisions",\n content: "수정된 내용",\n cursorPosition: 42\n} Collab -> Collab: 동시 편집 충돌 검사\n(Operational Transform) alt 충돌 없음 Collab -> DB: UPDATE transcript_segments\nSET content='수정된 내용' DB --> Collab: 업데이트 완료 Collab -> Cache: 최신 회의록 캐시 갱신 Collab ->> WebB: WebSocket Push\n{\n type: "peer.edit",\n section: "decisions",\n content: "수정된 내용",\n author: "참여자A"\n} WebB --> UserB: 참여자A의 수정사항 반영 else 충돌 발생 Collab -> Collab: 충돌 해결 알고리즘 적용\n(Last-Write-Wins + Merge) Collab -> DB: UPDATE transcript_segments\nSET content='병합된 내용' Collab ->> WebA: WebSocket Push\n{\n type: "conflict.resolved",\n mergedContent: "병합된 내용"\n} Collab ->> WebB: WebSocket Push\n{\n type: "conflict.resolved",\n mergedContent: "병합된 내용"\n} WebA --> UserA: 병합된 내용으로 UI 업데이트 WebB --> UserB: 병합된 내용으로 UI 업데이트 end == 실시간 커서 및 선택 영역 공유 == UserB -> WebB: 텍스트 선택 또는 커서 이동 WebB ->> Collab: WebSocket Send\n{\n type: "cursor.move",\n userId: "userB",\n position: 120,\n selection: {start: 100, end: 130}\n} Collab ->> WebA: WebSocket Push\n{\n type: "peer.cursor",\n userId: "userB",\n userName: "참여자B",\n position: 120,\n color: "#FF5733"\n} WebA --> UserA: 참여자B의 커서 위치 표시\n(다른 색상으로 강조) note over WebA, WebB 실시간 협업 기능: - 동시 편집 지원 (CRDT) - 충돌 자동 해결 - 커서 위치 공유 - 변경 이력 추적 end note @enduml