공통편집은 여러 클라이언트에서 보낸 메세지의 '변경분'을 머지하는 알고리즘이 있음. 이 알고리즘 중 대표적인게 OT, CRDT다.
https://conclave-team.github.io/conclave-site/ 이곳에 OT와 CRDT설명이 자세히 써있음
OT
OT엔진을 구현한 것중 하나가 ChangeSet이고, 우리는 이 ChangeSet을 사용한 EtherPad 에디터를 쓰고있었다. 문제는 표기능이 없고, 커스터마이징하기가 굉장히 어렵고, 버전이 한참 뒤쳐졌지만 커스터마이징 한 것 때문에 버전을 올릴수도 없는 처지라 다시 개발하려고 했던것.
네이버오피스 개발자 홍영택님 협업도구 개발 review (2013년..비록 오래되었지만)을 보면
https://deview.kr/2013/detail.nhn?topicSeq=4
이분이 OT엔진을 통해 공동편집툴을 만드는 과정을 소개해주심
CRDT (Conflict-free replicated data type)
OT보다 후에 나온 알고리즘인데, 이 CRDT를 구현해놓은 대표 소스가 yjs(https://github.com/yjs)이다.
OT보다 메모리는 많이 쓰지만 데이터의 일관성을 보장한다.
yjs는 절대 conflict가 날 수 없는 구조임.
또한 yjs에서 quill, prosemirror, atlaskit을 붙혀놓은 demo를 제공하고 있어서 이를 확인해보기로 했다.
에디터 선정시 중요하게 생각했던 것은 다음과 같다.
특히 표기능은 현재 VOC가 매우매우 많이 들어와서 꼭 필요함
y-quill | y-prosemirror | y-atlaskit | |
---|---|---|---|
특징 | 제일보편화 delta라는 변경분 객체를 가짐(yjs와 비슷) | 가벼움 | prosemirror를 감싸서 만듬 무거움 |
문제 | 표 plugin이 공동편집 error 서로 완전 이상하게 동작 | ie에서 한글 error 표생성 시 커서 문제 | ie에서 한글 error |
표 | quill-table | prosemirror-tables | 기본탑재 |
속도 in ie (1000줄을 붙혀놓고 다른편집기에서 5글자추가) | 지연없음 | 12초 | |
속도 in ie (2000줄) | 지연없음 | 브라우저 죽음 |
그래서 우리는 (1) yjs와 붙혀놓은 에디터가 있고, (2) table plugin이 공동편집에서 어느정도 제대로 동작하고(비록 몇몇 오류는 수정해야 하지만), (3)속도가 비교적 빠른 y-prosemirror를 '일단'활용해 개발해보기로 했다.