왜 내가 GenosDB를 만들었는가: 바로 사용할 수 있는 P2P 데이터베이스

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

Source: Dev.to

위에 제공된 텍스트 외에 번역할 내용이 없습니다. 번역이 필요한 전체 텍스트를 제공해 주시면 한국어로 번역해 드리겠습니다.

“Minimal Core” 함정 in P2P 데이터베이스

당신은 가볍게 보이는 라이브러리를 선택합니다. README에 3줄 설정만 적혀 있죠. 완벽해, 이게 전부다 라고 생각합니다. 그런데 현실이 찾아옵니다.

  • 인증이 필요함 → 별도 모듈.
  • 실제로 동작하는 충돌 해결이 필요함 → 또 다른 모듈.
  • 암호화? → 또 다른 모듈.
  • 손상되지 않는 오프라인 영속성이 필요함? → 행운을 빕니다.

갑자기 “가벼운” 데이터베이스가 각기 다른 특성, 버전 문제, 문서화되지 않은 엣지 케이스를 가진 애드온들의 조합이 됩니다.

저는 실제 P2P 애플리케이션을 수년간 구축하면서 이 경험을 했고, 그래서 GenosDB를 만들었습니다.

기존 프로젝트와 그 트레이드‑오프

ProjectStrengthsPain Points
GunDBJavaScript에서 P2P 데이터베이스를 최초로 구현했습니다.• Core가 localStorage 위에 구축됨 (동기식, 5 MB 한도, 메인 스레드 차단).
• 충돌 해결이 벽시계 타임스탬프(HAM)를 사용 → 시계 drift 및 디버깅 어려움.
• 장기간 연결 끊김 후 동기화 프로토콜이 예측 불가능해짐; 깨끗한 재생 메커니즘 부재.
• 암호화가 브라우저 네이티브 표준이 아닌 커스텀 구현(SEA) 사용.
• 실제 사용 시 모듈을 겹쳐야 함(인증용 SEA, 저장용 RAD, 시그널링용 커스텀 릴레이) → 학습 곡선 급상승 및 조립 취약성.
OrbitDB아키텍처가 강력함: Merkle‑CRDT, append‑only 로그, 깔끔한 코드베이스.• IPFS + Libp2p를 의존성으로 요구 → 자체 데몬, 설정, 운영 복잡성을 가진 전체 분산 네트워킹 스택을 도입해야 함.
• 웹 앱에서 P2P 데이터 동기화만 필요로 하는 많은 JS 개발자에게는 무거운 선택이 됨.

두 프로젝트 모두 저에게 영감을 주었지만, 제가 필요로 했던 것은 첫 번째 코드 라인부터 작동하는, 최신 웹 표준을 사용하고 외부 인프라가 전혀 필요 없는, 완전하고 프로덕션‑레디한 P2P 그래프 데이터베이스였습니다.

Source:

GenosDB 소개

import { gdb } from "genosdb";

const db = await gdb("myapp", { rtc: true });

두 줄. 이미 내부에서 실행되고 있는 내용은 다음과 같습니다.

스토리지 – OPFS + IndexedDB

GenosDB는 Origin Private File System (OPFS) 를 사용합니다 – 최신의 샌드박스 파일 시스템 API입니다. 모든 I/O는 전용 Web Worker 에서 실행되므로 메인 스레드가 차단되지 않습니다.

TierDescription
Synchronous OPFS가장 낮은 지연 시간, 원자적 쓰기
Asynchronous OPFS스트림 기반, 여전히 빠름
IndexedDB범용 폴백

Result: GenosDB는 브라우저마다 사용 가능한 최적의 스토리지를 자동으로 선택합니다 – 용량 제한 없음, 메인 스레드 차단 없음, 동시 작업으로 인한 손상을 방지하는 파일별 쓰기 큐 를 제공합니다.

동기화 엔진 – 듀얼‑모드

