Firebase 없이 오프라인 퍼스트 앱: GenosDB를 활용한 P2P 접근 방식
Source: Dev.to
Firebase는 누군가가 “실시간으로 데이터를 동기화하려면 어떻게 해야 하나요?” 라고 물을 때 기본 답변입니다.
솔직히 말해서, 그것은 자신이 하는 일에 능합니다. 하지만 대부분의 개발자들이 너무 늦게 깨닫는 함정이 있습니다:
당신은 Google로부터 데이터 레이어를 임대하고 있습니다.
- 비용이 예측 불가능하게 증가합니다.
- 로컬에서 실행하거나 자체 호스팅할 수 없습니다.
- Google이 제품을 종료하면(이미 한 적이 있습니다), 당신의 아키텍처도 함께 사라집니다.
- 사용자의 데이터가 Google 서버에 저장되며, Google의 약관에 따릅니다.
- 오프라인 지원이 존재하지만, 이는 캐시 레이어일 뿐—진정한 오프라인‑퍼스트 아키텍처는 아닙니다.
“오프라인‑퍼스트(Offline‑First)”가 실제 의미하는 바
대부분의 “오프라인 지원” 앱은 오프라인 모드를 저하된 상태로 취급합니다: 데이터를 일부 캐시하고, 스피너를 표시하고, 재연결을 기도합니다.
진정한 오프라인‑퍼스트는 다릅니다. 앱은 기본 상태로 완전한 오프라인에서도 작동합니다. 동기화는 연결이 존재할 때 발생하며—필수조건이 아니라 부가적인 혜택입니다.
이것은 다음을 의미합니다:
- 데이터베이스가 클라이언트에 존재합니다.
- 쓰기는 로컬에서 즉시, 항상 발생합니다.
- 피어가 연결될 때 데이터가 자동으로 동기화됩니다.
- 서버가 병목이 되지 않습니다. 서버가 단일 장애 지점이 되지 않습니다.
GenosDB: 순수 JavaScript 기반 P2P 그래프 데이터베이스
GenosDB는 바로 이를 위해 설계된 피어‑투‑피어 그래프 데이터베이스입니다. 브라우저에서 실행되며 OPFS(Origin Private File System)를 사용해 데이터를 로컬에 저장하고, WebRTC를 통해 피어 간에 동기화합니다 — 시그널링은 Nostr relays를 이용하므로 연결 설정조차 중앙 서버가 필요 없습니다.
빠른 설정
npm install genosdb
import { gdb } from "genosdb";
const db = await gdb("my-app"); // 로컬 전용 데이터베이스
이것만으로도 완전한 로컬 데이터베이스가 동작합니다. API 키도 필요 없고, 프로젝트 설정도, 청구 페이지도 없습니다.
P2P 동기화 추가
const db = await gdb("my-app", { rtc: true });
플래그 하나만 설정하면 됩니다. 이제 앱을 실행하는 모든 피어가 데이터를 자동으로 동기화합니다. WebSocket 서버도, Firebase 프로젝트도, 별도 설정도 필요 없습니다.
협업 Todo 앱 만들기 — 서버 없이
실제적인 것을 만들어 봅시다: 여러 사용자가 협업할 수 있는, 완전 오프라인‑우선이며 P2P 동기화가 가능한 todo 앱.
import { gdb } from "genosdb";
const db = await gdb("todos", { rtc: true });
// Add a todo
async function addTodo(text) {
return await db.put({
text,
done: false,
created: Date.now(),
});
}
// Toggle completion
async function toggleTodo(id) {
const todo = await db.get(id);
await db.put({ ...todo, done: !todo.done }, id);
}
// Reactive UI — fires on local AND remote changes
db.map((todo, id) => {
renderTodo(id, todo);
});
방금 무슨 일이 일어났나요
- 데이터가 로컬 OPFS에 저장됩니다 — 완전히 오프라인에서도 작동합니다.
- 다른 피어가 연결되면, todo가 WebRTC를 통해 동기화됩니다.
map콜백은 로컬 쓰기와 들어오는 P2P 업데이트 모두에 대해 실행됩니다.- 서버가 이 과정에 전혀 관여하지 않았습니다. API 호출도 없었고, 청구서도 발생하지 않았습니다.
Firebase vs. GenosDB — 언제 사용해야 할까
공정하게 말하자면, Firebase가 나쁜 건 아니지만, 단지 다른 트레이드오프일 뿐입니다.
Firebase를 선택해야 할 경우
- 서버‑사이드 로직(Cloud Functions)이 필요할 때.
- 소셜 제공자를 포함한 관리형 인증이 바로 제공될 때.
- 팀이 인프라 결정을 전혀 하지 않기를 원할 때.
- 벤더 종속 및 사용량 기반 요금제에 괜찮을 때.
GenosDB를 선택해야 할 경우
- 진정한 오프라인‑우선(단순 캐시가 아님)을 원할 때.
- 서버 없이 P2P 동기화가 필요할 때.
- 데이터 레이어에 대한 지속 비용이 전혀 없을 때.
- 프라이버시가 중요—데이터가 사용자 기기에 머무를 때.
- 협업, 멀티플레이어, 분산 앱을 만들 때.
- 벤더 의존 없이 스택을 직접 소유하고 싶을 때.
The Technical Stack
Under the hood, GenosDB uses:
- OPFS for persistent storage (faster and more reliable than
localStorageor IndexedDB`). - MessagePack + Pako for compact binary serialization.
- Hybrid Logical Clocks for conflict‑free causal ordering across peers.
- Delta sync + full‑state fallback for efficient and resilient P2P synchronization.
- Nostr relays for WebRTC signaling — no custom servers needed.
- Cellular Mesh topology for scaling to large peer networks.
It’s modular too. Need natural‑language queries? { nlq: true }. Geospatial? { geo: true }. AI integration? { ai: true }. Load only what you use.
시작하기
npm install genosdb
import { gdb } from "genosdb";
// Local only
const local = await gdb("app");
// With P2P sync
const synced = await gdb("app", { rtc: true });
// With security
const secure = await gdb("app", {
rtc: true,
sm: { superAdmins: ["your-address"] },
});
전체 문서 및 예제:
Source: (원본 링크가 제공되지 않았습니다)
웹은 허가를 필요로 하지 않는다
오픈 프로토콜 위에서 구축하는 가장 큰 장점은 아무도 그것을 빼앗아 갈 수 없다는 점입니다. 서비스 약관이 바뀌지 않으며, 가격이 인상되지 않고, 서비스 종료 공지도 없습니다.
당신의 앱, 당신의 데이터, 당신의 규칙. 이것이 바로 오프라인‑퍼스트가 의미해야 하는 바입니다.
저는 estebanrfp — 풀‑스택 개발자, dWEB R&D입니다. 저는 GenosDB를 구축합니다. 왜냐하면 웹의 데이터 레이어는 자유롭고, 분산되어 있으며, 이를 사용하는 사람들에 의해 소유되어야 한다고 믿기 때문입니다.
이 글은 GenosDB (GDB) 공식 문서의 일부입니다.
GenosDB는 Zero‑Trust 보안 모델을 적용한 분산형, 모듈식, 피어‑투‑피어 그래프 데이터베이스이며, Esteban Fuster Pozzi (estebanrfp)가 만들었습니다.
- 📄 Whitepaper – GenosDB 설계 및 아키텍처 개요
- 🛠 Roadmap
💡 **[Examples](https://github.com/estebanrfp/gdb/blob/main/docs/genosdb-examples.md)**
Code snippets and usage demos
📖 **[Documentation](https://github.com/estebanrfp/gdb/blob/main/docs/index.md)**
Full reference guide
🔍 **[API Reference](https://github.com/estebanrfp/gdb/blob/main/docs/genosdb-api-reference.md)**
Detailed API methods
📚 **[Wiki](https://github.com/estebanrfp/gdb/wiki)**
Additional notes and guides
💬 **[GitHub Discussions](https://github.com/estebanrfp/gdb/discussions)**
Community questions and feedback
🗂 **[Repository](https://github.com/estebanrfp/gdb)**
Minified production‑ready files
📦 **[Install via npm](https://www.npmjs.com/package/genosdb)**
Quick setup instructions
🌐 **[Website](https://estebanrfp.com/)** | **[GitHub](https://github.com/estebanrfp)** | **[LinkedIn](https://www.linkedin.com/in/estebanrfp/)**