Hive: 개념, NoSQL 스토리지 및 네이티브 코드 없는 개발

저자: IT Sectr 게시일: 2026-03-13 읽는 시간: 9 분

Hive는 네이티브 코드 없이 작동하는 Flutter용 경량 NoSQL 스토리지입니다. SQLite나 Firebase와 달리 Hive는 네이티브 라이브러리가 필요 없으며 Dart를 통해서만 작동합니다. Pub.dev, 2024에 따르면, Hive는 1,000만 회 이상 다운로드되었으며 서버 인프라 없이 로컬 데이터 저장이 필요한 모든 Flutter 프로젝트의 3분의 1에서 사용됩니다.

주요 포인트

  • Hive — 순수 Dart 기반 NoSQL DB, 네이티브 코드 또는 플랫폼 종속성 없음
  • 성능 — 모바일 기기에서 초당 최대 30,000회 읽기
  • 타이핑 — 사용자 정의 객체를 위한 TypeAdapter, 코드 생성 불필요
  • 경량 — Android SDK 또는 iOS UIKit에 대한 종속성 제로
  • 리액티브 — WatchBox로 실시간 변경 추적

Hive란 무엇인가?

Hive는 순수 Dart로 작성된 NoSQL 데이터베이스로 네이티브 라이브러리가 필요 없습니다. 2019년 Simon Leiter가 Flutter 프로젝트를 위한 SQLite의 대안으로 만들었습니다. Hive는 모바일 기기에서 빠른 읽기 및 쓰기에 최적화된 바이너리 .hive 형식으로 데이터를 저장합니다. .hive 형식은 각 데이터 유형에 고유한 바이트 접두사가 있는 사용자 정의 직렬화 체계를 사용하여, Protocol Buffers나 FlatBuffers와 달리 사전 스키마 지식 없이 파일을 읽을 수 있습니다.

Hive의 핵심 아이디어는 최대한의 단순함입니다. 데이터베이스는 네이티브 엔진 초기화가 필요 없으며, SQL 파서를 포함하지 않고 리플렉션을 사용하지 않습니다. 모든 작업은 WriteBufferReadBuffer를 통한 바이너리 직렬화와 함께 직접적인 Dart 함수 호출입니다.

Flutter Community 설문조사(2023)에 따르면, Hive는 Flutter에서 가장 많이 사용되는 상위 5개 데이터 스토리지 패키지 중 하나이며, 인기도에서는 shared_preferences에 이어 2위이지만 기능과 속도에서는 이를 능가합니다.

Hive 아키텍처

Hive는 Box 개념을 사용합니다 — 관계형 데이터베이스의 테이블과 유사합니다. 각 Box는 키-값 쌍의 집합을 포함하는 디스크의 파일입니다. 키는 int 또는 String이 될 수 있고, 값은 모든 기본 유형, 목록, Map 또는 TypeAdapter를 통한 사용자 정의 객체가 될 수 있습니다. Box는 서로 격리되어 있으며 독립적으로 열립니다.

네이티브 솔루션 대비 장점

Hive는 플랫폼 채널이 필요하지 않습니다. 즉, 추가 설정 없이 Android, iOS, Web, macOS, Windows, Linux에서 동일하게 작동합니다. 웹 빌드를 대상으로 하는 프로젝트의 경우 Hive가 유일한 경량 NoSQL 솔루션입니다 — SQLite는 브라우저에서 작동하지 않습니다. Hive는 웹의 백엔드로 IndexedDB를 사용하여 브라우저 환경에서도 데이터 지속성을 보장합니다.

Hive의 작동 방식

Hive는 쓰기 시 데이터를 바이너리 형식으로 직렬화하고 읽기 시 역직렬화합니다. 내부 메커니즘은 BinaryWriterBinaryReader를 기반으로 하며, 데이터를 컴팩트한 바이트 배열로 패키징합니다. 디스크의 저장소 크기는 동일한 데이터의 JSON 표현보다 평균 2~3배 작습니다.

Box를 열 때 Hive는 전체 파일을 RAM에 로드합니다. 이는 높은 읽기 속도(마이크로초)를 제공하지만 크기 제한이 있습니다: Box당 50~100MB를 초과하여 저장하지 않는 것이 좋습니다. 더 큰 볼륨의 경우 LazyBox(디스크에서 레코드를 지연 로드)를 사용하세요.

트랜잭션 및 동시성

