1. SQLite3란 무엇인가
SQLite3는 전 세계에서 가장 많이 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS) 중 하나입니다. Oracle이나 MySQL, PostgreSQL처럼 거대한 서버를 구축하여 통신하는 방식이 아니라, 애플리케이션 내부에 임베디드(Embedded)되어 작동하는 것이 가장 큰 특징입니다. 특히 파이썬에서는 내장 라이브러리로 제공되므로 별도로 모듈을 설치할 필요가 없이 바로 사용 가능합니다.
2. SQLite3의 핵심 특징과 장점
- Serverless (DB서버 없음): 데이터를 요청하고 받는 별도의 'DB 서버 프로세스'가 없습니다. 덕분에 설치나 복잡한 포트 설정, 권한 관리가 필요 없습니다.
- 단 하나의 이진(Binary) 파일: 전체 데이터베이스(테이블, 인덱스, 데이터 등)가 컴퓨터 내에 단 하나의 바이너리 파일(.db 또는 .sqlite)로 저장됩니다. 파일 복사나 이동이 메모장 파일 옮기듯 간편합니다.
- 가볍고 빠름: 라이브러리 크기가 수백 KB 수준으로 매우 작아 시스템 자원을 거의 차지하지 않으며, 로컬 파일에 직접 접근하므로 소규모 데이터 읽기/쓰기 속도가 빠릅니다.
- Zero Configuration: 설정 파일이 존재하지 않습니다. 라이브러리를 가져와서 연결(Connect)하는 순간 바로 사용할 수 있습니다.
3. SQLite3의 특징과 장점
SQLite3는 단순해 보이지만, 내부는 아주 정교한 컴파일러와 가상 머신 구조로 설계되어 있습니다.
- SQL 컴파일러 & 가상 머신(VDBE): 우리가 작성한 SQL 문은 내부에서 바이트코드로 컴파일된 후, 가상 머신(Virtual Database Engine)을 통해 실행됩니다.
- B-트리(B-Tree) 구조: 데이터를 빠르게 검색하고 정렬하기 위해 내부적으로 B-트리 알고리즘을 사용합니다.
- 페이지(Page) 단위 관리: 전체 DB 파일을 보통 4KB 크기의 '페이지' 블록들로 나우어 효율적으로 디스크 I/O를 처리합니다.
4. SQLite3의 한계점
- 동시 쓰기 제한 (Locking 구조): 여러 사용자가 '동시에 데이터를 읽는 것'은 문제없지만, '동시에 쓰는 것'은 파일 잠금(Lock) 메커니즘 때문에 제한됩니다. 즉, 대규모 트래픽이 몰리는 웹 서비스에는 적합하지 않습니다.
- 단순한 데이터 타입: 정수, 실수, 문자열, 바이너리(BLOB), Null 등 5가지 기본 타입만 지원합니다. (날짜/시간 타입등이 없어 문자열로 변환하여 저장해야 합니다.)
5. SQLite3를 사용하기에 적합한 프로젝트
- 임베디드 및 IoT 기기: 라즈베리 파이(Raspberry Pi), 아두이노 등 하드웨어 리소스가 제한된 환경
- 모바일 및 데스트톱 앱: 스마트폰 앱(Android, iOS)의 로컬 데이터 저장소, C# WinForms등 자립형 프로그램의 데이터 관리
- 프로토타입 및 테스트: 거대한 DB를 구축하기 전, 빠르게 기능을 검증하고 개발할 때
- 분석 및 데이터 백업: CSV 파일보다 정교하고 빠른 단일 파일 형태의 데이터 보관
6. 공식 홈페이지와 파이썬 라이브러리
- 아래 링크는 공식 홈페이지로 소스코드와 문서, 미리 컴파일된 바이너리등을 얻을 수 있습니다.
SQLite Home Page
SQLite is a C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine. SQLite is the most used database engine in the world. SQLite is built into all mobile phones and most computers and comes bu
sqlite.org
- 파이썬의 경우 공식 홈페이지 문서보다는 파이썬 공식 홈페이지에 있는 sqlite3 항목의 문서를 보시면 파이썬을 이용한 예제를 보면서 직접 코드를 작성할 수 있습니다.
sqlite3 — DB-API 2.0 interface for SQLite databases — Python 3.13.16 documentation
sqlite3 — DB-API 2.0 interface for SQLite databases
Source code: Lib/sqlite3/ SQLite is a C library that provides a lightweight disk-based database that doesn’t require a separate server process and allows accessing the database using a nonstandard ...
docs.python.org
파이썬으로 sqlite3 db를 생성하고 데이터를 추가, 조회, 삭제를 하는 예제입니다. 각 코드가 어떤 일을 하는지는 주석에 표시 했습니다. 이 코드를 실행하면 파이썬을 실행한 폴더에 data.db라는 파일이 생성되고 안에 추가한 데이터가 들어있게 됩니다.
import sqlite3
import os
# 현재 실행 중인 스크립트 파일(.py)의 절대 경로를 가져옵니다.
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# 현재 파일과 동일한 위치에 data.db 경로를 결합합니다.
db_path = os.path.join(BASE_DIR, 'data.db')
# 1. 데이터베이스 연결 (db 파일이 없을 경우 생성)
# 파일 이름(db_path)를 (':memory:')로 하면 메모리에서 임시로 작동하는 DB를 만듬
conn = sqlite3.connect(db_path)
# 커서(Cursor) 객체 생성 (SQL 구문을 실행하는 역할)
cursor = conn.cursor()
# 2. 테이블 생성 (예시: 상품/컴포넌트 관리 테이블)
cursor.execute('''
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price INTEGER,
stock INTEGER
)
''')
conn.commit()
print("--- 테이블 생성 완료 ---\n")
# 3. 데이터 삽입 (INSERT)
# 안전한 데이터 삽입을 위해 플레이스홀더(?)를 사용하는 것이 SQL 인젝션 방지에 좋습니다.
print("1. 데이터 삽입 중...")
product_data = [
('Raspberry Pi 5', 95000, 10),
('Arduino Uno R4', 35000, 25),
('CAT6 LAN Cable 1m', 4500, 100)
]
# 여러 레코드를 한 번에 삽입할 때는 executemany가 효율적입니다.
cursor.executemany('''
INSERT INTO products (name, price, stock)
VALUES (?, ?, ?)
''', product_data)
# 데이터 변경 후에는 반드시 commit을 해주어야 반영됩니다.
conn.commit()
print("데이터 삽입 완료!\n")
# 4. 데이터 조회 (SELECT)
print("2. 데이터 전체 조회 결과:")
cursor.execute('SELECT * FROM products')
# fetchall()은 조회된 모든 행(Row)을 리스트 형태로 가져옵니다.
rows = cursor.fetchall()
for row in rows:
print(f"ID: {row[0]} | 품명: {row[1]:<18} | 가격: {row[2]:>6}원 | 재고: {row[3]:>3}개")
print()
# 5. 특정 조건 데이터 조회 (WHERE)
print("3. 가격이 30,000원 이상인 상품 조회:")
cursor.execute('SELECT name, price FROM products WHERE price >= ?', (30000,))
high_price_rows = cursor.fetchall()
for row in high_price_rows:
print(f"-> 상품명: {row[0]} ({row[1]}원)")
print()
# 6. 데이터 삭제 (DELETE)
print("4. ID가 3번인 데이터(LAN 케이블) 삭제 중...")
cursor.execute('DELETE FROM products WHERE id = ?', (3,))
conn.commit()
print("삭제 완료!\n")
# 7. 삭제 후 최종 결과 재확인
print("5. 삭제 후 최종 데이터 목록:")
cursor.execute('SELECT * FROM products')
final_rows = cursor.fetchall()
for row in final_rows:
print(f"ID: {row[0]} | 품명: {row[1]:<18} | 가격: {row[2]:>6}원 | 재고: {row[3]:>3}개")
# 8. 리소스 정리 (연결 종료)
# 데이터베이스 작업이 끝나면 커서와 연결을 닫아주는 것이 좋습니다.
cursor.close()
conn.close()
위 코드를 실행하면 [그림 1]과 같이 출력됩니다.

'프로그래밍' 카테고리의 다른 글
| pygame으로 고전 테트리스 만들기 (0) | 2026.10.05 |
|---|---|
| pygame으로 공 튀기기 만들기 (0) | 2026.10.05 |
| pyside 윈도우 타이틀바 작업표시줄 아이콘 설정 (0) | 2026.10.05 |
| 파이썬 PySide로 계기판 만들기 (0) | 2026.10.05 |
| 파이썬으로 IP 기반 위치 정보 조회하기 (0) | 2026.10.05 |