-
SQLite의 JSON 기능을 활용해 원본 JSON 문서를 그대로 저장하고, 필요한 필드를 가상 생성 컬럼(virtual generated columns) 으로 추출해 인덱싱하는 방식 소개
-
json_extract 함수를 이용해 JSON 내부 데이터를 컬럼처럼 다루며, B-tree 인덱스 속도로 쿼리 수행 가능
- 새로운 쿼리 패턴이 필요할 때마다 데이터 마이그레이션 없이 컬럼과 인덱스를 추가해 확장 가능
- 이 방식은 스키마리스 데이터의 유연성과 관계형 데이터베이스의 성능을 동시에 확보
- SQLite를 사용하는 개발자에게 간결한 구조와 높은 성능을 제공하는 실용적 패턴으로 강조
SQLite와 JSON 기능의 결합
- SQLite는 JSON 함수와 연산자를 지원하며, 이를 통해 JSON 데이터를 직접 저장하고 조작 가능
- JSON 문서를 한 컬럼에 그대로 저장하고, 필요한 정보만 가상 컬럼으로 추출
- 이 방식은 스키마 정의 없이 데이터를 유연하게 다루는 형태
- DB Pro 팀은 최근 몇 달간 SQLite를 집중적으로 사용하며 이러한 기능을 실무에서 검증함
- SQLite는 적절히 구성하면 프로덕션 환경에서도 안정적으로 사용 가능
가상 생성 컬럼(Generated Columns)
-
json_extract를 이용해 JSON 내부의 특정 값을 가상 생성 컬럼으로 정의
- 이 컬럼은 실제 데이터를 저장하지 않고, 쿼리 시점에 계산되어 즉시 사용 가능
- 별도의 백필(backfill) 과정이나 데이터 복제가 필요 없음
- 예를 들어 JSON 데이터에서 특정 필드를 추출해 컬럼처럼 다루는 구조를 구현 가능
인덱스 추가와 성능 향상
- 가상 컬럼에 인덱스를 추가하면 JSON 데이터도 일반 컬럼처럼 B-tree 인덱스 속도로 검색 가능
- 인덱스가 추가된 가상 컬럼은 관계형 데이터베이스의 컬럼과 동일한 성능 제공
- 이 접근법은 JSON 데이터의 크기가 커도 빠른 검색을 가능하게 함
새로운 쿼리 패턴 추가
- 나중에 새로운 필드로 검색이 필요할 경우, 단순히 새로운 가상 컬럼과 인덱스를 추가하면 됨
- 예시: user_id 필드를 추출해 인덱스 생성
- 기존 데이터 행을 수정하거나 마이그레이션할 필요 없음
- 이로써 데이터 구조 변경 없이 즉각적인 쿼리 확장성 확보
패턴의 장점과 의의
- 이 패턴은 스키마리스 JSON 저장의 유연성과 관계형 DB의 인덱스 성능을 결합
- 초기 설계 단계에서 인덱싱 전략을 미리 결정할 필요 없음
- 필요 시점에 맞춰 컬럼과 인덱스를 추가해 최적화 가능
- SQLite를 활용하는 개발자에게 단순하면서도 강력한 데이터 처리 방식으로 제시됨
- DB Pro는 앞으로도 SQLite의 다양한 기능을 다루는 추가 글을 예고함