ModeHow it works
Delta sync (primary)모든 변형이 제한된 크기의 연산 로그(oplog)에 기록됩니다. 피어가 재연결되면 놓친 연산만 MessagePack 으로 직렬화하고 Pako 로 압축하여 전송합니다. 최소한의 대역폭, 최소한의 지연.
Full‑state fallback (automatic)피어가 너무 오래 오프라인 상태였고 oplog 로 격차를 메우지 못할 경우, 시스템이 자동으로 전체 압축 그래프 상태를 전송합니다. 수신 피어는 이를 병합하고 시계를 재설정한 뒤 즉시 다음 델타 동기화를 수행할 준비가 됩니다.

수동 개입 필요 없음. 깨진 상태 없음. 실제로 작동하는 궁극적 일관성 제공.

인과 순서 – 하이브리드 논리 시계

분산 시스템에서 실제 시계 타임스탬프는 신뢰할 수 없습니다. GenosDB는 Hybrid Logical Clocks (HLC) 를 사용합니다 – 인과 순서를 위한 표준 접근 방식. 모든 연산은 고유하고 부분적으로 정렬된 타임스탬프를 부여받으며, 동기화된 디바이스 시계에 의존하지 않습니다. 충돌은 last‑write‑wins 의미론으로 결정적으로 해결됩니다.

P2P 시그널링 – GenosRTC + Nostr 릴레이

GenosDB의 P2P 모듈(GenosRTC)은 Nostr 릴레이 를 이용해 WebRTC 시그널링을 수행합니다. 자동으로 업데이트되는 안정적인 릴레이 목록이 내장되어 있어 설정 없이 즉시 작동합니다. 개발자는 필요에 따라 개인 네트워크나 특정 인프라 요구에 맞춰 자체 릴레이 목록을 제공할 수 있습니다.

릴레이 관리가 지능적입니다:

  • 내장된 안정적인 릴레이에 즉시 연결 (시작 지연 0).
  • 동시에 로컬 캐시와 nostr.watch 와 같은 커뮤니티 소스에서 추가 릴레이를 로드.
  • 비정상적인 릴레이(POW 요구, 타임아웃, 제한 정책 등)를 자동으로 감지하고 차단.
  • 사용자 정의 릴레이 URL 지원:
gdb("app", { rtc: { relayUrls: ["wss://my-relay.com"] } });

시그널링이 완료되면 모든 데이터가 WebRTC 데이터 채널을 통해 피어‑투‑피어로 직접 전송 됩니다 – 서버가 데이터를 전혀 건드리지 않습니다.

멀티‑탭 동기화

동일 앱의 여러 탭은 BroadcastChannel 을 통해 동기화됩니다. 레이스 컨디션이나 탭 간 오래된 데이터가 없습니다.

컴팩트 직렬화

디스크와 네트워크 모두에서 모든 데이터는 MessagePack (컴팩트 바이너리, JSON보다 빠름) 으로 직렬화되고 Pako (zlib) 로 압축됩니다. 이는 JSON 기반 접근 방식에 비해 저장 공간과 네트워크 페이로드를 크게 줄여줍니다.

Source:

빠른 시작 API

import { gdb } from "genosdb";

const db = await gdb("myapp", { rtc: true });

// Create — returns a SHA‑256 content‑addressable ID
const id = await db.put({ name: "Alice", role: "admin" });

// Read
const node = await db.get(id);

// Read with real‑time subscription
db.get(id, (node) => {
  console.log("Node changed:", node);
});

// Update
await db.put({ name: "Alice", role: "superadmin" }, id);

// Delete (also cleans up all edges)
await db.remove(id);

// Graph relationships
await db.link(userId, projectId);

// Reactive query with MongoDB‑style filters
db.map(
  { where: { role: { $in: ["admin", "superadmin"] } } },
  (node, id, action) => {
    // action: 'initial' | 'added' | 'updated' | 'removed'
    console.log(action, id, node);
  }
);

