반응형

플러터 앱에서 사용자 데이터, 설정, 캐시 등을 로컬에 저장하는 방법은 여러 가지가 있습니다. 대표적으로 Shared Preferences, SQLite, Hive가 널리 사용되며, 각각의 특징과 사용법, 실전 적용 팁을 아래에 정리합니다.
Shared Preferences
특징
- 키-값(key-value) 쌍 형태로 간단한 데이터(문자열, 숫자, 불린 등)를 저장
- 주로 사용자 설정, 로그인 상태, 토큰 등 소규모 데이터에 적합
- 비동기 방식, 영구 저장(앱 삭제 전까지 유지)
- 대용량·복잡한 데이터에는 부적합
설치 및 사용 예시
dependencies:
shared_preferences: ^2.2.2import 'package:shared_preferences/shared_preferences.dart';
// 저장
final prefs = await SharedPreferences.getInstance();
await prefs.setInt('counter', 10);
// 불러오기
int counter = prefs.getInt('counter') ?? 0;
// 삭제
await prefs.remove('counter');활용 팁
- null 체크 및 기본값 제공 습관화
- 대용량 데이터, 복잡한 구조는 피할 것
- 복잡한 데이터는 JSON 문자열로 변환 후 저장 가능
SQLite (sqflite 패키지)
특징
- 구조화된 데이터, 관계형 데이터베이스(RDB)
- CRUD(생성/읽기/수정/삭제) 연산, 복잡한 쿼리, 트랜잭션 지원
- 대규모 데이터, 여러 테이블, 관계형 구조에 적합
- 데이터베이스 스키마(테이블 정의) 필요
설치 및 사용 예시
dependencies:
sqflite: ^2.3.0
path: ^1.8.3import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
final database = openDatabase(
join(await getDatabasesPath(), 'my_db.db'),
onCreate: (db, version) {
return db.execute(
"CREATE TABLE users(id INTEGER PRIMARY KEY, name TEXT)",
);
},
version: 1,
);
// 데이터 삽입
await db.insert('users', {'id': 1, 'name': '홍길동'});
// 데이터 조회
final List> users = await db.query('users');활용 팁
- 모델 클래스를 만들어 데이터 매핑 권장
- 데이터베이스 초기화, 버전 관리, 마이그레이션 설계 필요
- 대규모 데이터, 복잡한 관계형 구조에 적합
Hive
특징
- 경량 NoSQL 데이터베이스, 빠른 읽기/쓰기
- 박스(Box) 단위로 데이터 저장, 타입 제한 없음
- 구조화된 데이터(리스트, 맵, 객체 등) 저장 가능
- 복잡한 쿼리나 관계형 데이터에는 한계
- Flutter Web, 데스크톱 등 다양한 플랫폼 지원
설치 및 사용 예시
dependencies:
hive: ^2.2.3
hive_flutter: ^1.1.0import 'package:hive/hive.dart';
// 박스 열기
var box = await Hive.openBox('myBox');
// 저장
await box.put('name', '홍길동');
// 불러오기
String? name = box.get('name');
// 삭제
await box.delete('name');활용 팁
- 모델 객체 저장 시 어댑터(adapter) 등록 필요
- 대용량 데이터, 빠른 읽기/쓰기, 단순 구조에 적합
- Provider 등 상태관리와 함께 쓰면 효율적
선택 기준 및 비교
| 데이터 구조 | 단순(키-값) | 관계형(테이블) | NoSQL(박스) |
| 저장 용량 | 소규모 | 대규모 | 중~대규모 |
| 사용 용도 | 설정, 토큰, 플래그 | 사용자 DB, 기록 | 캐시, 리스트, 객체 |
| 쿼리/검색 | 불가 | SQL 지원 | 제한적 |
| 성능 | 빠름 | 중간 | 매우 빠름 |
| 복잡도 | 매우 낮음 | 높음 | 낮음 |
| 플랫폼 | 모바일 | 모바일 | 모바일/웹/PC |
권장 사용 시나리오
- 간단한 설정/플래그: Shared Preferences
- 복잡한 데이터/관계형 구조: SQLite
- 빠른 읽기/쓰기, 단순 구조, 객체 저장: Hive
실전 개발 팁
핵심 개발 포인트
- 데이터 용도와 구조에 맞는 저장소 선택
- 상태관리(Provider 등)와 연계해 데이터 일관성 유지
- 보안이 필요한 데이터는 암호화 적용
- 대용량 데이터는 SQLite/Hive, 설정값은 Shared Preferences 권장
- 앱 삭제 시 데이터 유지 여부(Shared Preferences/Hive는 삭제 시 데이터도 삭제됨)
고급 활용 예시
// Hive 모델 클래스 예시
@HiveType(typeId: 0)
class User extends HiveObject {
@HiveField(0)
String name;
@HiveField(1)
int age;
User({required this.name, required this.age});
}
// SQLite 모델 클래스 예시
class UserModel {
final int? id;
final String name;
final String email;
UserModel({this.id, required this.name, required this.email});
Map toMap() {
return {'id': id, 'name': name, 'email': email};
}
factory UserModel.fromMap(Map map) {
return UserModel(
id: map['id'],
name: map['name'],
email: map['email'],
);
}
}마무리
플러터 로컬 데이터 저장은 앱의 목적, 데이터 구조, 성능 요구에 따라 적합한 방식을 선택하는 것이 중요합니다. 간단한 설정은 Shared Preferences, 복잡한 데이터는 SQLite, 빠른 캐시·객체 저장에는 Hive를 활용하면 좋습니다.
각 저장 방식의 특성을 이해하고 프로젝트 요구사항에 맞는 선택을 통해 효율적이고 안정적인 데이터 관리를 구현해보세요. 때로는 여러 저장 방식을 조합하여 사용하는 것도 좋은 전략입니다.
반응형
'IT기술 > 플러터 (flutter)' 카테고리의 다른 글
| Flutter UI/UX 디자인 완벽 가이드: 반응형 레이아웃, 다크모드, 테마 적용 (0) | 2025.07.10 |
|---|---|
| Flutter 화면 전환과 데이터 전달 완벽 가이드: Navigator 활용법부터 고급 라우팅까지 (2) | 2025.07.09 |
| Flutter와 Firebase 연동 완벽 가이드: 인증, 실시간 DB, 스토리지 구현하기 (2) | 2025.07.08 |
| Flutter API 연동 및 네트워크 통신 완벽 가이드: http vs dio 패키지 비교 (0) | 2025.07.07 |
| Flutter 성능 최적화 완벽 가이드: 최신 기법으로 앱 성능 극대화하기 (2) | 2025.07.07 |