64P by xguru 11일전 | ★ favorite | 댓글 12개
  • 요즘 앱에 필수적인 리치 텍스트 에디터(WYSIWYG)는 Linear, Notion, Google Docs 같은 서비스에서 보편적으로 사용됨
  • Liveblocks가 지난 1년간 다양한 인기 에디터를 분석하고, 각 에디터의 장단점을 파악해 정리함
  • 에디터는 대체로 ‘코어형’과 ‘기능 포함형(Battery-included)’ 두 가지로 나뉨
  • 간단한 에디터 하나만 필요하다면 가벼운 옵션을, 복잡하고 협업 기능이 많은 에디터를 만들려면 확장성이 높은 것을 고려해야 함
  • 전반적으로 가장 무난한 선택은 Tiptap으로, 기능이 풍부하면서도 지나치게 관여적이지 않은 밸런스를 가지고 있다고 평가됨
  • 협업
    • 우리(Liveblocks)는 협업 기능에 집중해왔으며, 대부분의 에디터에서 Yjs라는 CRDT 라이브러리를 통해 실시간 협업을 구현 가능함
    • Yjs를 쓸 때 문서를 저장하고 실시간 연결을 유지해줄 백엔드 서비스가 필요함
    • Liveblocks는 Yjs 를 지원하는 여러 에디터에서 사용 가능한 제네럴 Yjs 백엔드를 제공하며, Tiptap·Lexical용 통합 솔루션도 제공함
    • 일부 에디터는 자체 OT(Operational Transform) 기반 솔루션이나 클로즈드 소스 클라우드 서비스를 사용하기도 함
  • 시작 전 주의사항
    • Draft.js처럼 유지보수가 종료된 에디터나, 작은 커뮤니티만 있는 에디터, 또는 프라이빗 소스 에디터(Froala 등)는 제외
    • 접근성(a11y)은 대부분 에디터에서 어느 정도 작업이 필요하며, 각 에디터 문서를 참고해야 함

Tiptap

  • ProseMirror 위에서 동작하는 에디터로, ProseMirror의 복잡함을 추상화해 개발 경험을 높임
  • 대부분 MIT 라이선스로 제공되며, Tiptap Cloud나 Liveblocks 등에서 실시간 협업 기능을 바로 이용 가능함
  • 기능이 많지만 트리 셰이킹 가능한 구조로 만들어져 있어, 코어 번들 크기는 Quill·Slate·Lexical보다 작게 유지 가능함
  • 확장
    • Tiptap은 간단한 노드, 마크, 커맨드, 확장 기능을 추가하기 쉽게 설계됨
    • 필요한 경우 기존 확장의 동작을 오버라이드해 원하는 대로 커스터마이징 가능함
    • 일부 “프로” 확장 기능은 유료 형태로 제공됨
  • 고급 사용자 정의
    • ProseMirror의 구조를 직접 다룰 필요가 생길 수 있음
    • 명령 체인(command chain) 등 Tiptap 고유의 추상화에 익숙해지는 데 시간이 조금 걸림
    • 데이터 모델은 스키마(schema) 기반이며, 대부분 자동 생성되지만 고급 기능 시 스키마를 직접 다룰 수도 있음
  • 한계(Drawbacks)
    • ProseMirror 문서와 Tiptap 문서를 번갈아 참조해야 해 가이드라인이 혼동될 수 있음
    • 접근성(a11y) 관련 내용이 구현자에게 많이 의존됨
    • 트랜잭션 시 문서 상태를 불필요하게 순회하면 성능 저하가 발생할 수 있음
  • 서버 사이드 변경
    • Tiptap 자체로 서버 측에서 문서 조작하는 것은 쉽지 않음
    • ProseMirror를 직접 활용해 처리하거나 JSON 문서를 직접 수정하는 방식을 고려해야 함
    • Liveblocks는 ProseMirror 문서 수정을 좀 더 쉽게 하는 라이브러리를 제공함
  • 실시간 협업
    • Tiptap은 Yjs로 실시간 협업 기능을 제공하는 확장을 갖춤
    • Tiptap Cloud, Liveblocks 등 여러 클라우드 솔루션과 연동 가능함
    • Liveblocks Text Editor는 실시간 협업 외에도 커서 표시, 코멘트, 멘션, 버전 이력 등 다양한 기능을 추가 제공함
  • 장점(Pros)
    • 우수한 문서화 지원
    • 뛰어난 실시간 협업 기능 제공
    • 프레임워크에 독립적이며 React 전용 패키지 제공
    • 높은 확장성
    • Liveblocks 또는 Tiptap Cloud와의 통합 가능
  • 단점(Cons)
    • 최적의 사용 방식을 따르지 않으면 성능이 저하될 가능성
    • 고급 기능 개발을 위해 ProseMirror 내부 구조 학습 필요
    • 기본적으로 서버 측 헤드리스 편집 기능이 부족

