설명
SQLite는 응용 프로그램에 직접 통합될 수 있도록 설계된 오픈 소스 경량 관계형 데이터베이스로, 전용 서버 없이 데이터 저장 및 관리에 대한 효율적인 솔루션을 제공합니다.
SQLite란 무엇인가요?
SQLite는 C로 작성된 데이터베이스 라이브러리로, 서버가 필요 없는 자급자족 형식의 완전한 SQL 관계형 데이터베이스 엔진을 구현합니다. 전체 데이터베이스(테이블, 인덱스, 데이터 등)를 디스크의 단일 파일에 저장하여 이동성과 다양한 시스템에서의 사용을 용이하게 합니다. 2000년에 D. Richard Hipp에 의해 만들어진 SQLite는 모바일 애플리케이션, 임베디드 시스템, 웹 브라우저 및 데스크탑 소프트웨어와 같이 로컬 데이터베이스가 필요한 애플리케이션에서 널리 사용됩니다.
주요 특징
- 서버리스:
- MySQL이나 PostgreSQL과 같은 데이터베이스와 달리, SQLite는 별도의 서버 프로세스를 필요로 하지 않습니다. 라이브러리가 응용 프로그램에 직접 통합되어 데이터베이스 파일에 대한 함수 호출로 접근합니다. 이는 오버헤드를 줄이고 설정을 단순화합니다.
- 자급자족:
- SQLite는 외부 라이브러리(표준 C 라이브러리 제외)에 의존하지 않으며, 작동에 필요한 모든 것을 포함하고 있습니다. 따라서 자원이 제한된 환경(임베디드 장치 등)에 적합합니다.
- 단일 파일:
- 데이터, 스키마 및 인덱스를 포함한 모든 데이터베이스는 .db 또는 .sqlite 확장자를 가진 단일 파일에 저장됩니다. 이 파일은 이식성이 뛰어나며, SQLite 아키텍처와 호환되는 시스템 간에 쉽게 복사하거나 이동할 수 있습니다.
- ACID 트랜잭션:
- SQLite는 ACID(Atomicity, Consistency, Isolation, Durability) 속성을 가진 트랜잭션을 지원하여, 전원 장애와 같은 실패 상황에서도 읽기 및 쓰기 작업의 신뢰성을 보장합니다.
- 표준 SQL 지원:
- SQLite는 테이블, 인덱스, 기본 키 및 외래 키, 트리거, 뷰 및 서브쿼리를 포함하여 SQL 표준( SQL92, 확장 포함)의 대부분을 구현합니다. 그러나 ALTER TABLE에 대한 부분 지원 및 RIGHT OUTER JOIN과 FULL OUTER JOIN에 대한 지원이 부족하는 등의 몇 가지 제한사항이 있습니다.
- 동적 타입:
- 다른 관계형 데이터베이스와 달리 SQLite는 동적 타입을 사용하여 한 열에 서로 다른 유형의 값(예: 정수, 텍스트 또는 널)을 저장할 수 있도록 합니다. 저장소를 안내하기 위해 "타입 친화도" (INTEGER, TEXT, BLOB 등)를 정의하지만, 엄격한 제약 조건을 두지 않습니다.
- 가볍고 빠름:
- SQLite는 약 700KB의 라이브러리 크기로 매우 효율적입니다. 그는 중간 규모의 데이터에서 읽기 및 쓰기 작업을 위한 최적화를 제공하며, 낮은 동시성 환경에서도 다른 시스템과 비슷하거나 더 나은 성능을 보입니다.
- 퍼블릭 도메인 라이선스:
- SQLite는 퍼블릭 도메인으로, 상업 프로젝트나 오픈 소스 프로젝트에서 라이선스 제약 없이 자유롭게 사용할 수 있습니다.
내부 작동 방식
- 아키텍처:
- SQLite는 응용 프로그램 내에 내장된 라이브러리로 작동하며, 데이터베이스 파일을 관리하기 위해 직접 호출을 수행합니다. 그는 SQL 분석기, 쿼리 최적화기 및 저장소 관리자를 포함하는 내부 데이터베이스 엔진을 사용합니다.
- 저장은 일반적으로 4KB의 고정 크기 디스크 페이지를 사용하는 효율적인 이진 파일 포맷에 기반하여 데이터와 인덱스를 B+ 트리 구조로 구성합니다.
- 동시성:
- SQLite는 동일한 데이터베이스에 대한 여러 연결을 지원하지만 몇 가지 제한이 있습니다. 파일 잠금을 사용하여 동시성을 관리하며, 한 번에 하나의 쓰기 작업만 허용됩니다(직렬화). 읽기는 동시로 가능하지만, 쓰기는 다른 작업을 차단합니다.
- 버전 3.7.0부터, SQLite는 쓰기 작업 중에 동시 읽기를 허용하여 동시성을 개선하는 WAL(Write-Ahead Logging) 모드를 지원하지만, 여전히 한 번에 하나의 쓰기만 허용합니다.
- 확장성:
- SQLite는 사용자 정의 함수(UDF)를 C 또는 다른 언어로 추가할 수 있는 기능을 제공하며, 고급 텍스트 검색을 위한 FTS(Full-Text Search)와 같은 추가 모듈을 지원합니다.
장점
- 사용 용이성: 서버 설정이나 복잡한 관리가 필요 없으며, 단순한 솔루션이 필요한 개발자에게 이상적입니다.
- 이식성: 데이터베이스 파일은 외부 의존성 없이 쉽게 이동하거나 복사할 수 있습니다.
- 낮은 자원 소비: 메모리와 디스크 공간을 적게 소모하여 제한된 자원의 장치(스마트폰 또는 IoT)에 적합합니다.
- 신뢰성: ACID 트랜잭션 지원은 실패 시에도 데이터 무결성을 보장합니다.
- 폭넓은 채택: Firefox, Chrome과 같은 브라우저와 Android, iOS와 같은 모바일 운영 체제 및 Adobe Lightroom, Skype와 같은 애플리케이션에서 수십억 대의 장치에서 사용됩니다.
단점
- 제한된 동시성: 높은 쓰기 동시성을 필요로 하는 애플리케이션(예: 수천 명의 사용자와 함께하는 웹 서버)에는 적합하지 않습니다. 이러한 경우 PostgreSQL이나 MySQL과 같은 데이터베이스가 더 적합합니다.
- 확장성: 몇 테라바이트까지는 효율적이지만, SQLite는 대량의 데이터나 복잡한 분석 작업에 최적화되어 있지 않습니다.
- 불완전한 SQL 기능: RIGHT OUTER JOIN, 저장 프로시저 및 ALTER TABLE을 통한 복잡한 스키마 변경과 같은 몇 가지 고급 기능이 부족합니다.
- 보안: SQLite는 사용자 및 권한과 같은 네이티브 액세스 제어가 없으며, 액세스는 파일 시스템에 의해 관리됩니다.
사용 사례
- 모바일 애플리케이션: Android 및 iOS에서 메시지, 연락처 및 설정과 같은 애플리케이션 데이터를 저장하는 데 사용됩니다.
- 임베디드 시스템: IoT 장치, 스마트 TV 및 가전 제품에서 낮은 자원 소비로 인해 일반적입니다.
- 데스크톱 애플리케이션: 브라우저(히스토리와 쿠키 저장) 및 미디어 관리 소프트웨어는 SQLite를 사용합니다.
- 프로토타입: 클라이언트-서버 데이터베이스로 마이그레이션하기 전에 애플리케이션을 개발하고 테스트하는 데 유용합니다.
- 로컬 데이터베이스: 원격 액세스나 높은 동시성이 필요 없는 독립 실행형 애플리케이션에 적합합니다.
결론
SQLite는 로컬 데이터베이스가 필요하고 통합이 용이한 신뢰할 수 있는 경량 솔루션입니다. 높은 동시성이나 대량 데이터 시나리오에 적합하지 않지만, 단순성, 이식성 및 효율성 덕분에 모바일 장치부터 임베디드 시스템에 이르는 다양한 사례에서 인기 있는 선택이 됩니다.