🪶
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 express2. 기본 사용법
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: '로버트 마틴' } | undefinedall — 여러 행
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 직접 안 써도 됨, 타입 안전, 마이그레이션 도구
- 단점: 복잡한 쿼리는 표현 어려움, 추가 학습 비용