Flutter에서 로컬 데이터를 저장할 때 가장 많이 사용되는 라이브러리 중 하나가 Hive다. SQLite와 달리 스키마를 정의할 필요가 없고, 빠른 속도를 자랑하며, 복잡한 관계형 데이터 없이도 간단한 데이터 저장 및 관리가 가능하다. 이 글에서는 Hive의 개념부터 설치, 설정, 예제 코드까지 상세히 설명해보겠다.
1. Hive란?
Hive는 경량 Key-Value 기반 NoSQL 데이터베이스로, Flutter 및 Dart 애플리케이션에서 로컬 데이터를 저장할 때 사용된다.
다음과 같은 특징이 있다.
- 빠른 성능: SQLite보다 읽기/쓰기 속도가 빠르다.
- NoSQL 구조: 테이블을 정의할 필요 없이, 객체를 바로 저장할 수 있다.
- 직렬화 불필요: JSON처럼 변환할 필요 없이, Dart 객체 그대로 저장이 가능하다.
- 자동 암호화: 보안이 필요한 데이터 저장 시, 내장 암호화 기능을 제공한다.
- 멀티 플랫폼 지원: Android, iOS, Windows, MacOS, Linux 등에서 사용 가능하다.
2. Hive 설치 및 설정
2.1. 패키지 설치
pubspec.yaml 파일에 Hive 관련 패키지를 추가한다.
dependencies:
flutter:
sdk: flutter
hive: ^2.2.3
hive_flutter: ^1.1.0 # Flutter 프로젝트에서 사용하기 위한 패키지
dev_dependencies:
hive_generator: ^2.0.1 # 자동 코드 생성 패키지
build_runner: ^2.3.3 # 코드 생성 실행을 위한 패키지
2.2. Hive 초기화
Flutter 프로젝트에서 Hive를 사용하려면 main.dart에서 초기화 작업을 해줘야 한다.
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Hive 초기화
await Hive.initFlutter();
// Hive 박스 열기
await Hive.openBox('settings');
runApp(MyApp());
}
이제 settings라는 이름의 박스를 열었고, 데이터를 저장할 준비가 완료되었다.
3. Hive 기본 사용법
Hive는 Box(박스)라는 개념을 사용하여 데이터를 저장한다.
박스는 Key-Value 형태로 데이터를 저장할 수 있는 저장소 역할을 한다.
3.1. 기본 데이터 저장 및 불러오기
void saveData() {
var box = Hive.box('settings');
box.put('username', 'flutter_user'); // 데이터 저장
}
void loadData() {
var box = Hive.box('settings');
String username = box.get('username', defaultValue: 'Guest'); // 데이터 불러오기
print(username);
}
위 코드에서 box.put()을 사용해 데이터를 저장하고, box.get()을 사용해 데이터를 가져올 수 있다. 기본적으로 get()에서 데이터가 없으면 defaultValue 값을 반환할 수 있다.
3.2. 데이터 삭제
void deleteData() {
var box = Hive.box('settings');
box.delete('username'); // 데이터 삭제
}
4. Hive를 이용한 데이터 모델 관리
Hive는 기본적으로 Key-Value 방식이지만, 객체(Object) 저장도 지원한다.
예를 들어, User 클래스를 만들어 저장해보자.
4.1. 모델 클래스 작성
import 'package:hive/hive.dart';
part 'user.g.dart';
@HiveType(typeId: 0)
class User {
@HiveField(0)
final String name;
@HiveField(1)
final int age;
User({required this.name, required this.age});
}
위 코드에서 @HiveType과 @HiveField를 사용하여 Hive에서 관리할 수 있도록 설정한다.
typeId는 데이터 유형을 식별하는 고유한 값이며, HiveField의 숫자는 필드 순서를 나타낸다.
4.2. 모델 어댑터 생성
Hive는 객체를 저장하기 위해 TypeAdapter를 생성해야 한다. 아래 명령어를 실행하면 자동으로 생성된다.
flutter pub run build_runner build
그러면 user.g.dart 파일이 자동 생성된다.
fvm 을 사용한다면 앞에는 꼭 fvm 을 붙이고 사용 ... 필수 !
4.3. Hive에 어댑터 등록
Hive가 이 데이터를 인식할 수 있도록 main.dart에 등록해야 한다.
import 'package:hive_flutter/hive_flutter.dart';
import 'user.dart'; // 생성된 모델 파일 import
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Hive.initFlutter();
// User 어댑터 등록
Hive.registerAdapter(UserAdapter());
await Hive.openBox<User>('userBox');
runApp(MyApp());
}
4.4. 객체 저장 및 불러오기
void saveUser() {
var box = Hive.box<User>('userBox');
var user = User(name: '내이름은 김삿갓', age: 25);
box.put('user1', user); // 객체 저장
}
void loadUser() {
var box = Hive.box<User>('userBox');
User? user = box.get('user1'); // 객체 불러오기
if (user != null) {
print('이름: ${user.name}, 나이: ${user.age}');
}
}
이제 User 객체를 Hive에 저장하고 불러올 수 있다.
5. Hive를 활용한 실전 예제
Hive를 활용하여 간단한 TODO 리스트 앱을 만들어보자.
5.1. 모델 클래스 생성
@HiveType(typeId: 1)
class Todo {
@HiveField(0)
String title;
@HiveField(1)
bool isCompleted;
Todo({required this.title, this.isCompleted = false});
}
5.2. 데이터 저장 및 불러오기
void addTodo(String title) {
var box = Hive.box<Todo>('todoBox');
var todo = Todo(title: title);
box.add(todo); // 리스트처럼 저장
}
void getTodos() {
var box = Hive.box<Todo>('todoBox');
for (var todo in box.values) {
print('할 일: ${todo.title}, 완료 여부: ${todo.isCompleted}');
}
}
6. Hive의 장점과 단점
~ 장점 ~
- 빠른 속도: Key-Value 저장 방식이기 때문에 SQLite보다 빠르게 동작한다. (블로그 에서 속도 빠르다고 봄 .. 정확도 낮음..)
- 간편한 사용: 테이블 정의 없이 손쉽게 데이터를 저장할 수 있다.
- Flutter 친화적: Dart 기반이므로 Flutter에서 쉽게 사용할 수 있다.
~~ 단점 ~~
- 관계형 데이터베이스가 아님: 복잡한 데이터 관계를 표현하는 데에는 SQLite나 Drift가 더 적합할 수 있다.
- 웹 지원 미흡: Hive는 기본적으로 웹 환경에서 완벽히 지원되지 않으며, 별도의 설정이 필요하다.
7. 마무리
이번 글에서는 Hive 라이브러리를 사용하여 데이터를 저장하는 방법부터 객체 관리, 실전 예제까지 다루었다.
간단한 데이터를 빠르게 저장할 때는 Hive가 최고의 선택지가 될 수 있다.
특히, 설정이 간단하고 속도가 빠르며 직렬화가 필요 없다는 점이 큰 장점이다.
데이터 저장이 필요한 Flutter 프로젝트라면 한 번 사용해 보길 추천한다! (그런데 난 SQLite 사용할 예정 ㅎㅎ...)
'Flutter' 카테고리의 다른 글
Flutter에서 Agora SDK 통합 시 발생하는 aosl.xcframework 충돌 해결하기 (0) | 2025.03.20 |
---|---|
GetIt – 간단하고 강력한 의존성 주입 관리 (1) | 2025.03.13 |
Flutter에서 ButtonStyle 마스터하기 – 완벽 가이드 (0) | 2025.03.09 |
Flutter에서 GPU 렌더링 이해하기: Skia에서 Impeller까지 (1) | 2025.03.07 |
Flutter Secure Storage (2) | 2025.03.04 |