Solo vs Live 모드¶
ThinkERD의 두 가지 동기화 모드를 상세히 설명합니다.
Solo Mode¶
**혼자 편집**할 때 사용되는 기본 모드입니다.
특징¶
- REST API 동기화 — 변경사항을 서버에 REST API로 저장
- IndexedDB 영속화 — 로컬 브라우저에 데이터를 캐싱하여 오프라인에서도 작업 가능
- BroadcastChannel — 같은 브라우저의 여러 탭 간 동기화
- WebSocket 미사용 — 서버 리소스를 절약
Tab Leader Election¶
같은 사용자가 여러 탭에서 같은 다이어그램을 열면, **하나의 탭만 Leader**로 선출되어 서버와 통신합니다. 나머지 탭은 Follower로서 Leader를 통해 간접 동기화합니다.
graph TB
Server["🖥️ Server"]
Leader["👑 Tab 1 (Leader)"]
F1["📄 Tab 2 (Follower)"]
F2["📄 Tab 3 (Follower)"]
Leader <-->|REST API| Server
Leader <-->|BroadcastChannel| F1
Leader <-->|BroadcastChannel| F2
style Leader fill:#fef3c7,stroke:#d97706
style F1 fill:#f3f4f6,stroke:#9ca3af
style F2 fill:#f3f4f6,stroke:#9ca3af Live Mode¶
**2명 이상이 동시에 편집**할 때 자동으로 전환되는 모드입니다.
특징¶
- Yjs (CRDT) — Conflict-free Replicated Data Type으로 충돌 없는 동시 편집
- WebSocket — 실시간 양방향 통신
- Awareness — 다른 사용자의 커서, 선택 영역, 이동 중인 노드를 실시간 공유
- 자동 병합 — 같은 속성을 동시에 수정해도 데이터 손실 없이 병합
전환 흐름¶
| 이벤트 | 동작 |
|---|---|
| 다른 사용자 진입 | Presence Monitor(SSE)가 감지 → upgradeToCollab() |
| 모든 사용자 퇴장 | 60초 카운트다운 → downgradeToSolo() |
60초 유예
다른 사용자가 나갔다가 바로 돌아오는 경우를 대비하여, Solo 모드로 전환하기 전에 **60초의 유예 시간**을 둡니다.
모드 비교¶
| 항목 | Solo Mode | Live Mode |
|---|---|---|
| 연결 | REST API | WebSocket |
| 동기화 | 저장 시점 | 실시간 |
| 서버 비용 | 낮음 | 높음 |
| 탭 간 동기 | BroadcastChannel | WebSocket + BroadcastChannel |
| 커서 공유 | ❌ | ✅ |
| 충돌 해결 | Last-write-wins | CRDT 자동 병합 |
| 사용 비율 | ~99% | ~1% |