Postgres Lite 소개: Node.js, Bun 및 브라우저용 순수 JS 임베디드 엔진

발행: (2026년 3월 14일 오후 10:41 GMT+9)
5 분 소요
원문: Dev.to

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+ 레코드를 손쉽게 처리하기 위해 여러 고급 기술을 구현하고 있습니다:

  1. Slotted Page Layout – 데이터는 고정된 4 KB 페이지로 구성된 슬롯 페이지 아키텍처를 사용해 조직됩니다. 이는 단편화를 방지하고 JSONB, TEXT와 같은 가변 길이 레코드의 효율적인 관리를 가능하게 합니다.

  2. B‑Tree Indexing & O(log n) Lookups – 기본 키와 고유 제약 조건은 지속적인 B‑Tree 구현으로 지원되며, 데이터셋이 커져도 포인트 조회를 번개처럼 빠르게 유지합니다.

  3. Write‑Ahead Logging (WAL) & ACID Compliance – 모든 변형은 메인 스토리지에 적용되기 전에 지속적인 .wal 파일에 기록됩니다. 충돌이 발생하면 엔진은 다음 부팅 시 자동으로 WAL을 재생합니다.

  4. Volcano Execution Model – 반복자 기반 처리 모델이 실행 계획을 통해 행을 하나씩 끌어오므로, 백만 행 테이블에 대한 SELECT *도 일정하고 최소한의 메모리 사용량으로 수행됩니다.

  5. LRU Buffer Pool – 정교한 Least‑Recently‑Used 캐시가 자주 접근되는 페이지를 뜨겁게 유지하고 디스크 또는 IndexedDB에 대한 물리 I/O를 최소화합니다.

빠른 시작

설치

npm install @pglite/core
# or
bun add @pglite/core

Node.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에서 프로젝트를 확인해 보세요:

https://github.com/pglite/pglite

0 조회
Back to Blog

관련 글

더 보기 »

JavaScript 소개

소개 오늘 수업에서 짧게 JavaScript에 대해 배웠으므로, 이 블로그에서 JavaScript에 관한 몇 가지 사실을 공유하려 합니다. JavaScript란? JavaScript…