Hive는 Dart 아이솔레이트 내에서 단일 스레드로 작동합니다. 쓰기 작업은 파일 잠금과 함께 동기적으로 수행됩니다. 비동기 액세스의 경우 await와 함께 Hive.openBox()를 사용하세요. 여러 아이솔레이트의 동시 액세스는 직접 지원되지 않습니다 — 별도의 동기화 메커니즘이 필요합니다.

Hive vs SharedPreferences vs SQLite

Hive는 SharedPreferences와 SQLite 사이의 틈새를 차지합니다. SharedPreferences보다 복잡하지만(사용자 정의 객체 지원) SQLite보다는 간단합니다(SQL 쿼리 불필요). 주요 특징을 비교해 보겠습니다.

특징HiveSharedPreferencesSQLite
데이터 유형모든 유형(TypeAdapter 통해)기본형만SQL 유형
읽기 속도~30,000 ops/s~5,000 ops/s~2,000 ops/s
네이티브 코드불필요필요(Android)필요
웹 지원아니오아니오
복잡성낮음최소중간
반응성WatchBox없음ORM 통해

Hive를 선택해야 하는 경우

Hive는 소량의 데이터에 최적입니다: 앱 설정, API 응답 캐시, 로컬 동기화 대기열, 즐겨찾기 및 검색 기록. 데이터가 50MB를 초과하지 않고 관계형 쿼리가 필요하지 않은 경우 Hive는 SQLite보다 빠르고 간단합니다.

Hive가 적합하지 않은 경우

Hive는 여러 필드로 필터링, JOIN 또는 집계 함수가 포함된 쿼리를 지원하지 않습니다. “오늘 우선순위 3 이상인 모든 작업 선택”과 같은 복잡한 쿼리가 필요한 경우 drift 또는 floor와 함께 SQLite를 사용하세요. Hive는 메모리에 로드되므로 100MB 이상의 데이터 저장에도 적합하지 않습니다.

Hive 코드 예제

Hive는 초기화와 Box 열기로 시작합니다. 아래는 일반적인 시나리오(Flutter 애플리케이션에서 작업 목록 저장)에 대한 기본 작업입니다. 모든 예제는 네이티브 플랫폼 호출 없이 작동합니다.

초기화 및 Box 열기

Hive를 사용하기 전에 main 함수에서 Hive.initFlutter()를 호출해야 합니다. 그런 다음 Hive.openBox()를 통해 Box를 엽니다 — 결과는 읽기 및 쓰기 준비가 된 Box 인스턴스입니다.

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

void async main() {
    await Hive.initFlutter();
    final settingsBox = await Hive.openBox('settings');
    runApp(MyApp());
}

CRUD 작업

Box는 put, get, delete 메서드와 모든 항목을 순회하는 반복자를 제공합니다. 키와 값은 제네릭을 통해 유형화됩니다 — 기본적으로 Box<dynamic>은 모든 유형을 허용하지만 구체적인 유형을 지정하는 것이 좋습니다.

dart
// 데이터 쓰기
final box = await Hive.openBox<String>('tasks');
await box.put('task_1', '식료품 구매');

// 읽기
final task = box.get('task_1');

// 모든 키
final allTasks = box.values.toList();

// 삭제
await box.delete('task_1');

// Box 비우기
await box.clear();

WatchBox를 통한 반응형 관찰

WatchBox는 Box의 확장으로 변경 사항을 구독자에게 알립니다. Flutter에서 이는 ValueListenableBuilder와 통합됩니다: Box의 값이 변경되면 setState 호출 없이 위젯이 자동으로 재구성됩니다.

dart
final watchBox = await Hive.openBox('settings');

// 위젯에서
ValueListenableBuilder(
    valueListenable: watchBox.listenable(),
    builder: (context, box, _) {
        final counter = box.get('counter') ?? 0;
        return Text('카운터: $counter');
    },
)

TypeAdapter 및 사용자 정의 객체

TypeAdapter는 사용자 정의 Dart 객체를 직렬화하기 위한 Hive의 메커니즘입니다. 어댑터는 객체를 바이너리 형식(write)으로 변환하고 다시(read) 변환하는 방법을 설명합니다. json_serializable과 달리 TypeAdapter는 리플렉션이 필요 없으며 더 빠릅니다.

TypeAdapter 생성

어댑터는 TypeAdapter 인터페이스를 read와 write 두 메서드로 구현합니다. 클래스는 Box를 열기 전에 Hive.registerAdapter()를 통해 등록됩니다. 각 어댑터에는 숫자 ID가 할당되어 유형 식별을 위해 파일에 저장됩니다.

dart
// 데이터 모델
class Task {
    final String title;
    final bool isCompleted;
    Task({required this.title, this.isCompleted = false});
}

