[Flutter] Hive 를 이용한 데이터 저장

동동·2022년 5월 24일
3

Flutter 개발을 하다보면 로컬 Database 를 사용해야 하는 경우가 종종 생긴다. 이 경우 Flutter 공식 홈페이지에서는 SQLite 를 안내하지만, 조금 아쉬운 감이 있다.
Hive 는 이런 SQLite 의 아쉬움점을 보완하는 No SQL 기반 Database 를 제공한다. Hive 는 key-value 기반의 Database 로 가볍고, 간편하다. 물론 경우에 따라 다른 형태의 Database 를 사용하겠지만 모바일 앱에서 사용하기에는 무리없이 사용 할 수 있어 보인다.

Hive 의 장점은 여러가지가 있다.

  • Flutter app 뿐만 아니라, Desktop, browser 에서 사용할 수 있다.
  • 성능이 우수하고 빠르다.
  • 간단하고 강력한 API 지원
  • 강력한 암호화 기능이 기본적으로 적용
  • Native 의 의존성이 없다.

Package 설치

dependencies:
  hive: ^[version]
  hive_flutter: ^[version]

dev_dependencies:
  hive_generator: ^[version]
  build_runner: ^[version]

Hive 를 이용하기 위해서는 위의 package 들을 pubspec.yaml 에 추가 해주자.

initalize

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 을 사용하면 된다.

read

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);

write

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'});

Custom Object 작성

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']);



참고
https://docs.hivedb.dev/#/

2개의 댓글

comment-user-thumbnail
2022년 5월 24일

좋네요! 그런데 오타가 있어요. Persion!

1개의 답글