SQLite는 전 세계 앱, 브라우저, 기기를 구동합니다. 임베디드(내장)·서버리스 설계가 왜 유리한지: 단순성, 신뢰성, 속도, 이식성—그리고 한계까지 알아보세요.

SQLite는 애플리케이션이 링크해서 쓰는 라이브러리 형태의 작은 데이터베이스 엔진입니다—서비스로 "실행"하는 것이 아니라 애플리케이션에 포함되는 기능으로 생각하면 됩니다. 네트워크를 통해 별도의 데이터베이스 머신과 통신하는 대신, 앱은 디스크의 단일 데이터베이스 파일(보통 app.db 같은 파일)에 읽기/쓰기를 합니다.
"그냥 파일일 뿐"이라는 아이디어가 큰 매력입니다. 데이터베이스 파일 안에는 테이블, 인덱스, 데이터가 들어 있고, SQLite는 쿼리, 제약조건, 그리고 ACID 트랜잭션 같은 어려운 부분을 배후에서 처리합니다.
클라이언트-서버 데이터베이스(예: PostgreSQL, MySQL)를 쓰면 보통은:
SQLite는 데이터베이스가 애플리케이션 프로세스 안에서 동작합니다. 별도의 서버를 설치하거나 시작하거나 관리할 필요가 없습니다. 앱이 SQLite API를 호출하면 SQLite가 로컬 파일을 직접 읽고 씁니다.
사람들은 종종 SQLite를 “서버리스”라고 표현합니다. 이 말은 클라우드의 서버리스(관리하지 않아도 되는 서버 인프라)와는 다릅니다—SQLite의 서버리스는 당신이 별도의 데이터베이스 서버 프로세스를 관리하지 않는다는 의미입니다.
SQLite는 배포하기 쉽고 신뢰성이 높아 많은 일상 소프트웨어에 조용히 들어가 있습니다:
많은 제품이 간단한 기본값으로 SQLite를 선택합니다: 빠르고, 안정적이며, 설정이 필요 없습니다.
SQLite는 단일 사용자 앱, 임베디드 장치, 실제 제품이 된 프로토타입, 그리고 보통 수준의 쓰기 동시성을 가진 서비스에 매우 적합합니다. 다만 많은 머신이 동시에 같은 데이터베이스에 쓰기를 해야 하는 경우처럼 확장성 문제가 중요한 상황에서는 정답이 아닙니다.
핵심 요점: SQLite는 기능이 "작다"가 아니라 운영 부담이 "작다"는 것입니다. 그래서 사람들이 계속 선택하는 이유입니다.
SQLite는 두 단어로 자주 설명되는데, 이들은 실용적인 의미를 가집니다: 임베디드와 서버리스.
SQLite는 PostgreSQL이나 MySQL처럼 백그라운드에서 "실행"하는 무언가가 아닙니다. 그것은 애플리케이션이 링크해서 직접 사용하는 소프트웨어 라이브러리입니다.
앱이 데이터를 읽거나 써야 할 때 같은 프로세스 내에서 SQLite 함수를 호출합니다. 별도의 데이터베이스 데몬을 시작, 모니터, 패치, 재시작할 필요가 없습니다. 앱과 데이터베이스 엔진이 함께 존재합니다.
SQLite의 “서버리스”는 클라우드 공급자가 마케팅하는 "서버리스 데이터베이스"와 같지 않습니다.
클라이언트-서버 데이터베이스에서는 코드가 SQL을 TCP로 다른 프로세스에 전송합니다. SQLite에서는 코드가 언어 바인딩을 통해 라이브러리 호출로 SQL을 실행하고, SQLite가 데이터베이스 파일을 읽고 씁니다.
결과는: 네트워크 왕복 없음, 튜닝해야 할 커넥션 풀 없음, 그리고 "DB 호스트에 연결할 수 없음" 같은 실패 모드가 줄어듭니다.
많은 제품에서 "임베디드 + 서버리스"는 움직이는 부품이 줄어드는 것을 의미합니다:
이 단순성이 SQLite가 널리 사용되는 큰 이유입니다—팀들이 더 무거운 것을 선택할 수도 있는 상황에서도요.
SQLite의 가장 과소평가된 장점은 가장 단순한 것: 데이터베이스가 앱과 함께 이동하는 파일이라는 점입니다. 별도의 서버를 프로비저닝할 필요가 없고, 포트를 열 필요도, 사용자 계정을 만들 필요도, "데이터베이스가 실행 중인가?" 체크리스트도 없습니다.
클라이언트-서버 DB를 쓰면 앱을 배포한다는 것은 종종 인프라를 배포하는 것을 의미합니다: DB 인스턴스, 마이그레이션, 모니터링, 자격증명, 스케일 계획. SQLite에서는 일반적으로 초기 .db 파일을 패키지에 포함하거나 첫 실행에 생성하고, 앱이 그 파일을 직접 읽고 씁니다.
업데이트도 더 쉬워질 수 있습니다. 새 테이블이나 인덱스가 필요하면, 마이그레이션을 실행하는 애플리케이션 업데이트를 배포하면 됩니다. 많은 제품에서 이는 다단계 롤아웃을 하나의 릴리스 산출물로 바꿉니다.
이 "파일을 배포한다" 모델은 환경이 제약되거나 분산된 경우에 특히 빛을 발합니다:
데이터베이스 파일을 복사하는 것은 간단해 보이지만, 앱이 쓰기 중일 때 단순 파일 복사는 안전하지 않을 수 있습니다. SQLite의 백업 메커니즘을 사용하거나 일관된 스냅샷을 확보하고 백업을 내구성 있는 장소에 보관하세요.
관리할 서버가 없기 때문에 많은 팀이 운영 부담의 상당 부분을 피할 수 있습니다: DB 서비스 패치, 커넥션 풀 관리, 자격증명 회전, 레플리카 유지 같은 작업이 줄어듭니다. 물론 좋은 스키마 설계와 마이그레이션은 여전히 필요하지만, "데이터베이스 운영"의 발자국은 작아집니다.
SQLite의 인기에는 편의성 이상의 이유가 있습니다. 사람들이 신뢰하는 큰 이유는 SQLite가 "멋진" 기능보다 정확성을 우선하기 때문입니다. 많은 앱에서 가장 중요한 데이터베이스 기능은 단순합니다: 데이터를 잃거나 손상시키지 않는 것.
SQLite는 ACID 트랜잭션을 지원합니다. 이는 문제가 생겨도 데이터가 일관된 상태로 남는다는 뜻입니다.
SQLite는 저널을 사용해 충돌 안전성을 확보합니다—변경 예정인 내용을 기록해 깨끗하게 복구할 수 있게 하는 안전장치입니다.
두 가지 흔한 모드:
내부 동작을 몰라도 혜택을 볼 수 있습니다: 요점은 SQLite가 예측 가능하게 복구되도록 설계되었다는 것입니다.
많은 애플리케이션은 클러스터링이나 이국적 데이터 타입이 필요하지 않습니다. 정확한 기록, 안전한 업데이트, 그리고 크래시가 사용자 데이터를 조용히 손상시키지 않을 것이라는 확신이 필요합니다. "지루하지만 정확한" 접근이 "인상적이지만 복잡한" 것보다 나은 경우가 많고, 이것이 SQLite가 선택되는 큰 이유입니다.
SQLite는 앱이 데이터베이스와 인-프로세스로 대화하기 때문에 즉각적으로 느껴질 때가 많습니다. 별도의 DB 서버에 연결할 필요가 없고, TCP 핸드셰이크나 네트워크 지연이 없습니다. 쿼리는 로컬 파일을 읽는 함수 호출이며(운영체제 페이지 캐시가 도움을 줌), "SQL 실행"에서 "결과 반환"까지의 시간이 매우 짧을 수 있습니다.
많은 제품에서 워크로드는 주로 읽기이고 쓰기는 꾸준한 수준입니다: 앱 상태 로드, 검색, 필터링, 정렬, 중간 크기 테이블의 조인 등. SQLite는 이런 작업에 탁월합니다. 인덱스 조회, 빠른 범위 스캔, 로컬 저장소에 데이터가 잘 맞을 때 빠른 집계 등을 수행할 수 있습니다.
중간 수준의 쓰기 워크로드도 적합합니다—사용자 환경설정, 백그라운드 동기화 큐, 캐시된 API 응답, 이벤트 로그, 나중에 병합할 로컬 퍼스트 저장소 등이 그 예입니다.
SQLite의 트레이드오프는 쓰기 동시성입니다. 여러 리더는 지원하지만, 일관성을 유지하려면 쓰기를 조정해야 합니다. 많은 스레드/프로세스가 동시에 업데이트를 시도하면 락 경합이 발생하고 재시도나 "database is busy" 오류가 생길 수 있습니다. 이 경우 동작 패턴을 조정하고 튜닝해야 합니다.
쿼리가 잘못 작성되면 SQLite가 자동으로 빠르지 않습니다. 인덱스, 선택적인 WHERE 절, 불필요한 전체 테이블 스캔 회피, 적절한 범위의 트랜잭션 유지가 성능에 큰 차이를 만듭니다. 실제 데이터베이스처럼 다루세요—왜냐하면 실제 데이터베이스이기 때문입니다.
SQLite의 가장 특징적인 속성은 가장 단순한 속성이기도 합니다: 데이터베이스 전체가 단일 파일(선택적 사이드카 파일인 WAL 등 포함)입니다. 그 파일 안에 스키마, 데이터, 인덱스—앱에 필요한 모든 것이 들어 있습니다.
"그냥 파일"이기 때문에 이식성이 기본값입니다. 파일을 복사해 버그 리포트에 첨부하거나, 적절한 경우 팀원과 공유하거나, 서버를 설정하지 않고도 머신 간에 옮길 수 있습니다.
SQLite는 사실상 모든 주요 플랫폼에서 동작합니다: Windows, macOS, Linux, iOS, Android와 다양한 임베디드 환경까지. 이 크로스 플랫폼 지원은 장기적 안정성과 결합됩니다: SQLite는 하위호환성에 보수적이어서 수년 전에 생성된 DB 파일도 보통 새 버전에서 열 수 있습니다.
단일 파일 모델은 테스트에서 강력합니다. 알려진 데이터셋으로 단위 테스트를 실행하고 싶다면 작은 SQLite 파일을 체크인하거나 테스트 중 생성하면, 모든 개발자와 CI가 동일한 기준에서 시작합니다. 고객 이슈를 재현해야 한다면(적절한 개인정보 보호를 전제로) DB 파일을 받아 로컬에서 문제를 재현할 수 있습니다—"그들 서버에서만 발생"하는 미스터리가 줄어듭니다.
이식성은 양날의 검입니다: 파일이 삭제되거나 손상되면 데이터는 사라집니다. SQLite 데이터베이스를 중요한 애플리케이션 자산처럼 다루세요:
SQLite는 시작이 쉬운 이유 중 일부는 거의 제로에서 시작할 필요가 없기 때문입니다. 많은 플랫폼에 내장되어 있고, 일반적인 언어 런타임과 함께 제공되며 다양한 환경에서 "지루한" 호환성이 보장됩니다—앱에 임베디드하는 DB로는 원하는 특성입니다.
대부분의 스택은 이미 SQLite로 가는 길이 잘 닦여 있습니다:
sqlite3 표준 라이브러리), Go(mattn/go-sqlite3), Java(JDBC 드라이버), .NET(Microsoft.Data.Sqlite), PHP(PDO SQLite), Node.js(better-sqlite3, sqlite3).이 폭넓음은 팀이 익숙한 패턴(마이그레이션, 쿼리 빌더, 커넥션 관리)을 그대로 사용할 수 있게 해 줍니다.
SQLite의 도구 생태계는 접근성이 높습니다. sqlite3 CLI로 테이블을 살펴보고 쿼리를 실행하거나 데이터를 덤프하고 CSV를 가져올 수 있습니다. 시각적 탐색을 위해 SQLiteStudio나 DB Browser for SQLite 같은 데스크톱/브라우저 기반 뷰어가 비전문가도 데이터를 빠르게 검증하게 합니다.
배포 측면에서 주류 마이그레이션 도구들은 보통 SQLite를 기본적으로 지원합니다: Rails 마이그레이션, Django 마이그레이션, Flyway/Liquibase, Alembic, Prisma Migrate 등은 스키마 변경을 반복 가능하게 만들어 줍니다.
SQLite가 널리 배포되었기 때문에 문제들은 잘 이해되어 있습니다: 라이브러리들이 충분히 실전에서 검증되고, 에지 케이스가 문서화되며, 커뮤니티 예제가 풍부합니다. 인기 덕분에 지원이 더 많아지고 채택이 더 쉬워집니다.
라이브러리를 고를 때는 스택에서 활발히 유지되는 드라이버/ORM 어댑터를 선호하고, 동시성 동작, 바인딩 지원, 마이그레이션 처리 방식을 확인하세요. 잘 지원되는 통합은 순조로운 롤아웃과 주말을 망쳐놓는 이슈의 차이를 만듭니다.
SQLite는 전체 데이터베이스 서버를 쓰면 비용, 복잡성, 실패 모드가 추가되는 곳에 자주 등장합니다.
많은 모바일 앱은 사용자 세션, 캐시된 콘텐츠, 노트, 혹은 "나중에 업로드할 항목" 큐 등 신뢰할 수 있는 로컬 저장소가 필요합니다. SQLite는 단일 파일 DB이자 ACID 트랜잭션을 제공하기 때문에 크래시나 저전력 종료, 불안정한 연결 상황에서도 데이터를 보존합니다.
오프라인 퍼스트·로컬 퍼스트 앱에서 특히 강력합니다: 모든 변경을 로컬에 쓰고 네트워크가 가능해지면 백그라운드에서 동기화합니다. 이점은 단순한 오프라인 지원을 넘어서 UI의 빠른 응답과 예측 가능한 동작을 제공합니다.
데스크톱 소프트웨어는 종종 사용자가 아무것도 설정하지 않아도 되는 데이터베이스가 필요합니다. 단일 SQLite 파일을 배포하거나 첫 실행 시 생성하면 설치가 단순해지고 백업도 파일 하나를 복사하면 됩니다.
회계 도구, 미디어 관리자, 가벼운 CRM 스타일 시스템 등은 데이터를 앱 가까이에 두어 성능을 높이고 "DB 서버가 실행 중인가요?" 같은 문제를 피합니다.
개발자 도구나 히스토리, 인덱스, 메타데이터 같은 구조화된 저장소가 필요한 앱에서도 SQLite가 사용됩니다. 별도 프로세스가 필요 없고 안정적이며 이식성이 좋아 선호됩니다.
라우터, 키오스크, POS 단말기, IoT 게이트웨이는 설정, 로그, 작은 데이터셋을 로컬에 저장하는 경우가 많습니다. SQLite의 작은 풋프린트와 파일 기반 이식성은 배포와 업데이트를 실용적으로 만들어 줍니다.
개발자들은 빠른 프로토타이핑, 로컬 개발 DB, 테스트 픽스처로 SQLite를 사용합니다. 설정이 필요 없고 리셋이 쉬우며 결정론적이어서 반복 속도를 높이고 CI 신뢰도를 올립니다.
이 패턴은 Koder.ai 같은 곳에서도 흔합니다: 팀들은 빠른 로컬 반복을 위해 SQLite로 시작하고(또는 단일 테넌트 배포로) 필요하면 PostgreSQL로 옮깁니다. "단순하게 시작하고 필요하면 마이그레이션"하는 접근은 초기 배달을 빠르게 하면서도 나중에 골치 아픈 상황에 빠지지 않게 해줍니다.
SQLite는 로컬 저장소에 훌륭한 기본값이지만 만능은 아닙니다. 워크로드와 운영 요구를 기준으로 판단하세요—유행에 따라 선택하지 마세요.
SQLite는 여러 리더를 잘 처리하지만, 쓰기는 파일의 일관성을 유지하기 위해 직렬화되어야 합니다. 많은 사용자나 프로세스가 동시에 데이터를 수정해야 한다면(특히 서로 다른 머신에서), PostgreSQL이나 MySQL 같은 클라이언트-서버 DB가 더 적합합니다.
일반적인 신호는 "노트북에서는 다 괜찮은데 실제 사용에서는 타임아웃, 락 경합, 쓰기 대기 큐가 생긴다"는 것입니다.
SQLite는 매우 빠를 수 있지만 읽기 중심과 적당한 쓰기 빈도에 최적화되어 있습니다. 고빈도 삽입/업데이트(메트릭 수집, 이벤트 스트림, 잡 큐, 대량 로그)와 많은 병렬 작성자가 필요한 경우 서버 DB가 더 예측 가능하게 확장됩니다.
이는 단지 "속도" 문제가 아니라 지연 일관성(latency consistency) 문제이기도 합니다: 쓰기 급증이 다른 쓰기나 읽기를 막아 설명하기 어려운 꼬리 지연을 만들 수 있습니다.
역할 기반 권한, 변경 감사, 중앙 관리 백업, 시점 복구 같은 기능이 필요하면 SQLite는 대개 부적절합니다. 네트워크 공유에 DB 파일을 올려두는 방법도 있지만 신뢰성 및 락 문제를 일으키는 경향이 있습니다.
서버 데이터베이스가 빛나는 상황:
두 가지 질문을 해보세요:
정직한 답이 "많은 쓰기"와 "중앙 거버넌스 필요"라면 클라이언트-서버 데이터베이스를 선택하는 것이 과한 것이 아니라 보통 더 안전하고 단순한 길입니다.
SQLite와 PostgreSQL/ MySQL 같은 DB는 테이블을 저장하고 SQL을 실행할 수 있지만 서로 다른 문제 형태에 맞춰 설계되었습니다.
SQLite는 애플리케이션 프로세스 안에서 실행됩니다. 코드가 SQLite를 호출하면 SQLite가 로컬 데이터베이스 파일을 직접 읽고 씁니다.
클라이언트-서버 DB는 별도 서비스로 동작합니다. 앱은 네트워크(심지어 로컬호스트일지라도)를 통해 연결해 쿼리를 전송하고, 서버가 저장소, 동시성, 사용자 관리, 백그라운드 작업을 담당합니다.
이 한 가지 차이가 대부분의 실용적 트레이드오프를 설명합니다.
SQLite는 배포가 바이너리와 파일을 배포하는 것만큼 단순할 수 있습니다. 포트나 자격증명, 서버 업그레이드가 없어 데스크톱·모바일·엣지·로컬 퍼스트 제품에 큰 이점입니다.
클라이언트-서버 DB는 여러 앱과 사용자가 동일 DB를 사용하는 상황에서 중앙 관리에 강합니다: 원격 접근, 권한, 온라인 백업, 리드 레플리카, 성숙한 관찰성 등.
SQLite는 보통 다음으로 확장합니다:
클라이언트-서버 DB는 큰 인스턴스, 복제, 파티셔닝, 풀링으로 공유 워크로드를 더 쉽게 확장합니다.
확신이 서지 않는다면, 배달 속도를 위해 SQLite로 시작하고 PostgreSQL로 옮길 수 있게 명확한 마이그레이션 경로(스키마, 마이그레이션, 내보내기/가져오기)를 준비하세요 (/blog/migrating-from-sqlite).
SQLite는 운영 환경에서 잘 동작할 수 있지만, "그냥 임시 파일"이 아니라 진짜 데이터베이스로 다루어야 합니다. 몇 가지 습관이 원활한 운영과 예기치 않은 다운타임 사이의 차이를 만듭니다.
SQLite는 여러 리더와 보통 한 명의 라이터를 지원합니다. 대부분의 앱에서는 쓰기를 설계만 잘 하면 충분합니다.
쓰기 트랜잭션은 짧고 집중적으로 유지하세요: 앱에서 작업을 준비한 뒤 트랜잭션을 열고, 빠르게 쓰고, 커밋하세요. 사용자 입력이나 네트워크 호출 같은 느린 작업을 트랜잭션 안에 두지 마세요. 백그라운드 작업이 있다면 쓰기가 쌓이지 않도록 큐잉하세요.
Write-Ahead Logging(WAL)은 변경 기록 방식을 달리해 읽기가 라이터가 활동 중일 때도 계속될 수 있게 합니다. 많은 읽기와 가끔 쓰기가 있는 앱에서는 WAL이 "DB가 잠김" 문제를 줄이고 처리량을 높이는 데 도움이 됩니다.
WAL이 마법은 아닙니다: 여전히 한 번에 하나의 라이터를 가지며 WAL 파일이 디스크에 추가로 생긴다는 점을 고려해야 합니다. 그러나 생산 환경에서 흔히 사용되는 실용적 기본값입니다.
SQLite가 단일 파일이라고 해서 백업 전략이 필요 없다는 뜻은 아닙니다. 임의 시간에 파일을 복사하는 것에 의존하지 말고(특히 로드가 있을 때) 일관된 상태를 캡처하도록 백업을 조정하세요.
스키마 변경도 마찬가지입니다. 마이그레이션을 버전 관리하고 배포 중 자동으로 실행하며, 가능하면 롤백/전진 경로를 테스트하세요.
스테이징과 자동화 테스트에서 동일한 스키마, 인덱스, 중요한 설정(예: 저널 모드)을 사용하세요. 많은 SQLite 관련 놀라움은 데이터 크기가 커지거나 동시성이 증가할 때만 드러납니다. 출시 전에 현실적 볼륨과 접근 패턴으로 부하 테스트하세요.
SQLite가 널리 쓰이는 이유는 데이터를 라이브러리처럼 사용하는 느낌을 주기 때문입니다—인프라를 운영하는 대신, 성숙한 SQL 엔진, ACID 트랜잭션, 풍부한 도구를 얻으면서도 별도 DB 서버를 프로비저닝하거나 사용자 관리를 하거나 네트워크 연결을 돌볼 필요가 없습니다.
최고일 때 SQLite는 "그냥 동작하는" 옵션입니다:
SQLite는 높은 쓰기 동시성이나 네트워크를 통한 중앙화된 다중 사용자 접근을 위해 설계된 것은 아닙니다. 여러 리더는 괜찮지만, 동시 쓰기가 많은 상황(또는 많은 클라이언트가 하나의 DB 파일을 공유하려는 상황)은 보통 클라이언트-서버 DB가 더 안전한 선택입니다.
먼저 워크로드를 설명하세요—그다음에 그에 맞는 가장 단순한 도구를 선택하세요. 앱이 대부분 로컬, 단일 사용자, 또는 "로컬 퍼스트"라면 SQLite가 종종 완벽한 기본값입니다.
처음 네 가지에 "예", 마지막 하나에 "아니오"라면 SQLite는 강력한 기본 선택입니다.
SQLite는 임베디드 데이터베이스 엔진으로, 애플리케이션 프로세스 안에서 라이브러리로 동작합니다. 애플리케이션은 디스크상의 단일 데이터베이스 파일(예: app.db)을 직접 읽고 씁니다—따로 설치하거나 관리할 DB 서비스가 필요 없습니다.
SQLite에서의 “서버리스”는 별도의 데이터베이스 서버 프로세스가 없다는 뜻입니다. "클라우드 서버리스"처럼 서버가 아예 없는 것이 아니라, 관리해야 할 별도 DB 서버가 존재하지 않는다는 의미입니다. 애플리케이션이 프로세스 내에서 SQLite API를 호출하고, SQLite는 로컬 파일에 데이터를 저장합니다.
대부분의 경우 프로비저닝이 필요 없습니다. 애플리케이션과 함께 초기 .db 파일을 배포하거나 첫 실행 시 생성하면 되고, 마이그레이션은 앱 업데이트의 일부로 실행하면 됩니다. 인프라 단계가 많던 롤아웃이 단일 릴리스 산출물로 줄어드는 경우가 많습니다.
네. SQLite는 ACID 트랜잭션을 지원해 충돌이나 전원 손실 상황에서도 부분 쓰기나 데이터 손상을 방지하도록 설계되어 있습니다.
SQLite는 중단 상황에서 안전하게 복구하기 위해 **저널(journal)**을 사용합니다.
많은 프로덕션 환경에서 WAL을 선택하면 “데이터베이스가 잠겼다”는 마찰을 줄이는 데 도움이 됩니다.
SQLite가 빠르게 느껴지는 이유는 인-프로세스로 동작하기 때문입니다: 쿼리가 네트워크 왕복이 아니라 함수 호출 수준에서 처리됩니다. 로컬 디스크와 운영체제 페이지 캐시 덕분에 검색, 필터링, 인덱스 조회 같은 읽기 중심 워크로드는 특히 빠르게 동작합니다.
SQLite는 여러 **리더(읽기)**를 잘 지원하지만, 쓰기는 일관성을 위해 조정이 필요합니다. 많은 병렬 쓰기가 발생하면 락 경합(lock contention)이 생기고 database is busy 또는 database is locked 오류가 발생할 수 있습니다. 이를 피하려면 쓰기 동작을 직렬화하고 트랜잭션을 짧게 유지하세요.
여러 머신/서비스가 동일한 데이터베이스에 동시에 쓰기해야 하거나 중앙 집중식 거버넌스(권한 관리, 감사, 복제 등)가 필요하면 SQLite는 적절하지 않습니다.
이럴 때는 PostgreSQL이나 MySQL 같은 클라이언트-서버 DB를 선택하세요:
데이터베이스 파일을 중요한 애플리케이션 자산으로 다루세요.
초기에 SQLite로 시작하고, 쓰기 동시성이 필요해지면 서버 DB로 이전하는 패턴이 일반적입니다.
실용적인 팁: