hgzero/design/backend/sequence/outer/04-회의진행및실시간회의록작성.puml
djeon e1d411e989 외부 시퀀스 설계 가이드 및 설계서 추가
- 외부 시퀀스 설계 가이드 다운로드 (claude/sequence-outer-design.md)
- 외부 시퀀스 설계 디렉토리 생성 (design/backend/sequence/)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-22 13:23:50 +09:00

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