syncular - 로컬 SQLite를 서버와 동기화하는 오프라인 우선 엔진
2 weeks ago
26
- 각 클라이언트에 실제 SQLite DB를 두고, 서버가 관리하는 순서 보장 커밋 로그와 동기화하는 서버 권위형 데이터 계층
- 읽기/조인/집계/인덱스 조회를 네트워크 요청 없이 로컬 SQL로 처리하므로, 오프라인에서도 앱의 주요 기능을 계속 사용할 수 있음
- 쓰기는 로컬 DB에 즉시 반영하는 동시에 내구성 있는 아웃박스에 저장하고, 연결이 복구되면 멱등 커밋으로 서버에 전송함
- 서버는 애플리케이션이 정의한 사용자별 접근 범위로 커밋을 검증하고, 승인된 변경을 다른 클라이언트에 전달함
- 버전이 지정된 행의 충돌은 서버의 현재 데이터와 함께 앱에 반환해 직접 병합하도록 하며, 버전을 지정하지 않은 쓰기는 서버에서 마지막 쓰기 우선으로 처리함
- 브라우저에서는 Web Worker의 sqlite-wasm과 OPFS를 사용하고, Swift/Kotlin/Flutter/React Native/Tauri/Rust에서는 공통 Rust 코어와 네이티브 SQLite를 사용
- 실시간 변경은 WebSocket으로 전달하고, 대용량 초기 데이터는 HTTP/CDN에서 SQLite 이미지나 세그먼트로 내려받음
- 서버는 Bun/Node/Cloudflare Workers에서 실행할 수 있으며 SQLite/Postgres/D1과 S3 호환 객체 저장소를 지원
- 하나의 SQL/SYQL 정의에서 TypeScript/Swift/Kotlin/Dart/Rust용 타입 안전 쿼리 API를 생성하며 React용 반응형 훅도 제공
- 컬럼 단위 암호화, Yjs/yrs 기반 CRDT 병합, 로컬 FTS5 검색, 서버 측 클라이언트와 DB 없는 원격 작업 호출 지원
- P2P 동기화는 지원하지 않으며, 행 단위의 내구성 있고 권한이 필요한 앱 데이터를 대상으로 해 프레임 단위 멀티플레이어 상태에는 적합하지 않음
- bun create syncular-app 으로 앱 생성
- Apache-2.0 라이선스
-
Homepage
-
Tech blog
- syncular - 로컬 SQLite를 서버와 동기화하는 오프라인 우선 엔진