BlockNote

  • BlockNote는 Tiptap·ProseMirror를 확장한 블록 기반 에디터로, Notion 스타일 기능을 제공함
  • 대부분 React 위주로 개발되어 있어, 다른 프레임워크에서 UI 컴포넌트를 활용하기 어렵다는 특징이 있음
  • Slash 메뉴, 플로팅 툴바 등 필요한 기능이 이미 포함된 상태로 간편하게 사용 가능함
  • 한계
    • BlockNote 자체는 오픈소스이지만 docx·PDF 익스포터 등 일부 기능은 유료 구독이 필요함
  • 실시간 협업
    • Yjs·Liveblocks 기반의 협업 기능을 지원함
    • 곧 정식으로 Liveblocks 연동을 제공할 예정임
  • 장점
    • 안정성이 검증된 Tiptap과 ProseMirror 기반
    • Yjs와 Liveblocks를 활용한 실시간 협업 기능 제공
    • 블록 기반 편집 API 및 UI 컴포넌트 기본 제공
  • 단점
    • 주로 React 전용으로 설계됨
    • 기본적인 에디터들에 비해 번들 크기가 더 큼

Lexical

  • Facebook(Meta)에서 지원하는 에디터로 큰 관심을 받고 있음
  • Liveblocks에서 수개월 동안 코멘트·멘션·버전 이력·실시간 협업 등 확장을 개발한 결과, 아직 초기 단계라는 인상을 받음
  • 현재 1.0 미만 버전으로, 계속 빠르게 업데이트되고 있음
  • 한계
    • “순수 데코레이션(pure decorations)” 기능이 없어 커서 표시 같은 기능을 구현하기 위해 DOM 요소를 에디터 위에 별도로 올려야 함
    • 기본적인 Yjs 협업 지원이 아직은 엣지 케이스 처리에 취약함
    • 루트 노드 이름을 하드코딩해 문서 내 여러 에디터를 동시에 사용하기 어렵다는 이슈가 존재함
  • 실시간 협업
    • Liveblocks 패키지를 사용하지 않는 한, Lexical 협업 구현은 난이도가 높음
    • StickyNotes 예시 등에서 루트 노드를 여러 개 만들 때 각각 별도 문서·소켓 연결을 사용하는 방식으로 우회함
    • 빠른 개발 속도로 이슈가 꾸준히 해결되고 있음
  • Lexical 확장
    • Lexical은 노드 계층 구조를 통해 데이터를 관리함
    • 4가지 코어 노드 타입을 상속해 자체 노드를 만들 수 있음
    • React 전용 LexicalComposer와 @lexical/react 패키지를 통해 스피드를 높일 수 있음
    • 백엔드에서 DOM 없이 Lexical을 동작시키기 위해 @lexical/headless 패키지를 사용할 수 있음
  • 서버 사이드 변경
    • Lexical 문서를 서버에서 수정하는 것이 가능하며, Liveblocks는 이를 단순화하는 라이브러리를 제공함
  • 장점
    • Yjs를 활용한 실시간 협업 기능 지원
    • 프레임워크에 독립적이며 React 전용 패키지 제공
    • 댓글, 멘션, 버전 히스토리와 통합된 Liveblocks 지원
    • Meta의 지원을 받는 매우 활발한 개발 및 대규모 커뮤니티
  • 단점
    • Yjs 실시간 협업 기능은 엣지 케이스를 직접 처리하지 않으면 약간의 버그 발생 가능성
    • 순수 데코레이션 기능이 부족하며 고급 기능을 위해 DOM 우회 처리가 필요
    • Tiptap 및 Slate에 비해 코어 패키지의 크기가 더 큼

