2026년 오픈 소스 Grammarly 대안들 — 그리고 내가 또 다른 도구를 만든 이유
요약
기존 Grammarly의 구독 모델과 개인정보 문제를 해결하기 위해, Google Gemini API의 무료 티어를 활용한 오픈 소스 문법 검사 도구 개발 과정을 다룹니다. 사용자의 API 키를 통해 브라우저에서 직접 통신함으로써 비용, 프라이버시, 언어 범용성을 모두 잡은 아키텍처를 제안합니다.
핵심 포인트
- 기존 오픈 소스 도구들의 규칙 기반 한계와 유료 모델 문제 지적
- Gemini API의 무료 티어를 활용한 비용 효율적 아키텍처 설계
- 중간 서버 없이 브라우저에서 API로 직접 통신하여 프라이버시 강화
- LLM 기반의 문맥 이해와 로컬 실행의 장점을 결합한 접근 방식
만약 "Grammarly 대안"을 검색한다면, 그저 구독료가 조금 더 저렴한 프리미엄 (freemium) 도구들로 가득 찬 리스트들을 보게 될 것입니다. 제가 실제로 원했던 것은 더 단순했습니다. 구독 없이, 그리고 내 텍스트가 회사의 서버를 거치지 않고, 브라우저의 모든 텍스트 필드에서 문법 검사를 하는 것이었습니다.
저는 먼저 오픈 소스(open-source) 옵션들을 살펴보았습니다. 솔직한 요약은 다음과 같습니다 — 그리고 그 후에 제가 결국 직접 만든 도구가 있는데, 이 또한 무료이며 오픈 소스입니다.
오픈 소스 현황, 솔직하게 말하자면
LanguageTool — 가장 성숙한 오픈 소스 문법 검사기입니다 (코어는 오픈 소스이며 Docker를 통해 셀프 호스팅 (self-hostable)이 가능합니다). 규칙 기반 (Rule-based) 방식이며, 40개 이상의 언어를 지원하고, 브라우저 확장 프로그램이 견고합니다. 문제는 대부분의 사람들이 설치하는 호스팅된 (hosted) 확장 프로그램이 프리미엄 규칙이 유료인 프리미엄 (freemium) 모델이라는 점이며, 규칙 기반 검사는 LLM (대규모 언어 모델)이 쉽게 잡아내는 것들 — 계속되는 문장 (run-on sentences), 절 간의 일치 (agreement across clauses), 어색한 문구 (awkward phrasing) — 등을 놓친다는 점입니다. 셀프 호스팅은 개인정보 보호 문제를 해결해주지만, Java 서버를 실행해야 함을 의미합니다.
Harper — Rust로 작성되어 WASM으로 컴파일되었으며, 완전히 로컬 (locally)에서 실행되는 현대적인 문법 엔진입니다. 진정으로 프라이빗하며 (기기 외부로 아무것도 나가지 않음) 빠릅니다. 트레이드오프 (trade-off)는 로컬 기반이자 규칙 기반이라는 점의 반대 급부입니다: 영어에 집중되어 있으며, LLM이 하는 것처럼 문장 전체가 _의미가 있는지_를 판단하지는 못합니다.
Vale — 엄밀히 말하면 Grammarly의 대안은 아닙니다; 이는 docs-as-code (CI에서 스타일 가이드를 강제하는 것)를 위한 스타일 린터 (style linter)입니다. 본연의 기능에는 뛰어나지만, 해결하려는 문제가 다릅니다.
따라서 시장은 두 진영으로 나뉩니다: 규칙 기반이며 프라이빗한 진영 (Harper, 셀프 호스팅 LanguageTool) 또는 LLM 기반으로 똑똑하지만 구독 및 서버 기반인 진영 (Grammarly, QuillBot). 저는 세 번째 사분면을 원했습니다: LLM 기반으로 똑똑하면서도, 프라이빗하고, 무료인 것.
세 번째 사분면을 가능하게 만드는 트릭
GemType의 이면에 숨겨진 통찰은 거의 부끄러울 정도로 단순합니다. Google의 Gemini API는 진정으로 사용 가능한 **무료 티어 (free tier)**를 제공하며, 최신 플래시급 모델 (flash-tier models)은 문법 교정 작업을 수행하기에 충분히 훌륭합니다. 따라서 사용자(user)와 모델(model) 사이에 유료 미들웨어 서버를 운영하는 대신, 이 확장 프로그램은 사용자 자신의 무료 API 키를 사용하여 브라우저에서 Google API로 직접 통신합니다.
이 단 하나의 아키텍처 결정은 사람들이 실제로 원하는 모든 요소로 이어집니다:
- 무료 (Free) — 사용자의 무료 티어 키가 일상적인 글쓰기를 충분히 커버합니다.
- 프라이빗 (Private) — 벤더 서버가 없습니다. 저는 그 누구의 텍스트나 키도 볼 수 없습니다.
- 감사 가능 (Auditable) — 백엔드가 없으므로 전체 데이터 경로가 확장 프로그램 소스 코드 내에 존재합니다.
- 모든 언어 (Any language) — 모델은 사용자가 작성하는 언어를 자동 감지하여 무엇이든 검사합니다.
실제로 구축하기 어려웠던 부분들
LLM 배관 작업 (plumbing)은 쉬운 10%에 불과합니다. 나머지 어려운 90%는 Grammarly의 엔지니어링을 흥미롭게 만드는 것과 동일한 문제입니다:
1. 페이지의 DOM을 건드리지 않고 밑줄 긋기. 만약 React/ProseMirror 에디터 내부의 플래그(flagged)된 단어들을 <span> 태그로 감싸게 되면, 에디터의 내부 상태(internal state)를 손상시킵니다 (Grammarly도 수년 전에 정확히 이 방식을 포기했습니다). GemType은 섀도우 루트 (shadow root) 내의 투명한 오버레이 (overlay) 위에 물결 모양의 밑줄을 그립니다. 리치 에디터 (rich editor)의 경우 Range.getClientRects()를 통해 위치를 잡고, 일반 <textarea>의 경우 숨겨진 미러 요소 (mirror element)를 사용합니다.
2. 오프셋 (offsets)이 아닌 스니펫 (snippets). LLM은 문자 오프셋 (character offsets)을 보고하는 데 있어 신뢰도가 낮습니다. 대신, Gemini는 _정확한 오류 스니펫 (erroneous snippet)_과 그 교정안이 포함된 구조화된 JSON (responseSchema)을 반환합니다. 클라이언트는 부분 문자열 검색 (substring search)을 통해 스니펫의 위치를 찾고, 사용자가 타이핑함에 따라 실시간으로 위치를 다시 고정 (re-anchor)합니다.
3. 실행 취소(Undo)가 안전한 수정. 교정 사항은 document.execCommand('insertText')를 통해 적용됩니다. 이는 네이티브 실행 취소 스택 (native undo stack)을 보존하고 실제 input 이벤트를 발생시키므로, 프레임워크가 해당 수정을 사용자의 편집으로 인식하게 합니다.
4. 문장 재검사 (Sentence re-checks). 수정 사항이 수락될 때마다 주변 문장이 자동으로 재검사됩니다 (문서 전체가 아닌 해당 문장으로 범위가 제한되어 토큰 효율적 (token-frugal)입니다). 단어 수준의 수정으로 인해 문장이 깨진 상태로 남는 것을 방지합니다.
5. 기억에 남을 버그: Reddit에서는 모든 것이 보이지 않게 잘 작동했습니다. Reddit은 알 수 없는 커스텀 엘리먼트(custom elements)를 숨기는 CSS(visibility:hidden)를 배포하는데, 이것이 제 오버레이 호스트(overlay host)를 무력화했습니다. 해결책: 모든 호스트 스타일을 !important와 함께 인라인(inline)으로 설정했습니다.
이 모든 것은 빌드 단계(build step)가 없는 순수 JavaScript (vanilla JavaScript)와 Manifest V3로 제작되었습니다. 만약 적대적인 에디터(hostile editors)와 공존해야 하는 확장 프로그램을 만들고 있다면, 이 소스 코드가 여러분의 시행착오를 줄여줄 수 있습니다: github.com/riponcm/GemType.
각 도구의 실제 적합한 용도
| 도구 | 엔진 (Engine) | 개인정보 보호 (Privacy) | 언어 | 비용 |
|---|---|---|---|---|
| LanguageTool (자체 호스팅) | 규칙 (Rules) | 로컬 (Local) | 40개 이상 | 무료 + 본인의 서버 |
| ... | ||||
| GemType의 솔직한 트레이드오프 (trade-offs): Google AI Studio에서 두 번의 클릭만으로 무료 API 키를 받을 수 있지만 (카드 불필요), 인터넷 연결이 필요하며, Google Docs는 지원되지 않습니다 (Google Docs는 캔버스(canvas)로 렌더링하며 주석 API(annotation API)를 화이트리스트에 등록된 벤더에게만 제한하기 때문입니다 — 이는 오직 Grammarly 급의 기업들만 접근할 수 있는 영역입니다). |
체험하기
- 웹사이트 / 라이브 데모: gemtype.matily.org
- Chrome: Chrome Web Store
- Edge: Edge Add-ons
- Firefox: Firefox Add-ons
- 소스 코드 (Apache-2.0): github.com/riponcm/GemType
- 2분 튜토리얼:
오직 오픈 소스 도구만이 제공할 수 있는 한 가지가 더 있습니다. 저의 개인정보 보호 주장을 그대로 믿지 마세요. 저장소(repo)를 ChatGPT/Claude/Gemini에 붙여넣고, 당신의 텍스트와 키(key)가 어디로 전송되는지 감사(audit)해 달라고 요청하십시오. 답변은 "generativelanguage.googleapis.com이며 그 외의 곳으로는 전송되지 않습니다"라고 나와야 합니다.
이 프로젝트는 제 스튜디오인 Matily에서 진행하는 개인 프로젝트입니다. 이슈(Issues)와 풀 리퀘스트(PRs)를 환영합니다. 특히 에디터 호환성(editor-compatibility) 보고는 매우 귀중한 정보가 됩니다. 그리고 만약 이 도구가 유용하다면, GitHub 스타(star)를 눌러주는 것이 사람들이 이 도구를 찾는 데 진심으로 큰 도움이 됩니다.
공지: 저는 GemType의 저자입니다. 이 프로젝트는 독립적인 프로젝트이며 Grammarly, QuillBot, LanguageTool 또는 Google과 제휴하거나 그들로부터 승인받지 않았습니다. "Grammarly"는 Grammarly, Inc.의 상표입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기