GN⁺: InstantDB – "현대적인 Firebase" : 실시간 클라이언트측 DB 오픈소스
(github.com/instantdb)- 클라이언트 측 DB로, Notion이나 Figma와 같은 실시간 협업 앱을 쉽게 구축할 수 있게 해줌
- 관계형 쿼리를 작성하면 Instant가 데이터 가져오기, 권한 확인, 오프라인 캐싱을 처리
- 데이터 변경 시 Optimistic 업데이트와 롤백도 자동으로 처리
- 모든 쿼리는 기본적으로 멀티플레이어로 지원
- 커서나 온라인 상태와 같은 일시적 업데이트도 지원
- 현재 Javascript, React, React Native용 SDK를 제공
개발 동기
- 현대 앱 개발은 서버 설정, 데이터베이스, 캐시, ORM, 엔드포인트 설정 등 많은 작업이 필요함
- 클라이언트 측 코드 작성, 상태 관리, UI 페인팅도 필요함
- 멀티플레이어 기능 추가 시 상태 저장 서버를 고려해야 하고, 오프라인 모드 지원 시 IndexedDB와 트랜잭션 큐를 고려해야 함
- 새로운 기능 추가 시마다 모델, 엔드포인트, 상태 관리, UI를 반복적으로 작성해야 함
- 2021년에 UI 엔지니어가 직면하는 대부분의 문제는 사실 데이터베이스 문제임을 깨달음
- 클라이언트 측 데이터베이스가 있다면 상태 관리, 엔드포인트, 로컬 캐시를 생각할 필요 없이 쿼리만 작성하면 됨
- 쿼리가 기본적으로 멀티플레이어를 지원하면 상태 저장 서버를 걱정할 필요 없음
- 데이터베이스가 롤백을 지원하면 낙관적 업데이트를 무료로 제공받을 수 있음
- 그래서 Instant를 개발함. Instant는 클라이언트에서 사용할 수 있는 데이터베이스를 제공하여 UX 구축에 집중할 수 있게 해줌
아키텍처 개요
- Instant는 모든 사용자 데이터를 하나의 큰 Postgres 데이터베이스에 트리플 형태로 저장함
- 멀티 테넌트 설정으로 무료 티어를 제공함
- Clojure로 작성된 동기화 서버가 Postgres와 통신함
- Datalog와 GraphQL과 유사한 InstaQL을 이해하는 쿼리 엔진을 작성함
- Asana의 WorldStore와 Figma의 LiveGraph에서 영감을 받아 Postgres의 WAL을 추적하여 새로운 데이터를 감지하고 관련 쿼리를 무효화함
- 프론트엔드에서는 클라이언트 측 트리플 스토어를 작성함
- SDK는 웹에서는 IndexedDB, React Native에서는 AsyncStorage에 최근 쿼리 캐시를 저장함
- 모든 데이터는 Google's CEL 라이브러리로 구동되는 권한 시스템을 통해 처리됨
GN⁺의 정리
- Instant는 클라이언트 측 데이터베이스로, 실시간 협업 앱을 쉽게 구축할 수 있게 해줌
- 관계형 쿼리를 통해 데이터 가져오기, 권한 확인, 오프라인 캐싱을 자동으로 처리함
- 멀티플레이어 기능과 낙관적 업데이트, 롤백을 기본적으로 지원함
- Asana와 Figma에서 영감을 받아 Postgres의 WAL을 추적하여 새로운 데이터를 감지하고 관련 쿼리를 무효화함
- 클라이언트 측 트리플 스토어와 권한 시스템을 통해 데이터 관리를 효율적으로 처리함
Hacker News 의견
-
Firebase 창립자: Instant의 오프라인, 실시간, 관계형 쿼리, 오픈 소스 조합에 흥분됨. 관계형 쿼리에 대한 요청이 많았음. Firebase 클라이언트는 오픈 소스지만 백엔드는 오픈 소스화 실패했음
-
피드백: 코드 예제가 완전하지 않음.
transact
와useQuery
의 출처가 명확하지 않음. 작은 디테일이 중요함 -
자체 호스팅 가능 여부: 도구의 일부가 자체 호스팅 불가능한 경우가 많음. 이를 명확히 해야 함
-
오프라인 우선 모델 대안: PowerSync를 선택했음. WatermelonDB도 괜찮음. ElectricSQL은 아직 미성숙함. CouchDB와 PocketDB는 최신이 아님. PowerSync와 Supabase를 백엔드로 사용할 예정임
-
CRUD 앱과의 관계: CRUD 앱과 InstantDB 또는 Firebase 개념의 관계를 이해하기 어려움. 협업 텍스트 편집기에는 CRDT Javascript 구현을 사용할 것임
-
Instant 사용 경험: 6개월 동안 Instant를 사용했으며 만족스러웠음. 실시간, 관계형, 오프라인 기능이 중요했음. 다른 도구를 시도했지만 실패했음. Instant 이후로는 다른 도구를 사용하지 않음
-
권한 시스템 요약: Firebase는 데이터 검색/업데이트 논리와 접근 정책을 분리함. Instant는 쿼리 결과에 따라 권한 논리를 평가함. Firebase는 쿼리 실행 전에 안전성을 확인함
-
Datalog 엔진 노출 여부: 재귀 쿼리를 지원하는 다른 Datalog 엔진이 있음. 쿼리 캐시 및 결합 가능 여부를 묻고 있음. 과거 Java InstantDB와 이름이 같음. Clojure로 구현된 다른 Datalog 엔진 목록을 제공함
- Datomic
- XTDB
- Datascript
- Datalevin
- datahike
- Naga
-
ActiveRecord 같은 경험 원함: React/Vue/Solid에서 ActiveRecord와 같은 방식으로 작업하고 싶음. 객체 그래프 같은 API를 원함. SQL 같은 API는 원하지 않음. ORM이 메모리에 전체 객체 그래프가 있는 것처럼 작동하길 원함
-
트리플 스토어 성능 문제: 대부분의 쿼리가 전체 객체 또는 동일 객체의 여러 필드를 가져올 때 트리플 스토어의 성능이 좋지 않음. Postgres도 그다지 뛰어나지 않음. 이와 관련된 경험을 묻고 있음