Slate

  • Discord, Grafana, Sanity.io, Slite 등에서 사용 중인 커스터마이징 가능한 에디터 프레임워크
  • Liveblocks는 자체 코멘트 컴포저에 기본값으로 Slate를 채택함
  • 데이터 구조가 단순하고, 전면 통제가 가능하며, React 외에도 범용적으로 활용 가능함
  • Slate 확장
    • 여러 가지 예시와 문서를 통해 Slate를 확장 가능함
    • 플러그인 에코시스템은 제한적이지만 직접 구현이 어려운 편은 아님
    • 보다 확장된 형태로 Plate라는 프로젝트가 존재함
  • 한계
    • Tiptap보다 조금 더 무거운 번들 크기를 가짐
    • 기본 내장 기능이 적어 직접 구현해야 할 부분이 생김
  • 실시간 협업
    • slate-yjs, @liveblocks/yjs 등을 이용해 Slate 문서의 실시간 협업 구현 가능함
  • 장점
    • 우수한 문서화 지원
    • Yjs를 활용한 실시간 협업 기능 지원
    • 프레임워크에 독립적이며 React 전용 패키지 제공
    • 높은 확장성
  • 단점
    • Tiptap에 비해 약간 더 큰 번들 크기
    • 기본 제공 기능 부족

Quill

  • Slack, LinkedIn, Figma, Zoom, Miro, Airtable 등에서 사용된 역사가 있는 에디터
  • 한동안 개발이 주춤했으나 2024년 4월 버전 2를 릴리스하며 TypeScript 재작성 등으로 다시 활발해진 상태임
  • Parchment라는 고유 문서 모델을 사용하며, 이는 ProseMirror 스키마와 유사한 개념임
  • 한계
    • Lexical처럼 순수 데코레이션 기능이 없어, 컬러 하이라이트나 협업 커서 같은 기능을 위해 별도 DOM 요소를 오버레이해야 함
    • Quill 2용 플러그인들이 아직 업데이트되지 않은 경우가 많음
    • 커뮤니티 활동이 다른 에디터에 비해 다소 적을 수 있음
  • 실시간 협업
    • Yjs와 y-quill을 결합해 실시간 협업 구현 가능함
    • 별도 백엔드는 Liveblocks 등 다양한 방식을 사용 가능함
  • 장점
    • 우수한 문서화 지원
    • 프레임워크에 독립적이며 React 전용 패키지 제공
    • Yjs를 활용한 실시간 협업 기능 지원
    • 간단한 델타 포맷 사용
  • 단점
    • 기본 제공 기능 부족 및 플러그인이 아직 Quill 2에 맞춰 업데이트되지 않음
    • 순수 데코레이션 기능 부족
    • 비교적 덜 활발한 개발 및 작은 커뮤니티
    • Tiptap 또는 Slate에 비해 두 배 큰 번들 크기

ProseMirror

  • Tiptap·Remirror·BlockNote 등 여러 에디터의 기반이 되는 핵심 프레임워크
  • 스키마, 상태(state), 뷰(view), 트랜스폼(transform) 등 명확한 구조로 안정적인 동작을 보장함
  • 아예 처음부터 직접 코어 라이브러리만으로 에디터를 구성하려면 코드량이 많아지는 편임
  • 한계
    • 간단한 에디터를 만드는 데도 코드가 상당히 필요하다는 점이 문서에 명시되어 있음
    • Tiptap, Remirror, BlockNote 같은 상위 레벨 래퍼를 활용하는 것을 권장함
    • 러닝 커브가 다소 높지만 문서와 커뮤니티가 잘 정비되어 있음
  • 장점
    • 활발한 커뮤니티와 함께 우수한 문서화 제공
    • Yjs를 활용한 실시간 협업 기능 지원
  • 단점
    • 기본 예제를 구현하기 위해 많은 코드가 필요
    • 기본 제공 기능 부족
    • 비교적 가파른 학습 곡선

