Featured image of post 모든 것에 PostgreSQL을 쓰지 마세요! SQLite의 임베디드 아키텍처와 제로 설정 장점은 무엇일까요? SQLite의 한계는 어디까지일까요? 언제 SQLite를 선택하고, 언제 PostgreSQL을 선택해야 할까요?

모든 것에 PostgreSQL을 쓰지 마세요! SQLite의 임베디드 아키텍처와 제로 설정 장점은 무엇일까요? SQLite의 한계는 어디까지일까요? 언제 SQLite를 선택하고, 언제 PostgreSQL을 선택해야 할까요?

SQLite는 단일 파일, 제로 설정, 서버 설치 불필요의 특징을 가진 세계에서 가장 널리 배포된 임베디드 데이터베이스 엔진입니다. SQLite와 PostgreSQL의 핵심 아키텍처 차이점, 각각의 활용 시나리오, 그리고 SQLite의 한계(동시 쓰기 잠금, 교차 서버 지원 불가, 권한 관리 부재)를 알아봅니다.

매일 열어보는 브라우저, 스마트폰의 메신저 앱, 심지어 바탕화면의 메모 도구 속에도 모두 동일한 경량 데이터베이스가 숨겨져 있다는 사실을 생각해 본 적이 있으신가요?

별도의 서버 소프트웨어를 설치할 필요도 없고, 계정이나 비밀번호 설정도 필요 없으며, 인터넷 연결조차 필요하지 않습니다. 그것은 그저 하나의 파일이며, 하드디스크에 조용히 누워 언제든지 서비스를 제공할 준비가 되어 있습니다.

이 조용하면서도 강력한 존재가 바로 SQLite입니다.

SQLite란 무엇일까요? 세계에서 가장 널리 배포된 데이터베이스

SQLite는 C 언어로 작성된 임베디드 관계형 데이터베이스 엔진입니다.

독립된 서버 프로세스 없이, 귀하의 애플리케이션에 직접 내장되어 동작합니다.

이는 우리에게 친숙한 PostgreSQL이나 MySQL과는 완전히 다릅니다. 전통적인 데이터베이스는 독립적으로 동작하는 서버이며, 프로그램은 **네트워크 프로토콜(TCP/IP)**을 통해 데이터베이스와 “통신"해야 합니다.

하지만 SQLite는 다릅니다. 그것은 단지 코드의 한 블록일 뿐이며, 애플리케이션 내부에서 직접 실행되어 하드디스크에 있는 .db 파일을 읽고 씁니다.

비교 기준 SQLite (임베디드) PostgreSQL (클라이언트-서버)
동작 방식 애플리케이션에 직접 내장, 독립 서버 없음 독립된 서버 프로세스, 네트워크 연결을 통해 동작
설정 요구사항 제로 설정, 설치 불필요, 계정 불필요 설치, 계정/비밀번호 설정 및 방화벽 설정 필요
데이터 저장 단일 크로스 플랫폼 파일 서버 디렉터리 내의 여러 파일
백업 방식 해당 파일을 직접 복사 pg_dump 등 전용 도구 사용 필요

바로 이러한 “플러그 앤 플레이” 특성 덕분에 SQLite는 세계에서 가장 널리 배포된 데이터베이스 엔진이 되었습니다.

Android 및 iOS 운영체제, Chrome 및 Firefox 브라우저부터 Adobe Lightroom, WhatsApp, 심지어 Airbus A350의 비행 시스템에 이르기까지 도처에서 그 모습을 찾아볼 수 있습니다.

Node.js에서 SQLite 사용하기

Node.js 개발자라면 SQLite를 사용하는 것이 매우 간단합니다. 컴퓨터에 어떠한 데이터베이스 서버 소프트웨어도 설치할 필요 없이, npm 패키지 하나만 설치하면 바로 시작할 수 있습니다.

현재 업계에서 가장 흔히 사용되는 선택지:

패키지 이름 특징 추천 시나리오
sqlite3 가장 오래됨, 비동기 API 지원 동시에 많은 비동기 작업을 처리해야 할 때
better-sqlite3 뛰어난 성능, 직관적인 API 디자인, 매우 빠름 최우선 추천, 개발 효율성과 실행 속도를 추구할 때

better-sqlite3를 사용하여 데이터베이스를 생성하고 쿼리하는 과정은 5분도 채 걸리지 않습니다:

const Database = require('better-sqlite3');
const db = new Database('my_project.db');

db.prepare('CREATE TABLE IF NOT EXISTS users (name TEXT, age INTEGER)').run();

const insert = db.prepare('INSERT INTO users (name, age) VALUES (?, ?)');
insert.run('John', 25);

const user = db.prepare('SELECT * FROM users WHERE name = ?').get('John');
console.log(user); // { name: 'John', age: 25 }

파일이 존재하지 않는 경우, better-sqlite3자동으로 파일을 생성해 줍니다.

SQLite가 지원하는 SQL 구문은 생각보다 강력합니다

많은 사람들이 SQLite가 매우 원시적이라고 생각하지만, 실제로는 다음과 같은 고급 기능을 포함하여 표준 SQL 구문의 대부분을 지원합니다:

