IT기술/플러터 (flutter)

Flutter 로컬 데이터 저장 완벽 가이드: Shared Preferences vs SQLite vs Hive 비교

후스파 2025. 7. 9. 07:17
반응형

플러터 앱에서 사용자 데이터, 설정, 캐시 등을 로컬에 저장하는 방법은 여러 가지가 있습니다. 대표적으로 Shared Preferences, SQLite, Hive가 널리 사용되며, 각각의 특징과 사용법, 실전 적용 팁을 아래에 정리합니다.


Shared Preferences

특징

  • 키-값(key-value) 쌍 형태로 간단한 데이터(문자열, 숫자, 불린 등)를 저장
  • 주로 사용자 설정, 로그인 상태, 토큰 등 소규모 데이터에 적합
  • 비동기 방식, 영구 저장(앱 삭제 전까지 유지)
  • 대용량·복잡한 데이터에는 부적합

설치 및 사용 예시

dependencies:
  shared_preferences: ^2.2.2
import '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.3
import '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.0
import '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를 활용하면 좋습니다.
각 저장 방식의 특성을 이해하고 프로젝트 요구사항에 맞는 선택을 통해 효율적이고 안정적인 데이터 관리를 구현해보세요. 때로는 여러 저장 방식을 조합하여 사용하는 것도 좋은 전략입니다.

반응형