mirror of
https://github.com/hwanny1128/HGZero.git
synced 2025-12-06 06:46:24 +00:00
- 외부 시퀀스 설계 가이드 다운로드 (claude/sequence-outer-design.md) - 외부 시퀀스 설계 디렉토리 생성 (design/backend/sequence/) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
109 lines
4.0 KiB
Plaintext
109 lines
4.0 KiB
Plaintext
@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
|