구문 범주 지원 항목
기본 조작 SELECT, INSERT, UPDATE, DELETE
데이터 정의 CREATE TABLE, CREATE INDEX, CREATE VIEW
고급 조회 WITH (재귀 CTE), 윈도우 함수 (Window Functions)
충돌 처리 UPSERT (INSERT ... ON CONFLICT DO UPDATE)
JSON 처리 json_extract, json_array, json_object 등 내장 함수
트랜잭션 제어 BEGIN, COMMIT, ROLLBACK, SAVEPOINT
조인 조회 INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN

SQLite의 핵심 철학은 “작고 아름답게"입니다. 일상적으로 필요한 대부분의 SQL 기능을 지원하면서도 극도로 가벼운 상태를 유지합니다.

SQLite의 한계는 어디까지일까요?

가벼움에는 대가가 따릅니다. 만약 SQLite결제 카운터가 단 하나뿐인 동네 잡화점에 비유한다면, PostgreSQL50개의 계산대를 갖춘 코스트코와 같습니다.

1. 쓰기 병목 현상

SQLite는 데이터를 쓸 때 데이터베이스 파일 전체를 잠급니다.

화장실이 단 하나뿐인 식당을 상상해 보세요. 100명이 밖에서 동시에 메뉴판을 볼 수는 있지만(읽기), 단 1명이라도 들어가서 문을 잠그면(쓰기) 다른 모든 사람들은 줄을 서서 기다릴 수밖에 없습니다.

**WAL 모드(Write-Ahead Logging)**를 활성화하면 동시 읽기/쓰기 성능이 향상되지만, 본질적으로 여러 스레드가 서로 다른 데이터 행에 동시에 쓰는 것은 여전히 불가능합니다.

2. 여러 서버에 걸친 공유 불가

SQLite는 본질적으로 물리적인 하나의 파일입니다. 시스템을 여러 대의 서버에 배포하는 경우(수평 확장), 이 서버들이 동일한 파일을 안전하게 공유할 수 없습니다.

3. 세분화된 권한 관리의 부재

SQLite에는 ‘사용자 계정’이라는 개념이 없습니다. 운영체제 수준에서 해당 .db 파일에 접근해 읽을 수만 있다면, 누구나 모든 데이터를 확인하고 수정할 수 있습니다.

엄격한 개인정보 감사가 요구되는 비즈니스 시스템에서는 이를 받아들일 수 없습니다.

SQLite vs. PostgreSQL: 기술 선정 의사결정

도구에는 좋고 나쁨이 없으며, 오직 적합한가 그렇지 않은가만 존재합니다. 결정을 돕기 위한 궁극의 체크리스트를 확인해 보세요:

질문 답변이 “예” → SQLite 선택 답변이 “아니오” → PostgreSQL 선택
백엔드 서버가 단 한 대뿐이거나, 완전히 로컬에서만 실행되나요? 아니오 (수평 확장, 여러 장비가 필요함)
시스템 동작이 대부분 읽기 위주이며, 고주파 동시 쓰기가 없나요? 아니오 (동시에 여러 사용자가 쓰기를 경쟁함)
세분화된 계정 권한이나 고급 인덱스 기능이 필요 없나요? 아니오 (고급 기능에 깊이 의존함)

보다 구체적인 시나리오 대비:

시나리오 권장 선택 이유
데스크톱 소프트웨어, 모바일 앱, IoT 기기 SQLite 데이터가 기기를 따라 이동하며, 설치가 필요 없음
개인 블로그, 홍보용 쇼케이스 웹사이트 SQLite 읽기가 많고 쓰기가 적어 서버 유지 관리 비용 절감 가능
신속한 프로토타입 개발, 데모 SQLite 파일 하나만 만들면 바로 시작 가능
커뮤니티 포럼, 이커머스 플랫폼 PostgreSQL 높은 동시 쓰기가 발생하며, 행 수준 잠금이 필요함
여러 서버에 분산 배포 PostgreSQL 여러 장비 간에 데이터 소스를 공유해야 함
의료, 금융 등 민감한 시스템 PostgreSQL 역할 기반의 엄격한 권한 제어가 필요함

귀하의 데이터베이스는 주머니 속 수첩인가요, 아니면 중앙 교환기인가요?

데이터가 **“단일 장비, 정적, 단일 소유”**인 경우, SQLite를 선택하여 극도의 가벼움과 자유를 누리십시오.

데이터가 **“클라우드, 동적, 고도의 상호작용”**인 경우, PostgreSQL에 맡기십시오.

SQLite는 **“애플리케이션의 내부 컴포넌트”**라는 철학을 가지고 있으며, PostgreSQL은 **“시스템 아키텍처의 독립된 중심”**으로 위치합니다.

다음번에 아키텍처 의사결정을 내릴 때, 성급하게 PostgreSQL을 꺼내 들기 전에 먼저 스스로에게 질문해 보십시오:

“내 데이터베이스는 주머니 속 수첩인가요, 아니면 중앙 교환기인가요?”

답이 명확해지면 선택도 자연스럽게 확실해집니다.

Reference

All rights reserved,未經允許不得隨意轉載
Hugo로 만듦
JimmyStack 테마 사용 중