Tiptap vs @uiw/react-md-editor — 2026 최적 방식과 HTML 통일 타당성을 현 레포 + beta 실데이터로 검증
현 레포 admin/src 전수 grep 결과. Tiptap 12곳, MDEditor(RichTextEditor 래퍼) 4곳. 핵심 도메인이 겹친다.
| 도메인 | Tiptap (HTML, WYSIWYG) | MDEditor (markdown raw) | 상태 |
|---|---|---|---|
| 이메일 서명 | InlineSignatureEditor, EmailSignatureManagement | SignatureEditorModal | 중복 |
| 이메일 템플릿 | EmailTemplateCreateForm | EmailTemplateForm | 중복 |
| 시퀀스 단계 | EmailEditorPanel | SequenceStepForm, SequenceLaunchModalStepEditor | 중복 |
| 답장/인박스 | NewEmailComposer, InlineReplyComposer, floating-reply-popup | — | Tiptap만 |
| 레이아웃·넛지·업데이트노트 | PiecesPanel, NudgeEmailTab, NudgeAutoConfigTab, UpdateNoteForm, BuilderStepEditor | — | Tiptap만 |
rich-text-editor.tsx의 MDEditor는 preview="edit" 모드 = markdown 소스 raw 편집기. 그런데 이 에디터가 쓰이는 서명·템플릿·시퀀스 필드엔 모두 HTML이 저장됨. 즉 사용자가 markdown 에디터에 HTML을 넣고 있고, 툴바·미리보기·배송 하이라이트가 전부 markdown을 가정해 어긋난다.
에디터가 직접 쓰는 "원본 작성" 테이블의 본문 컬럼을 HTML / markdown / plain 으로 분류 집계.
| 테이블.컬럼 (에디터) | 전체 | 포맷 분포 | HTML | MD | plain | text 파트 |
|---|---|---|---|---|---|---|
| email_templates.body_html MD에디터 | 151 | 148 | 0 | 3 | 150 | |
| email_signatures.signature_html MD에디터 | 309 | 250 | 1 | 4 | 252 | |
| sequence_steps.email_body_html MD에디터 | 4,784 | 595 | 0 | 0 | 1,048 | |
| email_reply_drafts.body_text 답장 | 2,882 | 0 | 0 | 2,878 | 2,878 |
"HTML로 통일"이 곧 "plain text 폐기"가 아니다. 에디터 입력은 HTML 단일이 맞지만, 발송 MIME의 text 파트는 반드시 유지해야 한다.
HTML-only 메일은 SpamAssassin의 MIME_HTML_ONLY 룰을 트리거 → +0.7 스팸 점수. 멀티파트로 보내되 text 파트가 placeholder가 아닌 실제 읽히는 변환본이어야 함. 스팸 필터는 HTML과 text 양쪽을 모두 분석하므로 둘의 내용 불일치도 감점 요인.
Email Markup Consortium 2025 보고서: HTML 이메일의 99.89%가 "Serious/Critical" 접근성 결함. 스크린리더 사용자, 저시력, plain-text 모드 수신자는 text 파트로 폴백한다. text 파트가 없으면 이들에게 빈 메일이 된다.
| 클라이언트 | HTML 렌더링 특성 | text 파트 역할 |
|---|---|---|
| Gmail (웹·앱) | media query 지원하나 접근성 기능 빈약, <style> 일부 제약 | 미리보기 스니펫·plain 모드 폴백 |
| Outlook (legacy Windows) | Word 렌더 엔진 — 20개 중 7개 기능만 지원, 레이아웃 깨짐 빈번 | 깨진 HTML 시 가독 폴백 |
| Apple Mail | media query 완벽 지원, 접근성 ~100% | plain 모드·스크린리더 폴백 |
세 클라이언트가 HTML을 제각각 해석하므로, text 파트는 "어디서든 읽히는" 최저 공통 보장선이다.
김치볶음밥 원칙: 더하기 전에 빼기. 제거는 안전하나 단순 삭제가 아니라 Tiptap으로 교체가 필요(4곳이 실사용 중).
components/ui/rich-text-editor.tsx — MDEditor 래퍼 본체 (제거 대상)components/SignatureEditorModal.tsx — 서명 편집 → Tiptap 교체pages/email-templates/EmailTemplateForm.tsx — 템플릿 → Tiptap 교체pages/sequences/SequenceStepForm.tsx — 시퀀스 단계 → Tiptap 교체pages/leads/SequenceLaunchModalStepEditor.tsx — 시퀀스 런치 모달 → Tiptap 교체tiptap-editor.tsx로 마이그레이션 → 그 다음 rich-text-editor.tsx + @uiw/react-md-editor 제거 순서.
deliverabilityHighlightTerms 오버레이 기능을 Tiptap Decoration(ProseMirror)으로 이식.insertTextAtCursor → Tiptap은 이미 VariableItem 확장으로 동일 기능 보유, 재사용.sanitizeEmailHtml()(email-renderer.ts) 단일 경로로 — markdown→HTML 중간 변환 레이어가 사라져 파이프라인 단순화.출처: Suped — multipart/alternative · SendCheckit — plain vs HTML 딜리버러빌리티 · Email Markup Consortium — Accessibility 2025 · Email Client Compatibility 2025