@startuml
!theme mono

title 04. 실시간 협업 검증 - 이벤트스토밍 플로우

actor "회의 참석자 A" as UserA
actor "회의 참석자 B" as UserB
participant "회의록 시스템" as System
participant "웹소켓 서버" as WebSocket
participant "버전 관리" as Version

== 참석자 A가 회의록 수정 ==

UserA -> System : **커맨드**: 회의록 수정하기\n(데이터: 회의록 ID, 수정 내용, 수정자, 타임스탬프)
activate System
System -> System : 수정 내용 검증
System --> UserA : **이벤트**: 참석자가 회의록을 수정함\n(데이터: 수정 ID, 수정자, 수정 내용, 수정 위치)
deactivate System

System -> Version : 수정 이력 저장\n(데이터: 수정 ID, 버전 정보)
activate Version
Version --> System : 버전 저장 완료
deactivate Version

note right of System
**Policy/Rule**:
회의록 수정 시 →
웹소켓을 통해 모든 참석자에게
즉시 동기화
end note

== 실시간 동기화 ==

System -> WebSocket : **커맨드**: 수정 동기화하기\n(데이터: 수정 델타, 버전 정보)
activate WebSocket
WebSocket -> UserB : 실시간 동기화 전송
WebSocket --> System : **이벤트**: 수정 사항이 동기화됨\n(데이터: 동기화 시간, 영향받은 참석자 목록)
deactivate WebSocket

UserB -> UserB : 화면에 수정 사항 반영

== 동시 수정 충돌 발생 ==

UserB -> System : **커맨드**: 회의록 수정하기\n(동일 위치 수정 시도)
activate System
System -> System : 충돌 감지
System --> System : **이벤트**: 충돌이 감지됨\n(데이터: 충돌 ID, 충돌 위치, 관련 수정자)
deactivate System

note right of System
**Policy/Rule**:
동시 수정 발생 시 →
최종 수정이 우선 (Last Write Wins)
또는 충돌 알림
end note

== 충돌 해결 ==

System -> WebSocket : 충돌 알림 전송
WebSocket -> UserB : 충돌 알림 표시

UserB -> System : **커맨드**: 충돌 해결하기\n(데이터: 충돌 내용, 해결 방법)
activate System
System -> System : 충돌 해결 처리
System --> UserB : **이벤트**: 충돌이 해결됨\n(데이터: 해결 방법, 최종 내용)
deactivate System

System -> WebSocket : 해결된 내용 동기화
WebSocket -> UserA : 최종 내용 전송

== 검증 완료 ==

UserA -> System : **커맨드**: 검증 완료 표시하기\n(데이터: 검증자, 검증 시간)
activate System
System -> System : 검증 상태 업데이트
System --> UserA : **이벤트**: 검증이 완료됨\n(데이터: 검증자, 검증 상태, 완료 시간)
deactivate System

note right of System
**Policy/Rule**:
주요 섹션 검증 완료 시 →
해당 섹션 잠금 가능
end note

System -> WebSocket : 검증 완료 알림
WebSocket -> UserB : 검증 상태 동기화

note over UserA, Version
**Actor**: 회의 참석자들, 회의록 작성자
**External System**: 웹소켓 서버 (실시간 동기화), 버전 관리 시스템
**커맨드 데이터**: 수정 내용, 수정자, 충돌 해결 방법
**이벤트 데이터**: 수정 이력, 동기화 상태, 검증 완료
end note

@enduml
