저는 네이버 부스트캠프 9기 그룹프로젝트를 진행하며 프로젝트 실시간 동시편집 에디터 Nocta를 개발했습니다.
이 과정에서 CRDT라이브러리 구현을 담당했습니다.
몇가지 부족한 기능들이 있지만, y.js라는 라이브러리와 비교했을 때 어떤점이 다른지, 부족한 점은 뭔지 알기 위해 비교를 해봤습니다.
참고 : https://www.tag1consulting.com/yjs-podcasts-blogs-conference-presentations-more

Y.js 는 P2P기반의 동시편집 라이브러리 입니다.
CRDT로 동작하며 많은 동시편집 실시간 제어 기능들을 제공하고 있습니다.
기본적으로 y.js와 noctaCRDT가 동작하는 방식은 유사합니다.
{
id
left
right
deleted
content
}
id : (numeric한 client 값, logical clock) 예 - (0,1)
left : object의 id
right : object의 id
deleted : 삭제 처리 tombstone 플래그
content : 글자 내용
noctaCRDT역시 Node로 class를 만들어서 id를 보이는 양방향 링크드 리스트형태를 만듭니다.
TombStone 처리Node 클래스가 아닌 Object 객체로 관리{
(0,1), // id
(0,2), // left
(0,3), // right
false, // deleted
"abcdefgabcdefgabcdefgabcdefgabcdefgabcdefg..." // 3000자
}하지만 정수를 4비트로 표현하는 이진 인코딩을 대신 사용하면 코벡터 정수를 훨씬 더 효율적으로 인코딩할 수 있습니다.
예를 들어 Yjs에서는 가변 길이 인코딩 덕분에 정수를 3비트로만 표현할 수 있는 경우가 많습니다.
JSON에서 이를 수행하면 모든 정수가 문자열로 변환되므로 유일한 복잡한 요소는 길이입니다. 즉, 단일 숫자가 단 5바이트로 표현될 수 있습니다.
offSet 개념으로 currentCaret =2등으로 사용됨.
물론 짧은기간 내에 Y.js와 동일하게 동작할 만큼 완벽한 라이브러리를 구현할 수는 없겠지만, 기본적인 동작과 메모리상 효율적인 부분은 차용해서 반영할 수 있을 듯 합니다.
특히나
등등 좋은 이론과 방법을 배울 수 있었습니다.
그래서 저희들은
1. TombStone 적용을 통한 멱등성 적용
2. Caret의 문자Id추적화를 통한 동일블럭 캐럿 이동 현상 해결
을 중점으로 수정을 이어나갈 예정입니다.
또한 socket 통신 과정중에서 개선이 필요하다고 여겨질 경우
JSON 이진화 및 병합 인코딩 과정을 통해 개선할 수 있겠구나!
등의 정보를 알게 되었습니다.