반응형

안녕하세요. 코딩하는 Jay입니다.
Flutter로 모바일 앱을 개발하다 보면 반드시 마주치는 고민이 있습니다. 바로 "앱의 로컬 데이터(설정값, 캐시, 사용자 기록)를 어떤 데이터베이스에 저장할 것인가?"인데요.
가장 단순한 shared_preferences부터 순수 Dart 기반의 경량 NoSQL Hive, 그리고 초고속 네이티브 성능과 복잡한 쿼리를 지원하는 Isar, 여기에 전통의 강호 sqflite까지 선택지가 너무 다양해 프로젝트 초기에 혼란을 겪기 쉽습니다.
오늘은 실제 프로덕션 앱 서비스에 적용해 보며 측정한 CRUD 벤치마크 성능과 상황별 최적의 로컬 스토리지 선택 기준을 알기 쉽게 정리해 드립니다.
한눈에 보는 Flutter 로컬 DB 4종 비교
| 라이브러리 | 데이터 모델 | 속도 / 성능 | 쿼리 / 인덱싱 지원 | 주요 권장 용도 |
|---|---|---|---|---|
| shared_preferences | Key-Value (원시 타입) | 보통 (소용량 적합) | 없음 (Key 조회만) | 다크모드, 로그인 토큰, 온보딩 완료 여부 |
| Hive (Hive CE) | Key-Value NoSQL | 매우 빠름 (인메모리 캐시) | 기초 필터링 수준 | 오프라인 캐시, 간단한 리스트 데이터 |
| Isar | NoSQL 객체 지향 | 초고속 (Rust 네이티브 바인딩) | 복합 인덱스, 링크, 전문 검색(FTS) | 대용량 트랜잭션, 관계형 데이터, 복잡한 필터링 |
| sqflite (SQLite) | 관계형 (RDBMS) | 보통 (안정성 최상) | 완벽한 SQL 지원 | 기존 RDBMS 스키마 마이그레이션 프로젝트 |
1. shared_preferences: 단순 설정값의 표준
- 특징: 안드로이드의
SharedPreferences와 iOS의NSUserDefaults를 래핑한 플러그인입니다. - 장점: 설정이 전혀 필요 없고 플랫폼 네이티브에 가장 안전하게 동기화됩니다.
- 한계: 비동기 I/O를 지원하지만 대량의 JSON 객체나 리스트를 저장하기에는 성능 병목이 발생합니다.
- 원픽 용도:
isDarkMode: true,accessToken: "xyz"같은 단순 플래그 값 저장.
2. Hive: 순수 Dart의 가벼움과 직관적인 박스(Box) 모델
- 특징: C++ 바인딩 없이 순수 Dart로 작성된 키-값 데이터베이스입니다. 앱 시작 시 박스를 메모리에 올려 읽기 속도가 거의 0ms에 가깝습니다.
- 장점: 네이티브 빌드 에러(AGP 충돌, C++ 링킹 오류)가 전혀 없으며, 웹(Flutter Web)과 데스크탑에서도 동일하게 동작합니다.
- 주의점: 메모리에 통째로 올리는 특성상, 수만 건 이상의 대용량 레코드를 다룰 때는 힙 메모리 점유율을 주의해야 합니다.
3. Isar: 초고속 쿼리와 대용량 데이터의 종결자
- 특징: Hive의 창시자가 Rust 엔진을 기반으로 밑바닥부터 성능을 위해 다시 만든 초고속 NoSQL 데이터베이스입니다.
- 압도적인 쿼리 엔진: 복합 인덱스, 다중 조건 필터링(
where().ageGreaterThan(20)), 텍스트 부분 검색(Full-text search), 객체 간 링크 관계를 네이티브 수준으로 빠르게 처리합니다. - 실전 체감: 1만 개의 데이터를 일괄 삽입하고 조회할 때
sqflite대비 3~5배 이상 빠르며, UI 스레드를 차단하지 않는 비동기 트랜잭션을 기본 지원합니다.
💡 Jay의 프로젝트 규모별 선택 가이드
- 소규모 유틸리티 / 토이 프로젝트:
shared_preferences로 설정값만 저장하고 나머지는 메모리 상태(StateNotifier/Provider)로 끝내는 것이 가장 심플합니다.
- 중소규모 캐시 / 메모 / 체크리스트 앱:
- 빌드가 가볍고 설정이 쉬운
Hive (Hive CE)를 추천합니다.
- 오프라인 퍼스트 대용량 앱 / 가계부 / 러닝 기록 / 일정 관리:
- 날짜별 검색, 카테고리별 통계 쿼리가 빈번하다면 망설임 없이
Isar를 도입하세요. 쿼리 작성 생산성과 렌더링 성능이 드라마틱하게 개선됩니다.
반응형