Flutter 개발을 하다보면 로컬 Database 를 사용해야 하는 경우가 종종 생긴다. 이 경우 Flutter 공식 홈페이지에서는 SQLite 를 안내하지만, 조금 아쉬운 감이 있다.
Hive 는 이런 SQLite 의 아쉬움점을 보완하는 No SQL 기반 Database 를 제공한다. Hive 는 key-value 기반의 Database 로 가볍고, 간편하다. 물론 경우에 따라 다른 형태의 Database 를 사용하겠지만 모바일 앱에서 사용하기에는 무리없이 사용 할 수 있어 보인다.
Hive 의 장점은 여러가지가 있다.
dependencies:
hive: ^[version]
hive_flutter: ^[version]
dev_dependencies:
hive_generator: ^[version]
build_runner: ^[version]
Hive 를 이용하기 위해서는 위의 package 들을 pubspec.yaml 에 추가 해주자.
Hive 를 이용하기 위해서는 main.dart 에서 초기화를 해주어야 한다.
import 'package:hive_flutter/hive_flutter.dart';
await Hive.initFlutter();
모바일 앱이 아닌 경우 Hive.initFlutter() 가 아닌 Hive.init() 를 사용하자
init 을 해주었으면, 이제 openBox 를 해 주어야 한다.
Hive 에서 Box 란 NoSQL 의 Collection 이라고 이해하면 쉽다.
공식 홈페이지에서 Box 의 정의는 다음과 같다.
What are boxes?
All data stored in Hive is organized in boxes. A box can be compared to a table in SQL, but it does not have a structure and can contain anything.
해석 해보자면, box 는 SQL 의 Table 과 비슷한데 구조화가 되어 있지 않다는 것이다.
아무튼, box 는 데이터를 저장하는 공간이라고 보면 된다. 보통은 하나의 box 로 충분하겠지만, 경우에 따라 box 이름을 다르게 해서 복수의 box 를 생성해서 사용할 수 있다.
await Hive.openBox('myBox');
final box = Hive.box('myBox');
openBox 이후에 box 메소드를 통해서 해당 박스를 가지고 올 수 있다.
Hive 사용법은 비교적 직관적이다. 읽기 위해 get, 쓰기 위해 put 을 사용하면 된다.
final box = Hive.box('myBox');
String name = box.get('name');
DateTime birthday = box.get('birthday');
만약 존재하지 않은 데이터를 get 할 때는 null 을 리턴한다. 하지만 defaultValue 를 사용해서 default 값을 정할 수 있다.
double height = box.get('randomKey', defaultValue: 17.5);
final box = Hive.box('myBox');
box.put('name', 'Paul');
box.put('friends', ['Dave', 'Simon', 'Lisa']);
box.put(123, 'test');
box.putAll({'key1': 'value1', 42: 'life'});
Hive는 기본적으로 List, Map, DateTime, Unit8List 등 주요 타입들을 지원한다. 하지만 기본적인 타입 이외에 개발자가 원하는 새로운 형태의 타입을 사용하고 싶을 때, TypeAdapter 를 작성하여 Hive에 등록 해주어야 한다.
import 'package:hive/hive.dart';
part 'person.g.dart';
(typeId: 0)
class Person {
(0)
String name;
(1)
int age;
(2)
List<String> friends;
Person(this.name, this.age, this.friends);
}
TypeAdapter 를 만들기 위한 class 를 제작 후, 클래스 위에 @HiveType(typeId:) 를 추가해준다. (typeId 는 0 ~ 223 사이)
클래스 안의 항목들은 @HiveField([index], [default value]) 를 추가한다.
Default value 기능은 hive: 2.0.4 , hive_generator: 1.1.0 이후 버전부터 사용 가능
part 경로 추가 이후에 아래 build_runner 를 실행시켜준다.
flutter packages pub run build_runner build
그러면 person.g.dart 라는 새로운 TypeAdapter 가 생성되는걸 볼 수 있다.
생성된 TypeAdapter 를 적용하기 위해서는 registerAdapter 를 이용하면 된다.
Hive.registerAdapter(personAdapter());
final person = await Hive.openBox<Person>('person');
person.put('david', Person('david', 20, ['Tom', 'Ben']);
person.put('sandy', Person('sandy', 30, ['david', 'suzan', 'eric']);
좋네요! 그런데 오타가 있어요. Persion!