> OSSCA Yorkie TIL(5) - 20분 만에 동시편집 Quill 에디터 구현하기
Crescent
Table of Contents
0. 서론
Quill
에는 글자 스타일, 사진 넣기와 같은 기능이 있지만,
영상 속 CodeMirror
에디터 처럼 텍스트 입력 기능만 진행하고자 합니다.
01. Quill 에디터 만들기
Quill
- 디렉토리에
index.html
만들기
- https://quilljs.com/docs/download/ 들어가서
quill.js
, quill.snow.css
코드 복사
<div>
를 <body>
에 추가
main.js
만들어 Quill
에디터와 연결
index.html
파일을 브라우저에 실행시키면(파일을 브라우저에 드래그 해도 됩니다.)
- 잘 나온다!!
02. Yorkie Client, Document 생성
Yorkie JS SDK
받고 서버 실행
compose
를 이용해 Docker
를 띄움(Docker
가 설치되어야 합니다.)
- 문제가 생긴다면
docker container prune
를 통해 중지된 컨테이너를 전부 삭제해서 실행할 수 있습니다.
- Yorkie가
DB
도 사용하고 있고, grpc-web
을 써서 Envoy
같은 것들이 뜰 수 있다고 한다.
Yorkie CDN
추가
- Yorkie Client 생성, 활성화 & Yorkie Document 생성 & Text 생성
new yorkie.Client()
를 통해 클라이언트를 생성
new yorkie.Document(key)
를 생성, document
는 적당한 이름인 doc
- 짝 맞춰
async
와 await
을
- 이러면 Yorkie 쪽에 문서가 붙었기 때문에 클라이언트에 붙어서 만들어져야 한다.
RichText
데이터 타입을 만들어 Quill
의 변경사항들이 Yorkie
에 저장될 수 있도록 한다.
Quill
은 Rich Text data
content
: key, 없을 때만 만들어 준다
RichText
데이터 타입을 content
라는 키로 만든다
03. Quill와 Yorkie 서로 연동(바인드)
- Quill와 Yorkie Document사이에서 바인드(bind) 되어 서로 주고 받아줘야 함
- 서로 주고 받으려면
Handler
가 필요함
Handler
: 특정 유형의 데이터에 특화되어 있거나 특정 특수 작업에 초점을 맞춘 루틴/기능/태그
Document
: 응용프로그램의 모델이 표현되는 CRDT 기반 데이터 유형. 클라이언트는 오프라인 상태에서도 편집할 수 있다.
Quill to Yorkie / Yorkie to Quill
- Quill to Yorkie: Quill의 변경사항이 Yorkie쪽으로 전달되게 하는 부분
- Yorkie to Quill: Yorkie쪽 변경 사항을 Quill로 반영되게 하는 부분
> PHASE 1
Quill
쪽에서 Handler
를 추가한다.
CodeMirror
는 change
라면 Quill
은 delta.ops
delta.ops
를 console.log
로 찍어본다. JSON.stringfy()
는 보기 쉬우라고 한 것
Yorkie
쪽에서도 Handler
를 추가한다
doc.getRoot().content
에는 text
라는 항목이 존재
Text
쪽에서도 changes
를 받아 처리
Text
가 Yorkie Document쪽에 content
라는 이름이 있다.
changes
를 console.log
에 넣어 출력한다.
Handler
가 제대로 붙었는지 확인하려면 index.html
파일 열어서 편집을 했을 때 콘솔이 찍히는지 확인한다
- 콘솔에 잘 찍히면
Handler
가 제대로 달린 것이다!
> phase 2: Quill쪽부터 작업
- 변경 사항이 없거나
Yorkie
변경 사항과 Quill
변경 사항이 서로 핑퐁 될 수 있기 때문에 조건을 넣어야 한다.
source === 'yorkie' || !delta.ops
Quill
에서는 to
와 from
를 구해주는 것이 없기 때문에 직접 분기를 나누면서 진행해야 한다.
insert
/ delete
/ retain
Quill
에서는 들어오는 텍스드(op.insert
)가 string
으로 들어오기 때문에 그냥 집어넣으면 된다.
Yorkie Document
를 업데이트
> phase 3: Yorkie to Quill 핸들러 구현
main
함수 위에 추가해야 한다.
toDelta
: 바뀐 부분(change
)를 insert
와 attributes
로 고치는
toDeltaList
:
changes
가 배열로 오기 때문에 반복문을 만든다.
- 반복문을 돌면서
to
를 체크해야 하고, 내용과 변화를 설명하는 데이터인 delta
를 배열로 생성.
- 사실 텍스트 입력만 다루는 상황에서는
attributes
가 undefined
이긴 하다.
- 자신의 편집을 반영할 필요는 없으니 본인을 필터하고 컨텐츠 변경이 아닌 경우 필터링한다
Quill
에서는 content.type
가 다양하게 있으나, content.type === 'content'
일 때(텍스트 편집)만 다룬다.
- 변경사항을 나타내는
delta
가 비어있지 않은 경우 그 delta
를quill
에 집어넣는다.
quill.updatecontents()
사용
> phase 4: 새로고침을 했는데 반영이 안됩니다.
Document
를 delta list
로 바꿔주는 함수를 위에다가 추가한다.
Quill
에디터에 Yorkie Document
를 집어넣는다.
04. 전체 코드
05. 참고 문서