Plate

  • Slate 기반으로, AI 기능이나 멘션, 코멘트 등 풍부한 플러그인을 제공하는 “배터리 포함형” 프로젝트
  • 필요한 기능만 골라서 사용할 수 있어 유연함
  • 유료 템플릿도 제공하며, React 전용으로 설계됨
  • 한계
    • 협업은 현재 Hocuspocus만 공식 지원하며, 다른 Yjs 백엔드(예: Liveblocks)와 연결하기 위한 구현이 필요함
    • React 전용이어서 다른 프레임워크와는 호환이 제한적일 수 있음
    • 기능이 많아 번들 크기가 커지는 경향이 있음
  • 장점
    • 다양한 플러그인 라이브러리 제공
    • 서버 측 편집 기능 지원
    • 빠른 시작을 돕는 템플릿 제공
  • 단점
    • React 전용으로 설계
    • 협업 기능이 Hocuspocus를 통해서만 사용 가능
    • 기본적인 에디터들에 비해 번들 크기가 더 큼

Remirror

  • ProseMirror 기반의 에디터로, Tiptap과 유사하지만 더 배터리가 포함된 접근을 지향함
  • 30개 이상의 플러그인, React 훅, 국제화(i18n), 접근성(a11y) 기능 등을 지원함
  • MIT 라이선스로 오픈소스이며, 협업 기능도 제공함
  • 한계
    • Tiptap보다 커뮤니티 규모가 작고 업데이트가 느릴 수 있음
    • React 전용 기능이 많아 다른 환경에서는 제약이 있을 수 있음
    • 번들 크기가 다소 큰 편임
  • 실시간 협업
    • Remirror는 YjsExtension을 통해 Yjs와 Liveblocks 협업을 지원함
  • 장점
    • 우수한 문서화 지원
    • 다양한 플러그인 라이브러리 제공
    • Yjs와 Liveblocks를 활용한 협업 기능 지원
  • 단점
    • React 전용으로 설계
    • 더 큰 번들 크기
    • 업데이트 빈도가 낮고 작은 커뮤니티

Editor.js

  • 블록 단위 편집을 지원하는 리치 텍스트 에디터로, 다양한 플러그인과 큰 커뮤니티를 보유함
  • 블록, 인라인, 튠(tune)으로 구성된 데이터 구조를 가짐
  • 프레임워크에 구애받지 않으며, 툴팁 등 여러 편의 기능이 내장됨
  • 한계
    • 실시간 협업 지원이 공식적으로 없고, 일부 시도된 PR이 있으나 유지보수 상태가 불확실함
    • 기본 패키지만으로도 용량이 큰 편임
  • 실시간 협업
    • 공식적으로 지원하지 않음
  • 장점
    • 다양한 기능을 가진 풍부한 플러그인 라이브러리 제공
    • 여러 CMS 및 백엔드 프레임워크와의 커뮤니티 기반 통합 지원
  • 단점
    • 더 큰 번들 크기
    • 실시간 협업 기능 부재

CKEditor

  • 20년 이상 역사를 가진 에디터로, 현재 버전(5)은 현대적 구조와 풍부한 기능을 제공함
  • Angular, React, Vue, Next 등 다양한 프레임워크를 지원함
  • GPL-2 라이선스로 배포되어, 특정 상황에서는 오픈소스를 요구하며, 상업적 용도로는 별도 라이선스 구입이 필요함
  • 한계
    • 플러그인 중 상당수가 유료이며, 협업 기능 역시 CKEditor의 클라우드 서비스만 사용 가능함
    • GPL-2 라이선스와 로드 기반 과금 체계가 많은 사용자에게 장애물이 될 수 있음
  • 실시간 협업
    • CKEditor의 독점 클라우드 서비스 외에 다른 협업 솔루션은 제공되지 않음
  • 장점
    • 기본적으로 매우 풍부한 기능 제공
    • 다양한 프레임워크와 호환
  • 단점
    • 협업 기능이 CKEditor의 클라우드 서비스에 종속적
    • GPL-2 라이선스가 일부 사용자에게 제약이 될 수 있음
    • 일부 기능은 사용량 기반 요금제로 제공됨

