Node.js가 지원하는 node:sqlite

taesun·2026년 2월 1일

Node.js는 v22.5.0부터 node:sqlite 모듈을 통해 SQLite를 내장 지원한다고 합니다.

Node.js가 http 모듈 등 다양한 모듈들을 지원하지만 처음 SQLite를 지원하는 것을 알았을때 신기했습니다.

이번 글에서는 SQLite와 다른 DBMS와의 차이를 시작으로 Node.js에 도입이 될 수 있었던 이유를 알아보고자 합니다. 또한 better-sqlite3나 sqlite3 패키지를 사용하는 것과 Node.js가 내장 지원하는 node:sqlite 모듈을 사용하는 것이 차이가 있을지도 알아보려고 합니다.

SQLite와 다른 DBMS와의 차이

알아보니 bun에서도 출시 초창기 SQLite를 내장 지원했다고 합니다. MySQL이나 PostgreSQL과 같은 DBMS가 아닌 SQLite를 지원하는 이유는 무엇일까요?

우선 차이점을 표로 정리해봤습니다.

SQLiteMySQL, PostgreSQL 등
아키텍처라이브러리 (임베디드)클라이언트-서버
프로세스애플리케이션에 직접 포함별도 서버 프로세스 필요
저장방식단일 파일서버가 관리하는 파일들
설정제로 설정설치/설정/관리 필요

즉 SQLite은 아래의 이점을 가집니다.

  1. 라이브러리 형태: SQLite는 C 라이브러리로, Node.js 바이너리에 직접 링크할 수 있음
  2. 서버 불필요: MySQL/PostgreSQL은 내장이 불가능
  3. 경량: 전체 코드가 수백 KB 수준
  4. 퍼블릭 도메인: 라이선스 문제 없음

Node.js에 SQLite가 도입된 시기와 이유

https://github.com/nodejs/node/issues/53264

위 이슈에서 확인할 수 있듯이 SQLite는 localStorage API 구현을 위해 먼저 번들되었던 것 같습니다. Bun이나 python (sqlite3 표준 라이브러리), php ( PDO SQLite), Tcl에서도 SQLite를 내장 지원하고 있으니 사용자에게도 SQLite를 노출하자는 의견이 있었습니다.

위 주장이 받아들여져 SQLite 내장 모듈인 node:sqlite는 2024년 7월 v22.5.0로 릴리스가 되었습니다.

better-sqlite3, sqlite3, node:sqlite의 차이점 정리

node:sqlitebetter-sqlite3sqlite3
유형내장 모듈npm 패키지npm 패키지
API 방식동기동기비동기
도입2024년 (v22.5.0)2016년2011년
안정성실험적안정적안정적
설치불필요네이티브 컴파일 필요네이티브 컴파일 필요

각 라이브러리 특징을 적어보자면 아래와 같습니다.

  • sqlite3
    Node.js 생태계에서 가장 오래된 라이브러리입니다. Node.js의 비동기 철학에 맞춰 모든 API가 콜백 또는 Promise 기반으로 설계되었습니다. 내부적으로 스레드 풀을 관리해야 하므로 설정이 복잡하고 오버헤드가 발생할 수 있습니다.

  • better-sqlite3
    이름 그대로 더 나은 성능을 목표로 등장했습니다. 비동기 대신 동기적 API를 선택해 복잡한 내부 로직을 걷어냈으며, 현재 Node.js 환경에서 가장 빠르고 사용자가 많은 표준 라이브러리로 자리 잡았습니다. 다만, node-gyp를 통한 네이티브 컴파일 과정이 필요해 설치 환경에 따라 까다로울 수 있습니다.

  • node:sqlite
    better-sqlite3와 같이 동기적 인터페이스를 내장 모듈 형태로 제공합니다.

Node에서 동기 방식을 채택한 이유

저는 성능 면에서는 비동기 방식을 지원하는 sqlite3가 더 좋은거 아닌가 단순하게 생각 했었습니다. 하지만 아래 1, 2번의 이유들로 better-sqlite3와 같이 동기적 방식이 더 나은 성능을 제공할 수 있다는 걸 이해할 수 있었습니다. 또 성능을 차치하고서 Web 표준 구현을 위한 선택이었을 것입니다.

  1. 네트워크 대기가 없는 인프로세스 DB
    MySQL이나 PostgreSQL은 별도의 서버 프로세스와 통신하므로 '네트워크 지연'이라는 변수가 큽니다. 반면, SQLite는 Node.js 프로세스 안에서 직접 실행됩니다. 쿼리 실행 시간이 매우 짧기 때문에, 굳이 비동기로 작업을 넘기고 다시 결과를 받는 과정에서 발생하는 이벤트 루프의 오버헤드가 오히려 실행 속도를 늦추는 원인이 되기도 합니다.

  2. OS 캐시와 파일 I/O
    파일 읽기 작업이 운영체제(OS)의 캐시 단에서 이루어질 경우, 동기 방식은 CPU를 즉각적으로 활용하여 데이터를 가져옵니다. 실제로 벤치마크 결과를 보면 동기 방식인 better-sqlite3가 비동기인 sqlite3보다 수 배 이상 빠른 성능을 보여주는 경우가 많다고 합니다.

  3. Web 표준 구현을 위한 선택
    node:sqlite는 동기적으로 작동하는 웹 표준 API인 localStorage를 구현하기 위해 시작되었습니다.

node:sqlite 사용 방법

'use strict';
const { DatabaseSync } = require('node:sqlite');
const database = new DatabaseSync(':memory:');

// Execute SQL statements from strings.
database.exec(`
  CREATE TABLE data(
    key INTEGER PRIMARY KEY,
    value TEXT
  ) STRICT
`);
// Create a prepared statement to insert data into the database.
const insert = database.prepare('INSERT INTO data (key, value) VALUES (?, ?)');
// Execute the prepared statement with bound values.
insert.run(1, 'hello');
insert.run(2, 'world');
// Create a prepared statement to read data from the database.
const query = database.prepare('SELECT * FROM data ORDER BY key');
// Execute the prepared statement and log the result set.
console.log(query.all());
// Prints: [ { key: 1, value: 'hello' }, { key: 2, value: 'world' } ]

실험적 상태로 도입

Node.js v22.5.0 버전에서 node:sqlite 모듈이 등장했지만 Stability: 1.1로써 실험적인 기능입니다.

Stability: 1.1

1.1 - Active development. Experimental features at this stage are nearing minimum viability.

Node.js v22.5.0 ~ v22.12.x 까지는 아래와 같이 사용해야 합니다.

node --experimental-sqlite app.js     

0개의 댓글