← 홈페이지 5강 목록으로
🪶
EPISODE 04
better-sqlite3 · prepare/run/get/all · CRUD API

Node.js + SQLite

Node.js에서 SQLite를 다루는 가장 인기 있는 better-sqlite3 라이브러리로 prepare/run/get/all 메서드를 익히고, Express와 결합한 CRUD API를 만듭니다.

better-sqlite3CRUDAPI
소요 시간
45~60분
난이도
📊 중급
선수 조건
🎯 db-03
결과물
Express + SQLite로 동작하는 책 목록 CRUD API

이 강의에서 배우는 것

  • 1better-sqlite3를 설치하고 DB를 연다
  • 2prepare로 쿼리를 컴파일한다
  • 3run/get/all 메서드를 적절히 사용한다
  • 4위치/이름 파라미터 바인딩으로 SQL 인젝션을 방지한다
  • 5ORM의 개념과 장단점을 이해한다

1. better-sqlite3 소개

  • 동기식(Synchronous) API — async/await 불필요
  • 빠른 성능
  • Prepared Statement로 SQL 인젝션 방지
  • TypeScript 타입 정의 내장
bash
npm install better-sqlite3
npm install express

2. 기본 사용법

javascript
const Database = require('better-sqlite3');
const db = new Database('library.db');  // 없으면 자동 생성

3. prepare / run / get / all

prepare — SQL 준비

javascript
const stmt = db.prepare('SELECT * FROM books WHERE id = ?');

run — INSERT/UPDATE/DELETE

javascript
const insert = db.prepare('INSERT INTO books (title, author) VALUES (?, ?)');
const result = insert.run('클린 코드', '로버트 마틴');

console.log(result.lastInsertRowid);  // 삽입된 행의 ID
console.log(result.changes);          // 영향받은 행 수

get — 단일 행

javascript
const book = db.prepare('SELECT * FROM books WHERE id = ?').get(1);
// { id: 1, title: '클린 코드', author: '로버트 마틴' } | undefined

all — 여러 행

javascript
const books = db.prepare('SELECT * FROM books WHERE category = ?').all('프로그래밍');
// 배열 (없으면 빈 배열)

4. 메서드 비교

메서드용도반환값
run()INSERT/UPDATE/DELETE{ lastInsertRowid, changes }
get()SELECT 단일객체 또는 undefined
all()SELECT 여러배열 (빈 배열 가능)

5. 파라미터 바인딩

javascript
// 위치 (?)
db.prepare('SELECT * FROM books WHERE price > ? AND category = ?').all(20000, '프로그래밍');

// 이름 (@)
db.prepare('SELECT * FROM books WHERE price > @minPrice AND category = @cat')
  .all({ minPrice: 20000, cat: '프로그래밍' });

절대 문자열 결합으로 쿼리 만들지 마세요. SQL 인젝션 위험.

6. 테이블 초기화

javascript
db.exec(`
    CREATE TABLE IF NOT EXISTS books (
        id      INTEGER PRIMARY KEY AUTOINCREMENT,
        title   TEXT    NOT NULL,
        author  TEXT    NOT NULL,
        price   INTEGER DEFAULT 0
    )
`);

7. ORM의 개념

SQL 방식

javascript
const book = db.prepare('SELECT * FROM books WHERE id = ?').get(1);

ORM 방식 (Prisma)

javascript
const book = await prisma.book.findUnique({ where: { id: 1 } });
  • 장점: SQL 직접 안 써도 됨, 타입 안전, 마이그레이션 도구
  • 단점: 복잡한 쿼리는 표현 어려움, 추가 학습 비용
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