TinyMCE

  • CKEditor와 마찬가지로 20년 이상 역사를 가진 에디터로, GPL-2 라이선스를 따름
  • Angular, React, Vue 등 다양한 환경에서 사용 가능함
  • 로드 수 기반의 과금 방식을 가진 클라우드 협업 서비스가 존재함
  • 한계
    • 마크다운, 멘션, 코멘트, 고급 타이포그래피 등 주요 기능이 유료 플러그인으로 제공됨
    • 서버 측에서 문서를 조작하는 방법에 대한 문서가 부족함
  • 실시간 협업
    • TinyMCE의 독점 협업 솔루션 외에는 다른 방식이 공개되어 있지 않음
  • 장점
    • 기본적으로 매우 풍부한 기능 제공
    • 다양한 프레임워크와 호환
  • 단점
    • 협업 기능이 Tiny Cloud 서비스에 종속적
    • GPL-2 라이선스가 일부 사용자에게 제약이 될 수 있음
    • 일부 기능은 사용량 기반 요금제로 제공됨

에디터 비교 요약

  • ProseMirror

    • Framework: Vanilla
    • Collaboration: Yjs
    • Comments: 제공하지 않음 (예제 있음)
    • Mentions: Suggestion 플러그인 사용 가능
    • Server-side editing: Prosemirror-state 및 prosemirror-model로 Node.js에서 문서 수정 가능
    • License: MIT
    • GitHub Stars: ⭐ 7.8k
  • Tiptap

    • Framework: Vanilla, React, Vue, Svelte
    • Collaboration: Liveblocks, Tiptap Cloud, Yjs
    • Comments: Liveblocks와의 통합으로 설정 없이 가능, 커스텀 가능
    • Mentions: Liveblocks와의 통합으로 설정 없이 가능, 커스텀 가능
    • Server-side editing: ProseMirror 또는 Liveblocks' Node.js ProseMirror 패키지를 통해 가능
    • License: MIT
    • GitHub Stars: ⭐ 20k
  • Remirror

    • Framework: React
    • Collaboration: Yjs
    • Comments: 가능
    • Mentions: 가능
    • Server-side editing: ProseMirror 또는 Liveblocks' Node.js ProseMirror 패키지를 통해 가능
    • License: MIT
    • GitHub Stars: ⭐ 2.8k
  • BlockNote

    • Framework: React
    • Collaboration: Yjs
    • Comments: Liveblocks 또는 커스텀 예제를 통해 가능
    • Mentions: 가능
    • Server-side editing: ProseMirror 또는 Liveblocks' Node.js ProseMirror 패키지를 통해 가능
    • License: MPL 2
    • GitHub Stars: ⭐ 7.1k
  • Lexical

    • Framework: Vanilla, React, iOS, 기타
    • Collaboration: Liveblocks, Yjs
    • Comments: Liveblocks와 통합하여 설정 없이 가능, 커스텀 가능
    • Mentions: Liveblocks와 통합하여 설정 없이 가능, 커스텀 가능
    • Server-side editing: Lexical 또는 Liveblocks' Node.js Lexical 패키지를 통해 가능
    • License: MIT
    • GitHub Stars: ⭐ 20k
  • Slate

    • Framework: Vanilla, React
    • Collaboration: Yjs
    • Comments: 제공하지 않음 (예제 있음)
    • Mentions: 예제 있음
    • Server-side editing: 제공하지 않음
    • License: MIT
    • GitHub Stars: ⭐ 30k
  • Plate

    • Framework: React 전용
    • Collaboration: Hocuspocus (Yjs)
    • Comments: 가능
    • Mentions: 가능
    • Server-side editing: 가능
    • License: MIT
    • GitHub Stars: ⭐ 13k
  • Quill

    • Framework: Vanilla
    • Collaboration: Yjs
    • Comments: 제공하지 않음 (예제 있음)
    • Mentions: 서드파티 라이브러리 사용 가능
    • Server-side editing: 제공하지 않음
    • License: BSD-3
    • GitHub Stars: ⭐ 45k
  • Editor.js

    • Framework: Vanilla
    • Collaboration: 지원하지 않음 (서드파티 예제 있음)
    • Comments: 제공하지 않음 (서드파티 라이브러리 있음)
    • Mentions: 제공하지 않음 (예제 있음)
    • Server-side editing: 제공하지 않음
    • License: Apache 2
    • GitHub Stars: ⭐ 28k
  • CKEditor

    • Framework: Vanilla, React, Vue, Angular
    • Collaboration: CKEditor Cloud와 통합
    • Comments: 가능
    • Mentions: 가능
    • Server-side editing: 가능
    • License: GPL-2+
    • GitHub Stars: ⭐ 8.8k
  • TinyMCE

    • Framework: Vanilla, React, Vue, Angular, 기타
    • Collaboration: Tiny Cloud와 통합
    • Comments: Tiny Cloud와 통합
    • Mentions: 가능
    • Server-side editing: 제공하지 않음
    • License: GPL-2+
    • GitHub Stars: ⭐ 15k

