Syncular 0.5.0 – 오프라인 우선 SQL 동기화, TypeScript 및 Rust 코어 지원
개요
Syncular 0.5.0은 각 클라이언트가 실제 로컬 SQLite 데이터베이스를 유지하고, 쓰기 작업이 낙관적인 아웃박스에 먼저 저장된 뒤 서버 권한의 커밋 로그에 의해 검증·정렬되는 오프라인 우선 SQL 동기화를 제공합니다.
이 프로젝트는 자체 호스팅형이며, 1.0 이전 단계이고 관리형 서비스나 피어‑투‑피어 모드를 제공하지 않습니다. 네이티브 패키징 성숙도는 생태계마다 다릅니다.
아키텍처
클라이언트는 실제 SQLite 데이터베이스에 데이터를 저장합니다: 브라우저에서는 OPFS(Origin Private File System) 기반 sqlite-wasm을, 그 외 환경에서는 네이티브 SQLite를 사용합니다. 모든 쓰기 작업은 로컬에서 적용되고 동일 트랜잭션 내에 내구성 있는 아웃박스로 동시에 기록됩니다. 서버는 단일 순서가 지정된 커밋 로그를 유지하여 진실의 원천 역할을 하고, 들어오는 변경을 검증하며, 애플리케이션 백엔드에 정의된 명시적 스코프를 사용해 이를 해결합니다.
프로토콜 및 Spec‑first 접근법
Syncular의 프로토콜은 구현과 독립적으로 SPEC.md에 명시되어 있으며, spec/vectors/에 있는 골든 바이트 벡터가 정규 레퍼런스로 사용됩니다. 사양과 코드가 어긋날 경우 코드를 사양에 맞게 수정합니다. 프로토콜 초안은 SSP2라 불리며 정규 바이너리 인코딩을 포함합니다.
두 개의 독립적인 코어—하나는 TypeScript, 다른 하나는 Rust—는 구현에 구애받지 않는 적합성 테스트 스위트에 의해 95개의 시나리오를 양쪽 구현에 동시에 실행함으로써 동기화됩니다.
클라이언트 코어 및 바인딩
TypeScript 코어는 @syncular/client 웹 클라이언트를 구동하며, 이는 @sqlite.org/sqlite-wasm 위에서 동작합니다. Rust 코어는 Swift, Kotlin, Flutter, React Native, Tauri, 순수 Rust, 그리고 작은 C API용 언어 바인딩을 통해 노출됩니다.
이 바인딩을 통해 개발자는 동일한 동기화 로직을 공유하면서 네이티브 모바일 및 데스크톱 애플리케이션에 Syncular를 통합할 수 있습니다.
주요 기능
- 효율적인 초기 동기화를 위한 재개 가능한 부트스트랩 세그먼트를 갖춘 WebSocket 기반 실시간 동기화.
- 애플리케이션이 분기된 변경을 이해하고 해결할 수 있도록 명시적 충돌 증거 기록.
- 권한 회수 및 로컬 정리를 통해 사용자의 권한을 제거하고 클라이언트에서 해당 데이터를 삭제.
- 정의된 범위에 따라 데이터의 일부만 동기화하도록 하는 윈도우형 레플리카.
- 일반 SQL 데이터와 함께 바이너리 대용량 객체(blobs) 지원.
packages/crdt-yjs디렉터리에 위치한 Yjs 기반 병합기를 활용한 선택적 CRDT 컬럼 제공.- 선택된 필드에 대해 종단 간 기밀성을 보장하는 컬럼별 암호화.
- 공유 중간 표현에서 스키마 인식 헬퍼를 생성하는
typegen패키지를 통해 다섯 언어에 대한 타입 안전한 쿼리 생성 지원.
개발 관행
Syncular는 spec‑first 방법론을 따릅니다: 사양이 정확성의 최종 판단 기준입니다. 테스트 원칙은 통합 테스트를 위해 루프백 인‑메모리 전송을 사용하고, 전송 계층에서 결함 주입을 수행하며, 명시적 준비 신호를 요구합니다—테스트 내에서 sleep은 금지됩니다. 실제 소켓 테스트는 제한적이며 격리됩니다.
레포지토리는 “하나의 좋은 경로”를 권장합니다: 브라우저는 OPFS에 영구 저장하고 지원되지 않는 환경은 오류로 보고하며, 동기화는 WebSocket을 통해 이루어집니다.
AI 지원에 관해, 프로젝트 기여 가이드라인은 대형 언어 모델이 테스트, 재현, 벤치마크, 문서, 그리고 프로덕션 코드 작성에 활용될 수 있다고 명시하지만, 모든 라인은 검토·이해·방어 가능해야 하며, 저품질 자동 생성 기여는 별다른 논의 없이 닫힌다고 규정합니다.
배포 및 제한 사항
최신 릴리스(v0.5.0, 2026년 7월 14일) 기준으로 Syncular는 여전히 1.0 이전 단계이며, 자체 호스팅 배포 전용으로 설계되었습니다; 호스팅 서비스나 피어‑투‑피어 모드는 제공되지 않습니다. README에는 네이티브 패키징 성숙도가 생태계마다 여전히 다르며, 일부 언어 바인딩이 다른 것보다 더 성숙할 수 있다고 명시되어 있습니다.
커뮤니티 질문 및 저자 답변
- SQL에서 CRDT 처리: 저자는 Syncular가 선택적 CRDT 컬럼을 제공하며, 이는 Yjs 병합기를 통해 구현되어 특정 필드에 대해 충돌‑없는 복제 데이터 타입을 선택적으로 사용할 수 있게 하고, 나머지 데이터 모델은 관계형 형태를 유지한다고 설명합니다.
- 충돌 해결: 자동 충돌 해결 알고리즘 대신 Syncular는 명시적 충돌 증거를 기록하고, 해결 정책은 애플리케이션 개발자에게 맡깁니다.
- PowerSync와 비교: 저자는 직접적인 비교를 제공하지 않았으며, 프로젝트 문서에도 PowerSync에 대한 언급이 없습니다.
- 브라우저 저장소 소거: 저자는 대기 중인 쓰기가 OPFS 기반 SQLite 데이터베이스에 존재한다는 점을 확인했지만, 라이브러리가 영구 저장소를 요청하거나 아웃박스 소거 가능성에 대해 사용자에게 경고하는지는 명시하지 않았습니다.
- LLM 사용: 저자는 Syncular 개발 과정에서 LLM 도움을 주로 테스트 작성 및 기술 개념 반복에 사용했으며, 모든 기여는 동일한 엄격한 검토 기준을 적용받는다고 밝혔습니다.
이 내용은 레포지토리 README, 릴리스 노트, 그리고 해커 뉴스 게시물에 대한 저자 댓글을 직접 인용한 것입니다.
결론
Syncular 0.5.0은 사양 주도, 오프라인 우선 SQL 동기화 솔루션으로, TypeScript와 Rust 두 런타임을 제공하고, 내구성 있는 아웃박스 모델과 암호화 컬럼, 선택적 CRDT 지원 등 다양한 기능을 갖추고 있습니다. 관리형 서비스를 사용하지 않고 자체 호스팅 환경에서 실시간 동기화가 필요한 개발자를 위한 최적의 선택입니다.