Written by hackerwins on May 10, 2020
안녕하세요. 코로나 19로 재택근무 하는 회사가 많아 졌습니다. 그러면서 '실시간 협업 애플리케이션'도 주목 받고 있는 것 같습니다. 여기서 말하는 '실시간 협업 애플리케이션'들은 Google Docs, Notion, Trello와 같은 서비스를 말합니다. 아래 트윗에서 Tier 1에 해당합니다. Yorkie는 Tier 3, Tier 2에 해당하는 애플리케이션을 Tier 1으로 바꾸거나 Tier 1 애플리케이션을 쉽게 개발할 있도록 돕는 역할을 합니다.
https://twitter.com/lqez/status/1205407601757843456
이 글은 실시간 협업 애플리케이션을 쉽게 구현할 수 있는 문서 저장소(Document Store), Yorkie를 소개합니다. Yorkie에 대해서 간단히 알아보고 이어서 Yorkie를 어떻게 활용할 수 있는지도 알아보겠습니다.
Yorkie는 '실시간 협업 애플리케이션'을 개발하기 위한 오픈소스 문서 저장소입니다. 그리고 Document, Client, Agent(서버)로 구성되어 있습니다.
+--Client "A" (Go)----+
| +--Document "D-1"-+ | +--Agent------------------+
| | { a: 1, b: {} } | <-- Changes --> | +--Collection "C-1"---+ |
| +-----------------+ | | | +--Document "D-1"-+ | | +--Mongo DB--+
+---------------------+ | | | { a: 1, b: {} } | | | | Changes |
| | +-----------------+ | | <-> | Snapshot |
+--Client "B" (JS)----+ | | +--Document "D-2"-+ | | +------------+
| +--Document "D-1"-+ | | | | { a: 1, b: {} } | | |
| | { a: 2, b: {} } | <-- Changes --> | | +-----------------+ | |
| +-----------------+ | | +---------------------+ |
+---------------------+ +-------------------------+
^
+--Client "C" (JS)------+ |
| +--Query "Q-1"------+ | |
| | db.['C-1'].find() | <-- MongoDB query ---------+
| +-------------------+ |
+-----------------------+
다른 Document DB들이 각 환경 별로 드라이버를 제공하는 것처럼 Yorkie도 각 환경 별 SDK를 제공합니다. 이어서 yorkie-js-sdk를 기준으로 계속 설명 드릴께요. 아래 코드는 JS 환경에서 Document를 생성하는 방법입니다.
import yorkie from 'yorkie-js-sdk';
// 새로운 Document 생성(collection, document)
const doc = yorkie.createDocument('todos', '2005010')
다른 Document DB와 Yorkie의 주요한 차이점은 변경 사항 반영을 기다리는 방식입니다. 일반적인 애플리케이션에서 Document DB를 사용할 때 Client는 변경 사항이 DB 서버에 반영될 때까지 기다립니다. 하지만 Yorkie에서 각 Client는 독립적인 로컬 Document를 갖고 있고 로컬 Document에만 변경 사항을 반영합니다.
// 로컬 Document에 변경사항 반영
doc.update((root) => {
if (!root['tasks']) {
root.tasks = [];
}
root.tasks.push({'name': 'drink milk'});
});
다른 Document DB와 비교하면 Yorkie는 변경 사항을 반영하는 시간이 짧고 로컬 Document에 반영하니까 오프라인 상태에서도 애플리케이션이 동작 가능합니다.
Yorkie Client는 Agent와 연결을 맺고 로컬 Document에 변경 사항이 발생하면 Agent에 전달합니다.
// Client 생성한 뒤 활성화(Yorkie Agent 주소)
const client = yorkie.createClient('<https://yorkie.dev/api>');
await client.activate();
// Client에 Document 붙이기
// 이 시점부터 로컬 Document의 변경사항이 원격지의 Document와 동기화됨
await client.attach(doc);
다른 원격 Client의 Document에서 발생된 변경 사항은 현재 Client에 Attach 되어 있는 로컬 Document에 자동으로 반영됩니다.