SQLite

덤프버전 :

분류

1. 개요
2. 비슷한 목적의 데이터베이스
3. 파생 프로젝트


공식 홈페이지


1. 개요[편집]


SQLite는 클라이언트 응용 프로그램에 임베디드되어 동작하는 DBMS 소프트웨어로서 퍼블릭 도메인 오픈 소스 소프트웨어이다. 안드로이드, iOS, macOS에 기본적으로 포함되어 있다. 각종 기기에 포함되어있다 보니 명실공히 전세계에서 가장 많이 쓰이는 데이터베이스이다. 공식적인 약칭은 아니지만 약칭은 SQL + 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]

지금까지 기능이나 성능이 낮다는 식으로 말했지만, 그렇다고 전세계에서 가장 많이 쓰이는 데이터베이스인 만큼 버그나 안정성에 문제가 있는 건 절대 아니다. SQLite 는 안정성이 절대적으로 요구되는 항공기에서도 쓰이는 데이터베이스이다. 코드는 FAA에서 요구하는 DO-178B 테스트를 만족하며, 이것은 코드의 모든 분기의 100% 테스트 통과가 포함된다.

구현 자체는 C/C++로 되어 있으나 라이브러리가 이미 수많은 언어로 나왔기 때문에, C\# 등 인지도가 있는 언어로 구현할 때에는 서드파티를 통해 사용할 수 있다.

경량 구현인 탓에 외부 라이브러리 의존도가 낮아 거의 C 컴파일러만 있으면 빌드가 가능한 수준이다.[6] 또한 SQLite 홈페이지에 가면 아말감버전이 있는데 다운받아 열어보면 소스 코드 2개와 헤더 파일 2개만 달랑 있는 심플한 구성을 자랑한다. 그 중 하나는 쉘 코드이므로 코어 파일만 필요하면 sqlite3.c 와 sqlite3.h 파일 두 개만 프로젝트에 복사해 놓으면 끝이다. 물론 아말감 버전은 코드를 번들링해놓은 것이고 실제 개발용 소스 코드는 많은 수의 파일로 되어 있다.[7] 다행히 번들링하면서 난독화를 하지는 않았기 때문에 주석도 제대로 달려 있고 들여쓰기도 정상적으로 되어 있다.

암호화 모듈인 SEE(SQLite Encryption Extension)가 공식 SQLite 암호화 모듈인데 이것은 상용 프로그램이라 무료 서드파티 암호화 모듈이 나와 있다. 일반적으로 SQLite 버전 의존성을 없애기 위해 별도로 배포하고 코드 패치 및 빌드 방법을 문서로 안내한다. 물론 SQLite와 통합해놓은 포크도 없는 것은 아니다.

패치 방법은 간단한 편인데 sqlite3의 소스 코드에 암호화 모듈을 위한 인터페이스가 노출돼있기 때문이다. 간단히 암호화 모듈을 사용한다는 스위치를 켜 주고 필요한 함수들(5개 정도)을 구현해 주면 암호화가 적용된다.


2. 비슷한 목적의 데이터베이스[편집]


  • Microsoft SQL Server Compact Edition, Local DB: MFC 및 .NET 계열에서 주로 사용
  • Firebird Embedded Server: Delphi 등 파스칼 계열의 언어에서 주로 사용
  • H2, HSQL, Apache Derby: JVM 환경에서 사용가능한 단일 파일 데이터베이스


3. 파생 프로젝트[편집]




파일:크리에이티브 커먼즈 라이선스__CC.png 이 문서의 내용 중 전체 또는 일부는 2023-11-03 15:24:13에 나무위키 SQLite 문서에서 가져왔습니다.

[1] 그래서 보통 에스큐엘+라이트 라고 읽는다.[2] General Dynamics에서 근무하면서 미사일 구축함에서 사용할 미 해군 소프트웨어 개발 프로젝트에 참여한 리차드 힙(Richard Hipp) 박사가 최초로 개발하였다.[3] 자바의 HashMap, 파이썬의 딕셔너리 등[4] 룩업 테이블 구현이 미숙해서 선형 탐색(리니어 서치) 알고리즘을 쓰고 있다면 O(n)이라는 처참한 성능이 나오므로 이 경우에는 SQLite가 훨씬 빠르다.[5] 빅 데이터 프로세싱용 테이블 룩업 작업에는 Redis/Memcached를 고려하자.[6] 리눅스의 경우 pthread와 dl라이브러리를 요구하는데 이 두 라이브러리는 멀티스레드 구현, 다이나믹 링커 라이브러리로서 리눅스의 표준 라이브러리이다.[7] 아말감 버전의 sqlite3.c 파일은 무려 211,864라인이나 된다. 상식적으로 개발자가 이런 무식하게 큰 파일로 개발하긴 어렵다.