react custom component 개발이 편한 tiptap 이 가장 낫더군요.

저도 최근 찾아봤었는데 잘정리해주셔서 감사합니다.

우리 한글의 경우 특정에디터들은 모바일에서 입력 잔버그가 있습니다.
<동해물과> 입력시 <ㄷㅗㅇㅎㅐㅁㅜㄹㄱㅗㅏ> 로 입력되거나
<동해물과> 입력시 <동동해해물물과과> 로 입력됩니다.
(참고 : https://github.com/ckeditor/ckeditor5/issues/13693)

저는 react, vue 등 framework 를 쓰지 않고 있고 에디터 라이센스 구매가 꺼려지다보니 선택의 여지가 매우 좁았습니다.

이에 본문 외 아래 4가지를 더 살펴보았어요.

https://trix-editor.org/
루비온레일즈의 DHH 가 이끄는 37시그널에서 만든 에디터에요. 순수 자바스크립트 (리액트 등을 쓰지 않았다는 의미)로 만들어져있고 커스텀하기도 어렵진 않았어요. (유튜브링크 붙여넣을시에 유튜브임베드로 자동전환 등)

https://ui.toast.com/tui-editor
nhncloud에서 만든 툴이에요.

https://naver.github.io/smarteditor2/demo/
네이버스마트에디터2이에요. 클래식하지만 한국인대상서비스에서는 사랑받는 익숙함이될것같았어요.

https://summernote.org/
한국인이 개발하고 계시는 서머노트입니다. 저는 이걸 선택했습니다. 테마적용하면 세련되어지구요. 한국인이 생각하는 기능들이 빌트인이라 편합니다. (위 유튜브링크 임베드전환 등) 다만 tailwind prose 로 꾸미려는데 자체 typography 스타일이 있어서 손을 좀 썼어야해요.

2번 도구는 정정해드리고 싶은게 있는데, tui editor 는 토스가 아닌 nhncloud 에서 오픈소스로 개발하고 있는 프로젝트입니다.

그렇네요 정정합니다 (수정이 어딨는지모르겠네요..)

nhncloud 로 수정했습니다.

원래 이 사이트에 수정은 없습니다. 관리자가 수정하는 수밖에 없어요.

저는 tiptap을 처음 프로젝트에 적용해서 써봤는데, 다른 전통적인 에디터들 대비 문서화도 기능도 구현도 모두 좋았어서 만족하면서 사용하고 있습니다. 필요한 것만 딱딱 가져와서 제 입맛대로 UI를 구현해서 쓰는 맛이 좋았는데, 한가지 좀 벅찬 부분은 그 입맛대로 구현하는 작업량이 보통이 아니었습니다 ㅎㄷㄷ...!

여기엔 없지만, 워드프레스 구텐베르크가 독립된 라이브러리로 나왔으면 하는 바람이 있습니다.

https://github.com/Automattic/isolated-block-editor
나와있긴하지만 본문에 소개된 것들에 비하면 활용 사례가 현저히 떨어지긴합니다

오! Automattic 사에서 다른 이름으로 보관하고 있었군요. 회사에서 워드프레스를 쓸 당시 가장 좋아했던 기능입니다.

링크는 liveblocks.io 블로그인데 preview url은 (github.com/US-Artificial-Intelligence)라고 뜨네요?

제가 글 등록하면서 이전글 주소를 그대로 쓰고 수정하면서 문제가 있었습니다. 수정했습니다.