노션(Notion) 오프라인 모드, 어떻게 가능했을까?
노션(Notion)은 오프라인 모드를 위해 SQLite 기반의 캐싱(Caching)을 개선하여 지속적인 스토리지 계층(Persistent Storage Layer)을 구축함
오프라인 페이지 트리(Offline Page Trees)를 활용하여 페이지의 오프라인 상태를 추적하고, 여러 이유로 오프라인 상태가 유지되도록 설계함
푸시 기반 업데이트(Push-based Updates)를 통해 변경 사항을 동기화하여, 최신 버전 유지(Keeping up-to-date)를 위한 효율적인 메커니즘을 구현함
댓글에서는 동시 편집(Concurrent Editing) 시의 충돌 해결 방식에 대한 궁금증과 오프라인 협업 도구 구현의 기술적 난이도에 대한 감탄이 나옴
오프라인 페이지 트리(Offline Page Trees) 설계
노션(Notion)은 오프라인 모드를 위해 오프라인 페이지 트리(Offline Page Trees)라는 독특한 데이터 모델을 사용한다. 이 트리는 각 페이지가 오프라인 상태로 유지되는 여러 이유를 추적하며, 페이지 계층 구조를 관리하여 데이터 일관성을 유지한다. 특히, `offline_page` 및 `offline_action` 테이블을 활용하여 페이지의 오프라인 상태를 정확하게 관리하고, 페이지 이동, 데이터베이스 변경 등에도 유연하게 대응한다. 이는 데이터 격리 아키텍처(Data Isolation Architecture)를 통해 오프라인 환경에서도 안정적인 사용자 경험을 제공하기 위한 핵심 설계이다.
푸시 기반 업데이트(Push-based Updates)를 통한 동기화
노션(Notion)은 푸시 기반 업데이트(Push-based Updates) 방식을 사용하여 오프라인 페이지를 최신 상태로 유지한다. 서버에서 페이지 업데이트가 발생하면 해당 페이지에 대한 채널에 메시지를 전송하고, 클라이언트는 이 메시지를 수신하여 변경 사항을 가져온다. 각 클라이언트는 `lastDownloadedTimestamp`를 추적하여 불필요한 데이터 전송을 방지하고, 서버의 `lastUpdatedTime`과 비교하여 변경된 부분만 동기화한다. 이러한 방식은 데이터 미저장 정책(Zero-Retention Policy)을 유지하면서도 효율적인 데이터 동기화를 가능하게 한다.
데이터 동기화 및 충돌 해결의 난제
댓글에서는 오프라인 환경에서 여러 사용자가 동일한 블록을 동시에 편집할 때 발생하는 충돌 문제를 해결하는 방식에 대한 궁금증이 제기되었다. 노션(Notion)은 CRDT(Conflict-free Replicated Data Type) 또는 최후 기록 승리(Last-Write-Wins) 방식과 같은 다양한 충돌 해결 전략을 고려했을 것으로 예상된다. 오프라인 협업 도구의 핵심은 데이터 일관성(Data Consistency)을 유지하면서 사용자 간의 충돌을 최소화하는 것이다. 이는 노션(Notion)의 오프라인 모드 구현에서 가장 어려운 부분 중 하나였을 것이다.
SQLite 기반 캐싱(Caching)의 진화
노션(Notion)은 오프라인 모드를 위해 기존의 SQLite 캐시를 개선하여 지속적인 스토리지 계층(Persistent Storage Layer)을 구축했다. 이 계층은 오프라인 페이지를 추적하고, 페이지가 의존하는 모든 데이터를 저장하여 오프라인 환경에서도 페이지를 사용할 수 있도록 보장한다. 초기에는 단순한 캐싱 방식이었지만, 오프라인 모드 지원을 위해 데이터 모델(Data Model)을 개선하고, 페이지 트리 구조를 도입하여 복잡한 데이터 관리 문제를 해결했다. 이는 노션(Notion)의 오프라인 기능의 핵심 기반이 되었다.