SQLite의 르네상스, 왜 다시 주목받나
PostgreSQL만 쓰던 개발자가 사이드 프로젝트에서 SQLite를 써보고 놀란 이야기
"SQLite? 그거 모바일용 아니야?"
동료한테 "사이드 프로젝트 DB를 SQLite로 했다"고 말했더니 이 반응이 돌아왔다. 솔직히 나도 1년 전까지는 같은 생각이었다. SQLite는 안드로이드 로컬 DB거나, 개발 환경에서 잠깐 쓰는 거. 프로덕션? 말도 안 되지.
근데 요즘 분위기가 좀 다르다.
무슨 일이 일어나고 있나
Turso, Litestream, LiteFS, Cloudflare D1. 2024년부터 SQLite 기반 서비스가 쏟아지고 있다. Rails 8이 기본 DB를 SQLite로 바꿨다. Laravel도 SQLite 지원을 강화했다. 트위터에서 "SQLite in production"이 더 이상 밈이 아니게 됐다.
왜 갑자기? 몇 가지 이유가 있다.
첫째, 서버리스/엣지 컴퓨팅. Cloudflare Workers나 Vercel Edge Functions 같은 환경에서 PostgreSQL 연결은 비효율적이다. 커넥션 풀링, Cold Start, 네트워크 레이턴시. SQLite는 파일 하나니까 이런 문제가 없다.
둘째, 단순함. PostgreSQL을 세팅하려면 서버가 필요하다. Docker를 돌리거나 RDS를 켜야 한다. SQLite는 그냥 파일이다. 백업? 파일 복사하면 된다.
직접 써봤다
사이드 프로젝트로 "읽은 책 기록 앱"을 만들었다. Next.js + Drizzle ORM + SQLite. Better-sqlite3를 드라이버로 썼다.
설치가 허무할 정도로 쉽다. npm install better-sqlite3 drizzle-orm 두 개면 끝이다. 데이터베이스 서버를 띄울 필요가 없다. 프로젝트 루트에 data.db 파일이 하나 생기는 거다.
Drizzle로 스키마를 정의하고 마이그레이션을 돌리는 것도 PostgreSQL이랑 거의 같다. ORM 레이어에서 차이가 거의 안 느껴진다.
const books = sqliteTable('books', {
id: integer('id').primaryKey({ autoIncrement: true }),
title: text('title').notNull(),
author: text('author').notNull(),
finishedAt: text('finished_at'),
rating: integer('rating'),
});이거 PostgreSQL이라고 해도 믿을 수준이다.
성능이 놀라웠다
벤치마크를 돌려봤다. 책 1,000건을 INSERT하는 데 43ms. 같은 데이터를 PostgreSQL (Docker, 로컬)에서 INSERT하면 187ms. SQLite가 4배 이상 빠르다. 네트워크를 안 타니까 당연하다.
SELECT도 비슷하다. 1,000건 전체 조회에 2ms. PostgreSQL은 8ms. 조인이 들어가면 격차가 좀 줄어드는데, 그래도 SQLite가 빠르다.
근데 이건 단일 사용자 기준이다. 동시 접속이 많아지면 이야기가 달라진다.
한계가 분명하다
SQLite는 쓰기 잠금이 파일 레벨이다. WAL 모드를 켜면 읽기와 쓰기를 동시에 할 수 있지만, 동시 쓰기는 여전히 안 된다. 사용자가 100명쯤 되면 쓰기 충돌이 발생할 수 있다.
내 사이드 프로젝트는 사용자가 나 혼자니까 이 문제가 없다. (사실 이게 슬픈 거다.)
그리고 JSON 쿼리 지원이 PostgreSQL보다 약하다. jsonb 같은 건 없고 json_extract로 조회하는 방식인데, 복잡한 JSON 쿼리는 불편하다.
풀텍스트 검색은 FTS5 확장으로 가능한데, PostgreSQL의 ts_vector보다는 기능이 적다.
Turso라는 선택지
Turso는 SQLite를 네트워크 너머에서 쓸 수 있게 해주는 서비스다. libSQL이라는 SQLite 포크를 쓴다. 엣지에 복제본을 두어서 읽기 성능이 좋다고 한다.
무료 플랜이 꽤 넉넉하다. 9GB 스토리지, 500개 DB. 사이드 프로젝트에 충분하다. 근데 직접 써보니까 레이턴시가 로컬 SQLite보다는 느리다. 당연하지만. 네트워크를 타니까.
"그러면 그냥 PostgreSQL 쓰면 되지 않냐"는 합리적인 질문이다. 맞다. Turso의 장점은 엣지 배포가 편하다는 건데, 이게 필요한 규모가 아니면 과한 선택이다.
그래서 SQLite를 프로덕션에 쓸 수 있나
내 답은 "조건부 예"다.
쓸 수 있는 경우: 사용자가 적은 서비스, 읽기 위주 앱, 개인 프로젝트, 내부 도구. 블로그, 문서 사이트, 어드민 패널 같은 거.
안 되는 경우: 동시 쓰기가 많은 서비스, 대용량 데이터, 여러 서버에서 접근해야 하는 경우.
대부분의 사이드 프로젝트는 전자에 해당한다. 그리고 솔직히 대부분의 스타트업 초기 서비스도 전자에 해당한다. PostgreSQL이 필요해지는 순간은 생각보다 늦게 온다.
이제 새 사이드 프로젝트를 시작할 때 기본 DB가 SQLite다. PostgreSQL은 필요해지면 그때 바꾸면 된다. 마이그레이션이 좀 귀찮긴 하겠지만, 필요 없는 복잡함을 처음부터 가져가는 것보다는 낫다.