<aside> 📋 CRDT 시리즈

  1. CRDT... 널 알고 싶어 - (1)
  2. CRDT. 너 왜비나랑 만나볼래? - (2)
  3. CRDT를 납작하게 만들어줘요. - (3)
  4. CRDT를 블럭 여러개에 적용해봐요. - (4)
  5. CRDT야 이것좀 붙여넣게 해줘 - (5)
  6. CRDT 블럭아 포커스 좀 잡아줘 - (6) </aside>


문제 상황

노드 안에 다음 노드가 들어있는 구조였던 초기 버전의 head를 그대로 저장했더니 MongoDB의 최대 depth를 초과하는 문제가 있었어요.

MongoDB supports no more than 100 levels of nesting for BSON documents. Each object or array adds a level.

하나의 블럭 안에 100글자 이상을 작성할 수 없었죠.

출처: 원희님

출처: 원희님

해결 방법

그래서 링크드리스트의 노드들을 펼쳤어요.

class Identifier {
  clock: number;
  client: number;
}

class Node {
  id: Identifier;
  value: string;
  next: Identifier | null;
  prev: Identifier | null;
}

class LinkedList {
  head?: **Identifier**;
	nodeMap: {
		JSON.stringify(Identifier): Node
	};
}

변경 이후 CRDT 링크드리스트는 head를 나타내는 Identifier와, 노드 정보를 가진 nodeMap을 가지고 있어요.

DB에는 이렇게 저장돼요.