obsidian - implementation
contents
Obsidian은 로컬 우선 저장소와 일반 텍스트 충실도라는 철학을 중심으로 구현된 지식 관리 애플리케이션입니다. 표준 웹 기술을 사용하여 구축된 후, 네이티브 애플리케이션 컨테이너에 감싸여(wrapped) 고도로 사용자 정의 가능한 데스크톱 애플리케이션으로 작동합니다.
다음은 Obsidian의 기반 구현과 핵심 구성 요소에 대한 매우 자세한 분석입니다.
1. 기술 스택 (The Foundation) 💻
Obsidian의 크로스 플랫폼 특성과 빠른 개발 속도는 주요 기술 선택 덕분에 가능했습니다.
- 래퍼 (Electron): Obsidian은 기본적으로 Electron 애플리케이션입니다. Electron은 웹 기술(HTML, CSS, JavaScript)을 사용하여 (Windows, macOS, Linux용) 크로스 플랫폼 데스크톱 애플리케이션을 구축할 수 있게 해줍니다.
- 역할: Electron은 네이티브 창 프레임을 제공하고, 파일 시스템 접근 권한을 처리하며, 시스템 알림을 관리하고, 운영체제별 세부 사항을 추상화합니다.
- 프런트엔드 (HTML, CSS, TypeScript): 패널, 설정 메뉴, 편집기를 포함한 전체 사용자 인터페이스는 표준 웹 기술을 사용하여 렌더링됩니다. Obsidian은 견고한 코드 관리를 위해 TypeScript를 사용합니다.
- 데이터 형식 (마크다운): 모든 핵심 노트는 사람이 읽기 쉬운 간단한
.md파일로 저장됩니다. 이는 단순한 파일 형식을 넘어 상호 운용성과 미래 대비를 강제하는 핵심 아키텍처 제약 조건입니다. - 백엔드 (최소화): 사용자의 데이터 저장이나 처리를 위한 외부 백엔드 서버는 거의 없으며, 옵션 기능인 동기화(Obsidian Sync)와 같은 서비스만 예외적으로 외부 서버를 사용합니다.
2. 파일 시스템을 데이터베이스로 사용 (데이터 모델) 📂
Obsidian의 구현은 독점적인 데이터베이스를 사용하는 일반적인 소프트웨어 추세를 거부한다는 점에서 독특합니다.
- 볼트 (Vault): Obsidian의 "볼트"는 사용자의 하드 드라이브에 있는 로컬 폴더에 불과합니다.
- 콘텐츠 저장: 노트는 개별
.md파일로 저장됩니다. 이것이 바로 로컬 우선(local-first) 접근 방식입니다. - 메타데이터 관리 (파일 시스템 기반 NoSQL): Obsidian은 창 레이아웃, 플러그인 설정, 파일 상태와 같은 메타데이터를 추적해야 합니다. 이러한 콘텐츠 외의 데이터는 볼트 내의 숨겨진
.obsidian/폴더에 주로 일반 텍스트 또는 JSON 설정 파일 형태로 저장됩니다. 콘텐츠 자체를 인덱싱하기 위해 무거운 관계형 데이터베이스(SQLite, MySQL 등)는 사용되지 않습니다. - 장기 지속성 및 이식성: 이러한 설계는 최대의 장기 지속성을 보장합니다. Obsidian이 사라지더라도, 사용자의 지식 베이스는 간단하게 검색 가능한 일반 마크다운 파일 폴더로 남아 있습니다.
3. 핵심 기능 구현 세부 사항 ⚙️
Obsidian의 정교한 기능들은 파서 및 편집기에 대한 특정한 구현을 필요로 합니다.
A. 편집 엔진 (CodeMirror 6)
대화형 텍스트 편집기는 현대적이고 고성능이며 모듈화된 웹 코드 편집기 프레임워크인 CodeMirror 6 (CM6) 위에 구축됩니다.
- 라이브 프리뷰 / 소스 모드: CM6는 원활한 "라이브 프리뷰" 기능을 가능하게 합니다. 텍스트 버퍼(소스)와 계산된 표시 요소(렌더링된 출력)를 결합하여 사용자가 같은 뷰 내에서 원시 소스 텍스트를 직접 편집하는 동안 마크다운(굵게, 제목 등)을 실시간으로 렌더링합니다. 이 모든 것은 커서 동기화가 두 영역 사이에서 완벽하게 작동하도록 보장함으로써 달성됩니다.
B. 사용자 정의 구문 및 파싱
표준 마크다운은 [링크 텍스트](url)와 같은 링크만 지원합니다. Obsidian은 고유한 구문을 위해 맞춤형 구현이 필요합니다.
- 위키링크 (
[[링크]]): Obsidian 파서는 이중 대괄호를 특별히 찾습니다. 노트를 렌더링할 때,[[다른 노트]]를 "Another Note.md"라는 파일을 위해 로컬 볼트 파일 시스템을 검색하고 내부 링크를 생성함으로써 해결합니다. - 임베드 (
![[포함]]): 파서는!접두사를 인식하고, 링크된 파일의 내용을 현재 노트에 직접 렌더링합니다. 이는 임베드된 파일의 콘텐츠에 대해 마크다운 렌더러를 재귀적으로 호출해야 합니다.
C. 그래프 뷰 (Graph View)
지식 네트워크를 보여주는 강력한 그래프 뷰는 볼트 전체를 스캔하여 실행되는 특정 내부 서비스에 의해 동적으로 생성됩니다.
- 생성: 이 서비스는 볼트 내의 모든 파일을 빠르게 스캔하며,
[[링크 대상]]만을 찾습니다. 각 파일을 노드로, 인식된 모든 위키링크를 방향 간선으로 모델링합니다. - 렌더링: 결과로 생성된 노드-간선 모델은 Electron 창 내에서 고도로 최적화된 그래프 시각화 라이브러리(D3.js 또는 WebGL 기반)를 사용하여 렌더링되므로 유연한 확대 및 조작이 가능합니다.
4. 확장성 (플러그인 API) 🔌
Obsidian의 생태계는 가장 큰 자산입니다. 플러그인 시스템은 기본적인 자바스크립트/Electron 환경을 활용하도록 설계되었습니다.
- 자바스크립트로서의 플러그인: 커뮤니티 플러그인은 볼트가 열릴 때 메인 애플리케이션에 의해 동적으로 로드되는 TypeScript/JavaScript 코드 번들입니다.
- API 계층: Obsidian은 플러그인이 보호된 환경과 상호작용할 수 있도록 핵심 자바스크립트 API(
obsidian모듈) 세트를 노출합니다.- 파일 시스템 접근: 플러그인은 Electron/OS가 부여한 권한을 사용하여 볼트 내의 파일을 읽고, 쓰고, 생성하고, 삭제할 수 있습니다.
- UI 조작: 플러그인은 사용자 정의 명령어를 등록하고, 리본 메뉴에 새 아이콘을 추가하며, 메인 창에 사용자 정의 패널(뷰)을 첨부할 수 있습니다.
- 편집기 후킹(Hooking): 플러그인은 CM6 편집기 인스턴스 내에서 키 입력 및 텍스트 변경을 가로채 입력을 수정할 수 있습니다(예: 자동으로 표 형식을 지정하거나 메타데이터를 삽입).
이러한 모듈식 접근 방식은 핵심 애플리케이션이 안정적으로 유지되는 동시에, 커뮤니티가 (칸반 보드, 고급 캘린더 통합, 맞춤형 LaTeX 렌더링과 같은) 고도로 전문화된 영역으로 기능을 확장할 수 있도록 보장합니다.
references