Postgres Lite 소개: Node.js, Bun 및 브라우저용 순수 JS 임베디드 엔진
Source: Dev.to
PostgreSQL은 세계에서 가장 사랑받는 데이터베이스 중 하나라고 할 수 있습니다. 하지만 로컬‑우선 개발, 엣지 컴퓨팅, 혹은 브라우저 기반 앱을 다룰 때는 보통 SQLite를 선택합니다.
왜일까요? 브라우저에서 전체 Postgres 인스턴스를 실행하거나 Node/Bun에서 의존성이 전혀 없는 임베디드 프로세스로 구동하려면 전통적으로 무거운 WASM 바이너리나 네트워크 프록시가 필요했기 때문입니다.
Postgres Lite란?
Postgres Lite는 순수 TypeScript/JavaScript 로 구현된 PostgreSQL 방언을 구현하는 맞춤형 SQL 엔진입니다. 이는 동일한 스키마, 쿼리 및 로직을 백엔드에서 프론트엔드나 로컬 환경으로 직접 사용할 수 있게 해 주는 강력한 SQLite 대안으로 설계되었습니다.
- Zero Emulation: WASM 오버헤드가 없습니다.
- Zero Dependency: 순수 JS/TS 로직만 사용합니다.
- Universal: Bun, Node.js 및 최신 브라우저(IndexedDB를 통해)에서 실행됩니다.
성능을 뒷받침하는 엔지니어링
데이터베이스 엔진을 처음부터 구축하려면 단순히 SQL을 파싱하는 것 이상이 필요합니다. Postgres Lite는 1 M+ 레코드를 손쉽게 처리하기 위해 여러 고급 기술을 구현하고 있습니다:
Slotted Page Layout – 데이터는 고정된 4 KB 페이지로 구성된 슬롯 페이지 아키텍처를 사용해 조직됩니다. 이는 단편화를 방지하고
JSONB,TEXT와 같은 가변 길이 레코드의 효율적인 관리를 가능하게 합니다.B‑Tree Indexing & O(log n) Lookups – 기본 키와 고유 제약 조건은 지속적인 B‑Tree 구현으로 지원되며, 데이터셋이 커져도 포인트 조회를 번개처럼 빠르게 유지합니다.
Write‑Ahead Logging (WAL) & ACID Compliance – 모든 변형은 메인 스토리지에 적용되기 전에 지속적인
.wal파일에 기록됩니다. 충돌이 발생하면 엔진은 다음 부팅 시 자동으로 WAL을 재생합니다.Volcano Execution Model – 반복자 기반 처리 모델이 실행 계획을 통해 행을 하나씩 끌어오므로, 백만 행 테이블에 대한
SELECT *도 일정하고 최소한의 메모리 사용량으로 수행됩니다.LRU Buffer Pool – 정교한 Least‑Recently‑Used 캐시가 자주 접근되는 페이지를 뜨겁게 유지하고 디스크 또는 IndexedDB에 대한 물리 I/O를 최소화합니다.
빠른 시작
설치
npm install @pglite/core
# or
bun add @pglite/coreNode.js / Bun에서 사용
import { PGLite } from "@pglite/core";
import { NodeFSAdapter } from "@pglite/core/node-fs";
const db = new PGLite("app.db", { adapter: new NodeFSAdapter() });
await db.exec(`
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
metadata JSONB
)
`);
await db.exec(
"INSERT INTO users (name, metadata) VALUES ($1, $2)",
["Alice", { role: "admin" }]
);
const results = await db.query(
"SELECT * FROM users WHERE name = $1",
["Alice"]
);
console.table(results);브라우저에서 사용
import { PGLite } from "@pglite/core";
import { BrowserFSAdapter } from "@pglite/core/browser";
const db = new PGLite("browser_storage", { adapter: new BrowserFSAdapter() });
// Everything else is the same!지원되는 기능
- 복잡한 조인:
INNER,LEFT,LATERAL, 및CROSS JOIN. - 고급 쿼리: CTE(
WITH),UNION,INTERSECT, 및 서브쿼리. - 윈도우 함수:
ROW_NUMBER(),RANK()를OVER (PARTITION BY …)를 통해. - JSON 기능:
JSONB연산자(->,->>,@>,?)를 완전 지원. - 업서트:
ON CONFLICT (col) DO UPDATE SET …
성능 벤치마크
- 포인트 조회 (PK): ~0.2 ms – 0.5 ms.
- 순차 스캔: 100 k 행을 < 40 ms에 처리.
- 메모리 사용량: Volcano 모델 덕분에 높은 쿼리 부하에서도 일정하게 유지됩니다.
데이터베이스 애호가이거나 로컬 데이터를 더 효율적으로 다루고 싶은 JS 개발자라면, GitHub에서 프로젝트를 확인해 보세요: