← 목록
기타 2026-05-22 6KB 읽기 6분

동시편집엔진.한선 — Operational Transform (OT) 구현

작성일: 2026-05-22 | 상태: 완료 | 파일: /Users/ef/crowny-project/동시편집엔진.한선

개요

Operational Transform(OT) 기반의 실시간 협업 편집 엔진을 순수 한선씨(RPN)로 구현했습니다. 9가지 핵심 함수로 2+ 명의 동시 사용자가 문서를 편집할 때 충돌을 자동으로 해결하고, 모든 클라이언트가 같은 최종 상태에 수렴하도록 합니다.

무엇을 했는지

1. 9개 핵심함수 구현

#함수목적
1편집세션생성(문서유형, 문서ID, 작성자)새 협업 세션 생성
2연산적용(내용, 연산)insert/delete 연산을 텍스트에 적용
3연산변환(연산A, 연산B)OT 핵심 — 두 동시 연산 변환
4삽입삽입변환(연산A, 연산B)insert vs insert 충돌 해결
5삭제삭제변환(연산A, 연산B)delete vs delete 충돌 해결
6텍스트차이(이전, 현재)두 문자열 비교 → 연산으로 변환
7리비전증가(세션)세션 버전 관리
8편집자관리(세션, 사용자, 입장여부)활동 편집자 목록 유지
9셀코어규칙()3가지 규칙 반환 (유휴정리/편집자과다/충돌률)

2. 자료구조 설계

연산 (Operation): ```한선 { "유형": "삽입" 또는 "삭제", "위치": 인덱스, "텍스트": 문자열 (삽입일 때), "길이": 정수 (삭제일 때) }


**세션 (Session)**:
한선 { "유형": 문서유형, "ID": 문서ID, "작성자": 이름, "내용": 현재텍스트, "리비전": 버전번호, "편집자목록": [], "연산기록": [], "생성시간": 타임스탐프 }

### 3. OT 알고리즘 구현

**4가지 충돌 시나리오 자동 처리**:

1. **insert vs insert**
   - A가 B보다 앞에서 삽입 → B 위치를 A의 길이만큼 뒤로 이동
   - 같은 위치 → A가 먼저 적용되므로 B를 뒤로 밀기

2. **delete vs delete**
   - A 범위 뒤의 B → B 위치 조정
   - 범위 겹침 → 교집합 제거

3. **insert vs delete**
   - A 삽입이 B 삭제보다 앞 → B 위치 조정 (뒤로)
   - A 삽입이 B 범위와 겹침 → B 길이 조정

4. **delete vs insert**
   - A 삭제가 B 삽입보다 앞 → B 위치 조정 (앞으로)

### 4. 셀코어 통합

3가지 규칙 기반 자동 관리:

한선 셀코어규칙() → [ { "이름": "유휴세션정리", "조건": "마지막활동 > 300초", "행동": "세션종료" }, { "이름": "편집자과다경고", "조건": "편집자수 > 10", "행동": "경고발송" }, { "이름": "충돌률모니터링", "조건": "충돌률 >= 0.1", "행동": "병합전략전환" } ]

### 5. 테스트 코드 포함

- 세션 생성 → 리비전 관리
- 연산 적용 → 텍스트 변환
- 동시 연산 변환 → 수렴성 검증
- 편집자 관리 → 활동 추적

## 관련 파일 경로

- **소스**: `/Users/ef/crowny-project/동시편집엔진.한선` (392줄)
- **컴파일**: `hanseonc_high` → `/tmp/ot.toau` (47,623 cubes)
- **문서**: `/Users/ef/crowny-project/동시편집엔진_README.md`
- **학습**: `crownycode-learn.sh add "동시편집OT" ...`

## 기술 사양

| 항목 | 값 |
|------|-----|
| **언어** | 순수 한선씨 (RPN 기반) |
| **라이브러리** | 셀코어 (규칙 기반 에이전트) |
| **핵심함수** | 9개 (OT 완전 커버) |
| **자료구조** | 맵, 배열 |
| **컴파일 크기** | 47,623 큐브 |
| **테스트** | 실행 가능한 예제 포함 |
| **의존성** | 0개 외부 라이브러리 (셀코어 제외) |

## 동작 원리 예시

**초기 상태**: `"안녕하세요"` (5글자)

**사용자 A** (위치 2 삽입 "~"):
"안녕하세요" → "안~녕하세요"

**사용자 B** (동시에 위치 3 삽입 "!"):
원본 위치: "안녕하세요"의 위치 3 = '녕' 미변환: "안녕~!하세요" ❌

OT 변환:

  • A가 위치 2에서 1글자 삽입했으므로
  • B의 위치 3 → 4로 조정

**최종 결과** (양쪽 클라이언트 모두):
"안~녕!하세요" ✓

## 사용 예

한선 ; 1. 세션 생성 변수 세션 = 편집세션생성("문서", "DOC001", "사용자A")

; 2. 편집자 진입 편집자관리(세션, "사용자B", 참)

; 3. 동시 연산 변환 변수 연산A = { "유형": "삽입", "위치": 2, "텍스트": "~" } 변수 연산B = { "유형": "삽입", "위치": 3, "텍스트": "!" } 변수 변환된B = 연산변환(연산A, 연산B)

; 4. 결과 확인 변수 내용 = "안녕하세요" 내용 = 연산적용(내용, 연산A) 내용 = 연산적용(내용, 변환된B) ; 내용 = "안~녕!하세요"


## 테스트 방법

bash cd /Users/ef/CrownyOS/crownyc

1. 고수준 컴파일

./hanseonc_high /Users/ef/crowny-project/동시편집엔진.한선 > /tmp/ot.toau

2. 실행

./crownyc run /tmp/ot.toau

예상 출력:

세션 생성: DOC001

초기내용: 안녕하세요

연산1 적용: 안녕하세요 반갑습니다

변환된연산2: 4

...

```

잔여 이슈 & 다음 단계

현재 완료됨

  • ✓ 9개 핵심 함수 구현
  • ✓ 4가지 충돌 시나리오 처리
  • ✓ 셀코어 규칙 통합
  • ✓ 컴파일 검증 (47,623 큐브)
  • ✓ 테스트 코드 포함

다음 단계 (Wave 6-B 진행)

  1. 네트워크 통합: 자동변환된 연산을 WebSocket으로 클라이언트에 브로드캐스트
  2. 충돌 메트릭: 충돌률 추적 + 병합전략 동적 선택
  3. 서버 구현: 위치관리형(state-based) OT 엔진 (현재는 변환형)
  4. GUI 통합: 크라우니브라우저 협업 에디터 연동
  5. 성능 최적화: 연산 압축 + 인덱싱 (100+ 동시 사용자 대응)

관련 프로젝트

  • Wave 6-B: 실시간 동시편집 (현재 태스크)
  • project_crowny_fullstack.md: 풀스택 6서버 (현황)
  • project_crowny_browser_complete.md: 브라우저 협업 에디터 베이스
  • project_crownycode_gigafactory.md: 다국어 색인 (OT 연산 의미어화)

핵심 성과: 순수 한선씨로 OT 알고리즘 완전 구현. 외부 라이브러리 의존 제로. 셀코어 규칙으로 세션/편집자/충돌 관리 자동화.