자니노트

Flutter Hive 설명 및 사용방법 - App에서 Data 저장할 수 있는 기능 본문

모바일 개발/Dart&Flutter

Flutter Hive 설명 및 사용방법 - App에서 Data 저장할 수 있는 기능

zaninote 2023. 8. 24. 13:43

Hive는 Flutter에서 사용할 수 있는 경량, 빠르고, 키-값 기반의 NoSQL 저장소입니다. 

Hive의 주요 특징과 장점은 다음과 같습니다:

속도: 

Hive는 빠른 읽기 및 쓰기 성능을 제공합니다. 이는 Hive가 pure Dart로 작성되어 있기 때문에 가능하며, SQLite와 비교하여 일부 작업에서 더 빠르게 동작합니다.

플랫폼 독립성: 

Hive는 Dart에서 동작하므로 Flutter 앱의 iOS, Android, Web 및 Desktop 버전에서 모두 사용할 수 있습니다.

타입 어댑터: 

Hive는 커스텀 객체를 저장하기 위한 타입 어댑터를 지원합니다. 이를 통해 개발자는 복잡한 데이터 구조도 간단하게 저장하고 검색할 수 있습니다.

데이터 암호화: 

Hive는 데이터의 보안을 위해 암호화를 내장 지원하고 있습니다.

서드파티 플러그인 지원: 

Hive는 여러 추가 기능을 위한 플러그인과 확장 기능을 지원합니다.

Hive를 사용하는 방법은 꽤 간단합니다. 아래는 Hive를 Flutter에서 사용하는 간략한 예시입니다:

 

의존성 추가:

dependencies:
  hive: ^latest_version
  hive_flutter: ^latest_version

Hive 초기화 및 박스 열기:

void main() async {
  await Hive.initFlutter();

  var box = await Hive.openBox('myBox');
  runApp(MyApp());
}

데이터 쓰기 및 읽기:

var box = Hive.box('myBox');

// 쓰기
box.put('name', 'John');

// 읽기
String? name = box.get('name');

 

커스텀 객체를 사용할 경우 Hive 어댑터를 생성하고 등록해야 합니다.

 

위 예시는 Hive의 기본적인 사용 방법을 보여줍니다. 

Hive는 더 많은 고급 기능과 커스텀 어댑터, 서드파티 플러그인과 같은 다양한 추가 기능을 제공하므로, 공식 문서와 저장소를 참고하여 Hive의 전체 기능 범위를 이해하는 것이 좋습니다.

 

아래는 추가적으로 객체를 저장할 수 있는 방법입니다.

 

먼저, 저장하려는 모델을 정의해야 합니다.

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);
}

 

이 모델에 대한 Hive 어댑터를 생성합니다.

어댑터는 Hive가 커스텀 객체를 바이트로 직렬화하고 바이트에서 역직렬화하는 방법을 알려주는 역할을 합니다. hive_generator 패키지와 build_runner를 사용하여 이 어댑터를 자동으로 생성할 수 있습니다.

먼저, pubspec.yaml에 의존성을 추가합니다:

dependencies:
  hive: ^latest_version
  hive_flutter: ^latest_version

dev_dependencies:
  hive_generator: ^latest_version
  build_runner: ^latest_version

 

그 다음, 모델에 애노테이션을 추가하여 Hive가 해당 클래스를 사용할 수 있도록 합니다:

import 'package:hive/hive.dart';

part 'person.g.dart'; // hive_generator는 이 파일을 생성합니다.

@HiveType(typeId: 0)
class Person {
  @HiveField(0)
  final String name;

  @HiveField(1)
  final int age;

  Person(this.name, this.age);
}

 

이제 터미널에서 build_runner를 실행하여 어댑터를 생성합니다:

flutter packages pub run build_runner build

 

Hive를 초기화하고 어댑터를 등록합니다.

void main() async {
  await Hive.initFlutter();
  Hive.registerAdapter(PersonAdapter());

  runApp(MyApp());
}

 

이제 Person 객체를 Hive 박스에 저장하고 읽을 수 있습니다.

final box = await Hive.openBox<Person>('personBox');

// 객체 저장
final person = Person("John", 28);
box.add(person);

// 객체 읽기
final firstPerson = box.getAt(0);

위 예제는 Hive를 사용하여 Flutter에서 커스텀 객체를 저장하고 읽는 방법을 보여줍니다. 

Hive는 매우 유연하고 확장 가능하기 때문에, 필요에 따라 이러한 기본 동작을 확장하고 조정할 수 있습니다.

 

꼭 generator와 build_runner를 사용해야만 Hive에서 객체를 저장하는 것은 아닙니다. 

그러나 자동으로 Hive 어댑터 코드를 생성해주는 기능은 개발 속도를 크게 향상시키고 코드의 실수를 줄여주는 이점이 있습니다.

 

hive_generator와 build_runner 없이 수동으로 Hive 어댑터를 작성할 수 있습니다.

예를 들어, 위에서 사용한 Person 클래스의 어댑터를 수동으로 작성한다면 아래와 같습니다:

import 'package:hive/hive.dart';
import 'person.dart';

class PersonAdapter extends TypeAdapter<Person> {
  @override
  final int typeId = 0;  // 이 ID는 각 어댑터 유형마다 고유해야 합니다.

  @override
  Person read(BinaryReader reader) {
    final name = reader.readString();
    final age = reader.readInt();
    return Person(name, age);
  }

  @override
  void write(BinaryWriter writer, Person obj) {
    writer.writeString(obj.name);
    writer.writeInt(obj.age);
  }
}

 

이 어댑터를 수동으로 작성한 후, Hive를 초기화하고 어댑터를 등록하면 됩니다:

void main() async {
  await Hive.initFlutter();
  Hive.registerAdapter(PersonAdapter());

  runApp(MyApp());
}

수동으로 어댑터를 작성하면 더 많은 제어와 유연성을 얻을 수 있습니다. 

그러나, 모델이 변경될 때마다 해당 변경사항을 반영하여 어댑터 코드도 수동으로 업데이트해야 합니다. 

이 점을 고려하여 프로젝트의 필요에 따라 적절한 방법을 선택해야 합니다.

Comments