@startuml 04-협업검증 !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