// TypeAdapter
class TaskAdapter extends TypeAdapter<Task> {
    @override
    final int typeId = 0;

    @override
    Task read(BinaryReader reader) {
        return Task(
            title: reader.readString(),
            isCompleted: reader.readBool(),
        );
    }

    @override
    void write(BinaryWriter writer, Task obj) {
        writer.writeString(obj.title);
        writer.writeBool(obj.isCompleted);
    }
}

코드 생성을 통한 어댑터 생성

모델이 많은 프로젝트의 경우 Hive는 hive_generatorbuild_runner를 제공합니다. 클래스의 @HiveType 어노테이션과 필드의 @HiveField가 자동으로 어댑터를 생성합니다. 이는 모델에 10개 이상의 필드가 있을 때 편리합니다 — 수동으로 read/write를 작성하는 것이 번거로워집니다.

Hive 성능 최적화

Hive는 디스크 대신 메모리에서 읽어 초당 최대 30,000회 작업 속도를 제공합니다. 최적화를 위해: Box를 한 번 열고 앱 전체에서 재사용하고, openBox를 반복적으로 호출하지 마세요. 초기화 후 Hive.box()(동기 게터)를 사용하세요 — 새 인스턴스를 생성하지 않고 이미 열린 Box를 반환합니다.

Provider 및 Riverpod와 Hive 연동

Hive는 인기 있는 Flutter 상태 관리자와 쉽게 통합됩니다. Provider의 경우 초기화 시 Box에서 데이터를 읽고 listenable을 통해 업데이트되는 ChangeNotifierProvider를 사용하세요. Riverpod의 경우 WatchBox를 구독하는 StreamProvider가 적합합니다. 이 조합은 수동 setState 호출 없이 Hive의 모든 데이터 변경 시 반응형 UI 업데이트를 제공합니다. 일반적인 Flutter 프로젝트에서 이 아키텍처는 전역 싱글톤 없이 화면 간 상태 동기화를 가능하게 합니다.

자주 묻는 질문

Hive를 Flutter 없이 사용할 수 있나요?

Hive는 순수 Dart에서 작동하므로 서버 측(Dart VM), 콘솔 또는 AngularDart 등 모든 Dart 프로젝트에서 사용할 수 있습니다. Flutter의 경우 스토리지 경로 초기화를 위해 hive_flutter가 추가로 필요합니다.

Hive에서 데이터를 암호화하는 방법은?

Hive는 Box를 열 때 encryptionKey 매개변수를 통해 AES-256 암호화를 지원합니다. 키는 32바이트 문자열이어야 합니다. 암호화된 Box는 키 없이 읽을 수 없습니다 — 데이터는 파일 수준에서 보호됩니다.

Hive와 Isar의 차이점은?

Isar는 동일한 저자(Simon Leiter)의 Hive 후속 제품입니다. Isar는 더 빠르고 인덱스, 관계 및 복잡한 쿼리를 지원합니다. 그러나 Hive는 Isar의 관계형 기능이 필요하지 않은 간단한 시나리오와 최소 종속성이 중요한 프로젝트에서 여전히 유용합니다.

Hive는 스키마 마이그레이션을 지원하나요?

Hive에는 내장 마이그레이션이 없습니다. TypeAdapter 구조가 변경되면 이전 데이터가 역직렬화되지 않습니다. 해결책: 어댑터의 typeId를 증가시키고 코드에서 수동 마이그레이션을 작성하거나, 새 키를 쓰기 전에 이전 키에 delete를 사용하세요.

Hive Box의 최대 크기는?

Hive는 Box 전체를 메모리에 로드합니다. 권장 제한은 Box당 50~100MB입니다. 이를 초과하면 Box 열기 지연 및 RAM 소비 증가가 발생할 수 있습니다. 더 큰 볼륨의 경우 여러 Box 또는 지연 로드가 있는 LazyBox를 사용하세요.

요약

  • Hive — 순수 Dart 기반 NoSQL DB, 네이티브 코드 또는 플랫폼 종속성 없음
  • 성능 — 모바일 기기에서 초당 최대 30,000회 읽기 작업
  • TypeAdapter — 리플렉션 없는 사용자 정의 객체의 바이너리 직렬화
  • WatchBox — 자동 UI 업데이트를 위한 반응형 변경 추적
  • 크로스 플랫폼 — Android, iOS, Web, macOS, Windows, Linux 기본 지원
  • 암호화 — Box 파일 수준의 AES-256 데이터 보호
  • 권장 — Flutter 및 Dart 프로젝트에서 캐싱, 설정 및 소량 데이터에 Hive 사용

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기