SQLite
공식 홈페이지
1. 개요
SQLite는 클라이언트 응용 프로그램에 임베디드되어 동작하는 오픈 소스 DBMS의 일종이다. 안드로이드, iOS, macOS에 기본적으로 포함되어 있다. 공식적인 약칭은 아니지만 약칭은 '''SQ'''L + '''Lite'''(Light).[1]
그래서 SQL에서 하는 기능이 SQLite에선 '경량화'의 이유로 제한되는 경우가 많다. 예를 들자면, 프로토콜 조작을 통해 네트워크에 접근할 수는 있지만, 동시 접근은 제한된다. 또한 복잡하거나 큰 데이터를 보관하는 데에는 적절하지 않다. 인코딩 역시 유니코드만 사용할 수 있어, 사용 인코딩이 유니코드가 아닌 경우에는 占쏙옙을 잔뜩 맛볼 수 있다. 사실 개발 당시부터 이지스함에서 구동되던 탓[2] 에 자질구레한 기능은 원래부터 제거되어 있었다. 그래서 그런지 현재는 퍼블릭 도메인으로 풀린 상태.
데이터베이스 전체를 파일 하나에 저장하기 때문에, 파일을 통째로 복사하면 백업이 끝난다. 또한 모든 기능을 라이브러리 내에서 구동할 수 있기 때문에, 따로 미들웨어를 쓰지 않아도 프로그램에 라이브러리만 포함시켜 사용할 수 있다. 표준 SQL 문법을 지원하기 때문에 따로 학습해야 하는 것도 별로 없다. 다만 성능은 '라이트'에 맞게 열화되었으므로, 그리 큰 기대는 하지 않는 것이 좋다.
한 번에 한 명의 사용자만이 데이터베이스를 사용할 수 있어서 멀티 유저를 지원하려면 프록시 계층을 도입해야 한다. 멀티테넌트 분산도 지원하지 않고 기가 단위의 데이터를 다루기에도 영 좋지 않다. 이 정도로 크고 무거운 환경에는 다른 DBMS 제품(MariaDB 등)을 선택해야 한다. SQLite는 '임베디드 SQL 지원 데이터베이스'에 특화돼있다. 간단한 룩업 테이블 구현으로 버티기에는 무리가 있지만 그렇다고 미들웨어를 도입해야 할 정도로 거대하지는 않은, 어중간하게 큰 데이터를 다루는 데에 쓰기 좋다. 만약 테이블 조인(Join)을 자주 써야 한다거나 두 개 이상의 필드에 대해 빠른 검색이 필요하면 룩업 테이블 구현[3] 으로 골치썩지 말고 SQLite를 도입하는 게 나을 수도 있다.
다만 룩업 테이블 구현보다 성능이 많이 저하되는데 SQL파서가 까먹는 성능이 제법 된다. 인덱스 검색 속도 역시 룩업 테이블은 보통 해시 탐색 알고리즘을 사용해서 O(1)이지만 SQLite의 인덱스는 B-Tree 탐색 알고리즘이라 O(log n)의 성능으로 떨어진다.[4] 또한 룩업 테이블은 전체가 메모리에 올라가 있는 반면에 SQLite는 파일 작업이 들어가므로 여기서 성능을 또 대폭 까먹는다. 따라서 대규모 배치 잡(Batch job)에 SQLite는 좋은 선택이 아니다.[5]
구현 자체는 C/C++로 되어 있으나 라이브러리가 이미 수많은 언어로 나왔기 때문에, C\# 등 인지도가 있는 언어로 구현할 때에는 서드파티를 통해 사용할 수 있다.
경량 구현인 탓에 외부 라이브러리 의존도가 낮아 거의 C 컴파일러만 있으면 빌드가 가능한 수준이다.[6] 또한 SQLite 홈페이지에 가면 '''아말감'''버전이 있는데 다운받아 열어보면 소스 코드 2개와 헤더 파일 2개만 달랑 있는 심플한 구성을 자랑한다. 그 중 하나는 쉘 코드이므로 코어 파일만 필요하면 sqlite3.c 와 sqlite3.h 파일 두 개만 프로젝트에 복사해 놓으면 끝이다. 물론 아말감 버전은 코드를 번들링해놓은 것이고 실제 개발용 소스 코드는 많은 수의 파일로 되어 있다.[7] 다행히 번들링하면서 난독화를 하지는 않았기 때문에 주석도 제대로 달려 있고 들여쓰기도 정상적으로 되어 있다.
암호화 모듈인 SEE(SQLite Encryption Extension)가 공식 SQLite 암호화 모듈인데 이것은 상용 프로그램이라 무료 서드파티 암호화 모듈이 나와 있다. 다만 암호화를 적용한 코드를 배포하는 것은 라이센스 위반이므로 해당 암호화 모듈의 홈페이지에는 코드 패치 및 빌드 방법을 문서로 안내하고 있다. 최종 사용자가 직접 코드를 패치해서 빌드하는 것은 합법이다. 패치 방법도 간단한 편인데 sqlite3의 소스 코드에 암호화 모듈을 위한 인터페이스가 노출돼있기 때문이다. 간단히 암호화 모듈을 사용한다는 스위치를 켜 주고 필요한 함수들(5개 정도)을 구현해 주면 암호화가 적용된다.
2. 비슷한 목적의 데이터베이스
- Microsoft SQL Server Compact Edition, Local DB: MFC 및 .NET 계열에서 주로 사용
- Firebird Embedded Server: Delphi 등 파스칼 계열의 언어에서 주로 사용
- H2, HSQL, Apache Derby: JVM 환경에서 사용가능한 단일 파일 데이터베이스
3. 파생 프로젝트
- Fossil SCM: SQLite 기반으로 돌아가는 분산형 소스 코드 버전 관리 시스템.
[1] 그래서 보통 에스큐엘+라이트 라고 읽는다.[2] General Dynamics에서 근무하면서 미사일 구축함에서 사용할 미 해군 소프트웨어 개발 프로젝트에 참여한 리차드 힙(Richard Hipp) 박사가 최초로 개발하였다.[3] 자바의 HashMap, 파이썬의 딕셔너리 등[4] 룩업 테이블 구현이 미숙해서 선형 탐색(리니어 서치) 알고리즘을 쓰고 있다면 O(n)이라는 처참한 성능이 나오므로 이 경우에는 SQLite가 훨씬 빠르다.[5] 빅 데이터 프로세싱용 테이블 룩업 작업에는 Redis/Memcached를 고려하자.[6] pthread와 dl라이브러리를 요구하는데 이 두 라이브러리는 멀티스레드 구현, 다이나믹 링커 라이브러리로서 운영체제의 표준 라이브러리이다.[7] 아말감 버전의 sqlite3.c 파일은 무려 211,864라인이나 된다. 상식적으로 개발자가 이런 무식하게 큰 파일로 개발하긴 어렵다.