Firebase 없이 오프라인 퍼스트 앱: GenosDB를 활용한 P2P 접근 방식

발행: (2026년 2월 16일 오전 07:49 GMT+9)
9 분 소요
원문: Dev.to

Source: Dev.to

Firebase는 누군가가 “실시간으로 데이터를 동기화하려면 어떻게 해야 하나요?” 라고 물을 때 기본 답변입니다.
솔직히 말해서, 그것은 자신이 하는 일에 능합니다. 하지만 대부분의 개발자들이 너무 늦게 깨닫는 함정이 있습니다:

당신은 Google로부터 데이터 레이어를 임대하고 있습니다.

  • 비용이 예측 불가능하게 증가합니다.
  • 로컬에서 실행하거나 자체 호스팅할 수 없습니다.
  • Google이 제품을 종료하면(이미 한 적이 있습니다), 당신의 아키텍처도 함께 사라집니다.
  • 사용자의 데이터가 Google 서버에 저장되며, Google의 약관에 따릅니다.
  • 오프라인 지원이 존재하지만, 이는 캐시 레이어일 뿐—진정한 오프라인‑퍼스트 아키텍처는 아닙니다.

“오프라인‑퍼스트(Offline‑First)”가 실제 의미하는 바

대부분의 “오프라인 지원” 앱은 오프라인 모드를 저하된 상태로 취급합니다: 데이터를 일부 캐시하고, 스피너를 표시하고, 재연결을 기도합니다.

진정한 오프라인‑퍼스트는 다릅니다. 앱은 기본 상태로 완전한 오프라인에서도 작동합니다. 동기화는 연결이 존재할 때 발생하며—필수조건이 아니라 부가적인 혜택입니다.

이것은 다음을 의미합니다:

  • 데이터베이스가 클라이언트에 존재합니다.
  • 쓰기는 로컬에서 즉시, 항상 발생합니다.
  • 피어가 연결될 때 데이터가 자동으로 동기화됩니다.
  • 서버가 병목이 되지 않습니다. 서버가 단일 장애 지점이 되지 않습니다.

Source: https://github.com/estebanrfp/gdb

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 localStorage or 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)가 만들었습니다.

💡 **[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/)**
0 조회
Back to Blog

관련 글

더 보기 »