# InstantDB – "현대적인 Firebase" : 실시간 클라이언트측 DB 오픈소스

> Clean Markdown view of GeekNews topic #16421. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=16421](https://news.hada.io/topic?id=16421)
- GeekNews Markdown: [https://news.hada.io/topic/16421.md](https://news.hada.io/topic/16421.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-08-23T09:38:50+09:00
- Updated: 2024-08-23T09:38:50+09:00
- Original source: [github.com/instantdb](https://github.com/instantdb/instant)
- Points: 28
- Comments: 2

## Summary

InstantDB는 클라이언트 측 데이터베이스로, Notion이나 Figma와 같은 실시간 협업 앱을 쉽게 구축할 수 있게 해줍니다. 관계형 쿼리를 통해 데이터 가져오기, 권한 확인, 오프라인 캐싱을 자동으로 처리하며, 멀티플레이어 기능과 낙관적 업데이트, 롤백을 기본적으로 지원합니다. 또한, Postgres의 WAL을 추적하여 새로운 데이터를 감지하고 관련 쿼리를 무효화하는 등 데이터 관리를 효율적으로 처리합니다.

## Topic Body

- 클라이언트 측 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을 추적하여 새로운 데이터를 감지하고 관련 쿼리를 무효화함  
- 클라이언트 측 트리플 스토어와 권한 시스템을 통해 데이터 관리를 효율적으로 처리함

## Comments



### Comment 28235

- Author: stargt
- Created: 2024-08-23T13:29:15+09:00
- Points: 1

Supabase와 같은 결에서 정말 기대되는 프로젝트네요

### Comment 28219

- Author: neo
- Created: 2024-08-23T09:38:51+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=41322281) 
- **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도 그다지 뛰어나지 않음. 이와 관련된 경험을 묻고 있음
