소규모 웹사이트에 적합하다고 알려진 SQLite도 실제 프로덕션 환경에서는 예상치 못한 운영 복잡성을 드러낼 수 있습니다. 한 개발자는 Django ORM을 사용하는 웹사이트에 SQLite를 적용하면서, 겉으로는 간단해 보이는 데이터베이스도 전문적인 운영 지식이 필요하다는 점을 깨달았습니다. 특히 쿼리 플래너 통계의 중요성, 대량 데이터 삭제 시의 문제점, 그리고 효율적인 백업 방식에 대한 고민들이 주요 경험으로 공유되었습니다.
가장 인상적인 경험은 4,000행 규모의 테이블에서 FTS5 전문 검색 쿼리가 5초나 걸리던 문제가 `ANALYZE` 명령 한 번으로 0.05초로 단축된 사례입니다. `ANALYZE`는 테이블 행 수 등 통계 정보를 생성하여 쿼리 플래너가 최적의 실행 계획을 세우도록 돕는데, 이처럼 기본적인 명령이 성능에 막대한 영향을 미칠 수 있음을 보여줍니다. 또한, 불필요한 행을 대량으로 삭제할 때 5초 이상 소요되면서 다른 쓰기 작업의 시간 초과와 서버 VM 종료까지 이어지는 연쇄적인 문제를 겪었으며, 이를 해결하기 위해 삭제 작업을 작은 배치(batch)로 나누어 처리하는 방식을 도입했습니다. 백업 방식으로는 `VACUUM INTO`와 `restic`을 사용하다 메모리 부족(OOM) 문제를 겪었고, 증분 백업의 효율성을 위해 `Litestream`을 시험 중인 것으로 나타났습니다. 이 개발자는 2022년부터 4년간 SQLite로 운영된 'Mess with DNS' 프로젝트에서 테이블을 여러 SQLite 파일로 분리하여 운영 효율을 높인 경험도 언급하며, 프로젝트 특성에 맞는 데이터베이스 선택의 중요성을 강조했습니다.
이러한 경험은 SQLite가 단순한 파일 기반 데이터베이스라는 인식과 달리, 실제 운영에서는 다른 관계형 데이터베이스와 마찬가지로 세심한 관리와 최적화가 필요하다는 점을 시사합니다. 특히 1인 개발자나 소규모 팀이 SQLite를 선택할 때, 초기 개발의 편리함 뒤에 숨겨진 운영상의 난이도를 간과해서는 안 됩니다. `ANALYZE`와 같은 기본적인 데이터베이스 명령어를 이해하고 활용하는 능력, 대량 작업 처리 시의 동시성 문제 해결, 그리고 안정적인 백업 및 복구 전략 수립은 서비스의 안정성과 성능을 좌우하는 핵심 요소입니다. 이 글은 SQLite를 프로덕션 환경에서 고려하는 모든 개발자에게 실질적인 운영 지식과 잠재적 문제에 대한 통찰을 제공하며, 기술 스택 선택 시 단순히 '작고 빠르다'는 표면적인 장점 외에 운영 복잡성까지 고려해야 함을 일깨워줍니다.