// Graph traversal — follow edges recursively
db.map(
  {
    where: { type: "department" },
    $edge: { where: { active: true } },
  },
  (node, id) => {
    // Returns all active descendants of department nodes
    console.log("Descendant:", id, node);
  }
);

TL;DR

  • Minimal core 라이브러리는 종종 깨지기 쉬운 조합이 됩니다.
  • GenosDB완전하고, 프로덕션 수준의 P2P 그래프 데이터베이스를 바로 사용할 수 있게 제공합니다.
  • 최신 웹 API(OPFS, Web Workers, WebRTC, BroadcastChannel)와 검증된 기술(HLC, MessagePack, Pako)을 활용합니다.
  • 외부 인프라가 전혀 필요 없으며, 두 줄 설정만으로 깔끔하고 인체공학적인 API를 제공합니다.

한 번 사용해 보고 “경량”이 실제로 경량을 의미한다는 것을 확인해 보세요.

정렬 및 페이지네이션

db.map({
  where: { type: "post" },
  field: "created",
  order: "desc",
  $limit: 10,
  $after: lastCursorId
}, callback);

피어의 제거 작업 차단

db.use(async (operations) => {
  return operations.filter(op => op.type !== 'remove');
});

원격 데이터 적용 전 맞춤 검증

db.use(async (operations) => {
  return operations.filter(op => isValid(op));
});

프로세스, 검증, 변환 또는 들어오는 P2P 데이터를 로컬 데이터베이스에 적용되기 전에 거부합니다.

GenosDB + P2P 레이어

GenosDB는 단순한 데이터베이스가 아닙니다 — P2P 레이어가 피어 간 직접 통신을 지원합니다.

명명된 데이터 채널

const chat = db.room.channel("chat");
chat.send({ text: "Hello!" });
chat.on("message", (msg, peerId) => { /* … */ });

오디오/비디오 스트리밍

const stream = await navigator.mediaDevices.getUserMedia({
  audio: true,
  video: true
});
db.room.addStream(stream);
db.room.on("peer:stream", (stream, peerId) => { /* … */ });

피어 라이프사이클 이벤트

db.room.on("peer:join",  (peerId) => { /* … */ });
db.room.on("peer:leave", (peerId) => { /* … */ });

협업 앱, 실시간 게임, 영상 통화, 파일 공유 등을 구축하세요 — 모두 P2P이며, 모두 동일한 데이터베이스 인스턴스에서 실행됩니다.

모듈형 퍼스트‑파티 기능

앱이 성장하면 필요한 것만 활성화하세요. 이들은 퍼스트‑파티 모듈이며(동일한 유지보수자, 동일한 릴리즈 사이클)입니다.

const db = await gdb("myapp", {
  rtc: true,
  sm: { superAdmins: ["addr"] },   // Security: RBAC + WebAuthn + Mnemonic recovery
  nlq: true,       // Natural Language Queries
  geo: true,       // Geospatial ($near, $bbox)
  rx: true,        // Radix tree ($startsWith, prefix search)
  ii: true,        // Inverted index (full‑text search)
  audit: true      // Oplog auditing with custom prompts
});

SM (Security & Management) 모듈

  • WebAuthn – 생체인식 또는 하드웨어 키 인증; 새로 고침 시 무음 세션 복원.
  • Mnemonic phrases (BIP‑39) – 사용자 친화적인 계정 생성 및 복구.
  • Cryptographic identity – 이더리움 스타일 키 쌍; 모든 P2P 작업은 서명 및 검증됨.
  • RBAC hierarchysuperadmin > admin > manager > user > guest (완전 커스터마이징 가능).
  • Granular permissionsread, write, link, publish, delete, deleteAny, assignRole.
  • Encrypted storagedb.sm.put() / db.sm.get() 로 엔드‑투‑엔드 암호화된, 사용자 범위 데이터 저장.
  • Role expiration – 선택적 TTL을 지정하여 역할 부여 가능.

이것은 제가 가장 자랑스러워하는 혁신 중 하나이며, GenosDB 이전에는 존재하지 않았습니다.

Cellular Mesh – 확장 가능한 브라우저 기반 P2P

전통적인 평면 메시 토폴로지(모든 피어 ↔ 모든 다른 피어)는 ~10 피어를 초과하면 붕괴합니다(O(N²) 연결).
GenosDB는 Cellular Mesh를 도입합니다. 이는 피어를 논리적 셀로 그룹화하고 셀 간 통신을 위해 브리지 노드를 사용하는 오버레이 프로토콜입니다:

cell‑0 ←→ cell‑1 ←→ cell‑2 ←→ cell‑3
  │          │          │          │
peers      peers      peers      peers
  • 셀 내부 연결만 – 각 피어는 자신이 속한 셀의 피어와만 통신합니다.
  • 브리지 노드가 셀 간에 메시지를 중계하여 연결 복잡도를 O(N²) → O(N) 로 감소시킵니다.

Cellular Mesh 기능

FeatureDescription
동적 셀 크기 조정네트워크 변화에 따라 셀이 자동으로 확대·축소됩니다.
헬스 스코어 기반 브리지 선택브리지는 무작위가 아니라 연결 품질을 기준으로 선택됩니다.
TTL 기반 전파메시지 TTL이 실제 토폴로지를 기반해 계산됩니다.
자동 중복 제거메시지 폭풍을 방지합니다.
하트비트 정리비활성 피어를 제거합니다.

제가 알기로는 다른 브라우저 기반 P2P 데이터베이스나 WebRTC 프레임워크가 이와 같은 기능을 구현한 사례는 없습니다. 이는 행성 규모 가상 세계인 OVGrid를 확장하면서 탄생했습니다.

단일 플래그로 Cellular Mesh를 활성화합니다:

{ rtc: { cells: true } }

라이브 브라우저‑전용 예제

ExampleDescription
Collaborative WhiteboardP2P 그리기 캔버스
Real‑Time Video RoomP2P 비디오 스트리밍
Collaborative Rich‑Text Editor실시간 타이핑, 원격 커서, RBAC, 버전 기록
Secure Decentralized Notes종단 간 암호화, P2P 공유 노트
Location SharingLeaflet + GenosRTC를 이용한 실시간 지도
IoT Thermostat반응형 P2P 디바이스 제어
Cellular Mesh Monitor (3D)Three.js를 이용한 메시 토폴로지 시각화 (3D)

모든 예제 보기 →

Installation

npm

npm install genosdb
import { gdb } from "genosdb";
const db = await gdb("my-app", { rtc: true });

CDN

<script type="module">
  import { gdb } from "https://cdn.jsdelivr.net/npm/genosdb@latest/dist/index.min.js";
  const db = await gdb("my-app", { rtc: true });
</script>

두 줄. 전체 P2P 그래프 데이터베이스. 어셈블리 없음. 인프라 없음. 벤더 종속성 없음.

리소스

  • Docs: https://github.com/estebanrfp/gdb
  • Whitepaper – GenosDB 설계 및 아키텍처 개요
  • Roadmap – 예정된 기능 및 향후 업데이트
  • Examples – 코드 스니펫 및 사용 데모
  • API Reference – 상세 메서드 문서
  • Wiki – 추가 노트 및 가이드
  • GitHub Discussions – 커뮤니티 Q&A
  • Repository – 압축된 프로덕션‑준비 파일
  • Websitehttps://genosdb.org

저자 소개

저는 Esteban Fuster Pozzi (@estebanrfp)이며, dWEB 연구·개발에 집중하는 풀‑스택 개발자입니다. 웹은 자유롭고 회복력 있어야 하며, 이를 사용하는 사람들에 의해 소유되어야 한다는 믿음으로 순수 JavaScript로 분산 시스템을 구축하고 있습니다.

이 글은 GenosDB (GDB) 공식 문서의 일부입니다.

0 조회
Back to Blog

관련 글

더 보기 »