๐Ÿ›ข๏ธ [Flutter] Hive(NoSQL) ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ

Tygerยท2024๋…„ 1์›” 20์ผ
1

Flutter

๋ชฉ๋ก ๋ณด๊ธฐ
52/57
post-thumbnail

๐Ÿ›ข๏ธ Hive(NoSQL) ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ

hive | Dart Package
Hive Docs

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Flutter์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ๊ฐ€ ์ข‹์€ ๋กœ์ปฌ ์ €์žฅ์†Œ์ธ Hive์— ๋Œ€ํ•ด์„œ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

Hive ์‚ฌ์šฉ์— ์•ž์„œ ๋กœ์ปฌ ์ €์žฅ์†Œ๊ฐ€ ์™œ ํ•„์š”ํ• ๊นŒ ? ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค๋„ ์žˆ๊ฒ ์ง€๋งŒ ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์€ ํญ ๋„“๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„๊ฑฐ๋ผ ์ƒ๊ฐํ•œ๋‹ค.

์ €๋„ ์•ฑ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•  ๋•Œ ์†์‰ฝ๊ฒŒ Firebase๋ฅผ ์‚ฌ์šฉํ•ด Fiestore DB๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๋ฌด๋ฃŒ ํ‹ฐ์–ด๊ฐ€ ์ง€๋‚˜๊ณ  ๋‚˜๋ฉด ๊ณผ๊ธˆ์ด ๋˜๊ธฐ์— ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ค„์ด๋Š”๋ฐ ๋„์›€์ด ๋˜๊ณ  ์žˆ๋‹ค.

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ ์ €์žฅ์†Œ ๋งŒ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์•Œ์•„๋‘๋ฉด ๊ผญ ์‚ฌ์šฉํ•  ์ผ์ด ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค.

Hive๋Š” NoSQL DB์ธ๋ฐ, ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ๋ณต์žกํ•œ ๊ด€๊ณ„ํ˜• ๊ตฌ์กฐ๋กœ๋Š” ๊ตฌ์ถ•ํ•˜์ง€ ์•Š๊ธฐ์— ์ €๋Š” Hive๊ฐ€ ๊ฐ€์žฅ ์ข‹์€ ์„ ํƒ์ง€๋ผ๊ณ  ๋ณธ๋‹ค.
Hive๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ SQLite, Sembast, Floor, Drift ๋“ฑ ๋‹ค์–‘ํ•œ ๋กœ์ปฌ ์ €์žฅ์†Œ ํ˜•ํƒœ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.

NoSQL ๊ตฌ์กฐ๋˜ํ•œ ์ต์ˆ™ํ•œ key-value ๊ตฌ์กฐ์ด๊ธฐ์—, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜์Œ ๋‹ค๋ค„๋ณด๋Š” ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค๋„ ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. NoSQL์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฅด์‹œ๋ฉด CRUD์˜ ๊ฐœ๋…๋งŒ ํŒŒ์•…ํ•˜์…”๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ฌธ์ œ๋Š” ์—†๋‹ค.

Hive

Dependencies

dependencies์— hive package ๋“ค์„ ์ถ”๊ฐ€ํ•ด ์ฃผ๋„๋ก ํ•˜์ž.

๋จผ์ € hive ์‚ฌ์šฉ์„ ์œ„ํ•ด hive ํŒจํ‚ค์ง€๋Š” ๋‹น์—ฐํžˆ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•˜๊ณ , hive_flutter๋„ hive ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ flutter์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ผญ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•˜๋Š” ํ™•์žฅ ํŒจํ‚ค์ง€์ด๋‹ค.

hive๋Š” Hive ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒจํ‚ค์ง€์ด๊ณ , hive_flutter ํŒจํ‚ค์ง€๊ฐ€ ๋ฐ”๋กœ flutter์—์„œ hive ์‚ฌ์šฉ์„ ๋„์™€์ฃผ๋Š” ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

dev_dependencies์— hive_generator, build_runner ํŒจํ‚ค์ง€๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์€ ์„ ํƒ ์‚ฌํ•ญ์ด๋‹ค.

hive์—์„œ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด hive์—์„œ ์ง€์›ํ•˜๋Š” ๊ฐ์ฒด ์ง€์› ๊ธฐ๋Šฅ์ธ TypeAdapter๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
TypeAdapter๋Š” code generator๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์—, build_runner, hive_generator๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๊ฐ์ฒด ์‚ฌ์šฉ์ด ํ•„์š” ์—†๋‹ค๋ฉด ๊ตณ์ด ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

dependencies:
	hive: ^2.2.3
    hive_flutter: ^1.1.0

dev_dependencies:
	build_runner: ^2.4.7
    hive_generator: ^2.0.1

Initalization

์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ hive ์‚ฌ์šฉ์„ ํ•ด๋ณด๋„๋ก ํ•˜์ž. hive ์‚ฌ์šฉ์„ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋‹น์—ฐํžˆ hive ์ดˆ๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

Flutter Applications

await Hive.initFlutter();

Non Flutter Applications

await Hive.init();

main()

void main() async {
  await Hive.initFlutter();
  runApp(const MyApp());
}

openBox

hive ์‚ฌ์šฉ์‹œ ์•Œ์•„๋‘์–ด์•ผ ํ•˜๋Š” ๊ฐœ๋…์ด box์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ•˜๋‚˜์˜ ๊ณต๊ฐ„์„ box๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ Table, NoSQL ๊ตฌ์กฐ์˜ collection์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ์‰ฌ์šธ ๊ฒƒ ๊ฐ™๋‹ค.

box๋Š” ํ‚ค ๊ฐ’์„ ์ง€์ •ํ•˜์—ฌ ์ ‘๊ทผํ•ด ์‚ฌ์šฉํ•˜๋Š”๋ฐ, box๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋จผ์ € box๋ฅผ ์—ด๊ณ  ์žˆ์–ด์•ผ๋งŒ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋œ๋‹ค.

box๋ฅผ ์˜คํ”ˆํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ˜ธ์ถœํ•˜๋ฉด ๋˜๋Š”๋ฐ, ํ˜ธ์ถœ์‹œ box๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ง€์ •ํ•œ ํ‚ค ๊ฐ’์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.

๋งŒ์ผ ํ•ด๋‹นํ•˜๋Š” ํ‚ค ๊ฐ’์— ์ƒ์„ฑํ•œ box๊ฐ€ ์—†๋‹ค๋ฉด ์ƒˆ๋กœ์šด box๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๊ณ , ์กด์žฌ ํ•œ๋‹ค๋ฉด ์ผ์น˜ํ•˜๋Š” box๋ฅผ ์—ด์–ด์ค€๋‹ค.

await Hive.openBox("openBox");

๋งŒ์ผ box๋ฅผ ์˜คํ”ˆํ•˜์ง€ ์•Š๊ณ  ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ ? ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

Unhandled Exception: HiveError: Box not found. Did you forget to call Hive.openBox()?

openBox()๋ฅผ ํ•˜๊ฒŒ๋˜๋ฉด, box๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์˜ฌ๋ ค๋‘๊ฒŒ ๋˜๋Š”๋ฐ, openBox๋ฅผ ํ˜ธ์ถœํ•œ ์‹œ์ ์ด ์•„๋‹Œ box์— ์ ‘๊ทผํ•˜๋Š” ์‹œ์ ์— box๋ฅผ ์—ด๊ณ  ์‹ถ๋‹ค๋ฉด lazyํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

Hive.openLazyBox("openBox");

์ด๋ฏธ ์˜คํ”ˆ๋œ box๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์˜คํ”ˆํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š” ํ•ด๋‹น ๊ธฐ๋Šฅ์ด ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ƒ์„ฑ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด box๋ฅผ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋˜์–ด ์žˆ์–ด ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

Create

์˜คํ”ˆ๋œ box์— ์ ‘๊ทผํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ œ๋กœ ์ €์žฅํ•ด๋ณด๋„๋ก ํ•˜์ž.

hive์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ๋จผ์ € key-value ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ , key ์—†์ด value๋งŒ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

put

person box๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์„œ put ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด key: "name", value: "tyger"๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด๋ณด๋„๋ก ํ•˜์ž.

Hive.openBox("person");
Box box = Hive.box("person");
box.put("name", "tyger");

์ €์žฅ๋œ ๊ฐ’์„ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณด๋ฉด ๋œ๋‹ค.

print(box.values);

name์œผ๋กœ tyger ๊ฐ’์ด ์ž˜ ์ €์žฅ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒˆ์—” age ๊ฐ’๋„ ์ €์žฅํ•ด๋ณด์ž. ์ €์žฅ ํ›„ ์ถœ๋ ฅํ•ด๋ณด๋ฉด (20, tyger) ์ด๋ ‡๊ฒŒ ๊ฐ’์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

box.put("age", 20);

add

์ด๋ฒˆ์—” add() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด๋ณด์ž. ํ‚ค ๊ฐ’์ด ๋”ฐ๋กœ ์—†๊ธฐ ๋•Œ๋ฌธ์—, value๋งŒ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

Box box = Hive.box("person");
box.add("tyger1");

์ž ์šฐ์„  ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. ์ด์ œ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์˜ค๋ฉด์„œ put(), add() ์ €์žฅ ๋ฐฉ์‹์˜ ์ฐจ์ด์ ๊ณผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

Read

์ง€๊ธˆ๊นŒ์ง€ ์ €์žฅํ•œ person box์˜ value๋“ค์„ ํ˜ธ์ถœํ•ด๋ณด๋ฉด, ๋ฌธ์ œ ์—†์ด ์ถœ๋ ฅ์ด ๋œ๋‹ค.

Box box = Hive.box("person");
print(box.values);
// (tyger1, 20, tyger)

์ด๋ฒˆ์—” person box์˜ key๋“ค์„ ํ˜ธ์ถœํ•ด๋ณด์ž.

์ถœ๋ ฅํ•ด ๋ณด๋ฉด "(0, age, name)" ์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

add๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉด, ํ‚ค ๊ฐ’์ด ์ธ๋ฑ์Šค ์ˆœ์„œ๋กœ ์ž๋™์œผ๋กœ ์ง€์ •๋˜์–ด์„œ ํ‚ค์— 0์ด๋ผ๋Š” ๊ฐ’์ด ์ง€์ •๋œ ๊ฒƒ์ด๋‹ค.

Box box = Hive.box("person");
print(box.keys);
// (0, age, name)

์ด๋ฒˆ์— key ๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด ๋ณด์ž.

print(box.get("name"));
// tyger
print(box.get("age"));
// 20

add๋ฅผ ์‚ฌ์šฉํ•ด ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ํ‚ค ๊ฐ’์œผ๋กœ ์กฐํšŒ๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค. ๋ฌผ๋ก  ํ‚ค ๊ฐ’์„ ์ฐพ์•„ ์กฐํšŒ๋ฅผ ํ•˜๋ ค๋ฉด ํ•  ์ˆ˜๋Š” ์žˆ๊ฒ ์ง€๋งŒ ์ข‹์€ ๋ฐฉ์‹์€ ์•„๋‹ˆ๋‹ค.

add()์™€ put()์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜์—์„œ TypeAdapter ๋ถ€๋ถ„์„ ๋ฐฐ์šฐ๋ฉด์„œ ๋” ์ž์„ธํžˆ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ๋‹ค.

์ด์–ด์„œ ๋ฐ์ดํ„ฐ ์กฐํšŒ์‹œ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ‚ค ๊ฐ’์œผ๋กœ ์กฐํšŒ๋ฅผ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ null์„ ๋ฆฌํ„ดํ•˜๊ธฐ์— nullable ํƒ€์ž…์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ฉด ๋˜๊ณ , default ๊ฐ’์„ ์ง€์ •ํ•˜์—ฌ ์กฐํšŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ธฐ๋ณธ ๊ฐ’ ์ง€์ • ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

print(box.get("birthday"));
// null
print(box.get("birthday", defaultValue: 20230101));
// 20230101

Delete

์ด๋ฒˆ์—” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋„๋ก ํ•˜์ž. ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ‚ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ , box ์ž์ฒด๋ฅผ ์ง€์šฐ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

delete()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ง€์ •๋œ key ๊ฐ’์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ฒŒ ๋œ๋‹ค.

Box box = Hive.box("person");
box.delete("name");

deleteAll()์€ ํ‚ค ๊ฐ’๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฐ›์•„ ์กด์žฌํ•˜๋Š” ํ‚ค ๊ฐ’๋“ค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

Box box = Hive.box("person");
box.deleteAll(["name", "age"]);

box ์ž์ฒด๋ฅผ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๋นˆ ๋ฐ•์Šค๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด, clear() ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

clear()๋Š” box์•ˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ ์ง€์›Œ๋ฒ„๋ ค ๋นˆ ์ƒํƒœ๋กœ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Box box = Hive.box("person");
box.clear();

Update

์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

์‚ฌ์‹ค Update๋Š” hive์—์„œ๋Š” Create์™€ ํฌ๊ฒŒ ๋‹ค๋ฅธ๊ฒŒ ์—†๋Š” ๋ถ€๋ถ„์ด๊ธด ํ•˜๋‹ค.

Box box = Hive.box("person");
box.put("name", "tyger");
print(box.get("name"));
// tyger

์ด๋ฒˆ์—๋Š” ์†Œ๋ฌธ์ž๋กœ ์ €์žฅํ•œ name์„ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

Box box = Hive.box("person");
box.put("name", "TYGER");
print(box.get("name"));
// TYGER

์ด๋ ‡๊ฒŒ hive๋Š” ๋™์ผ ํ‚ค ๊ฐ’์— ๋Œ€ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ์‹œํ‚ค๊ณ  ์žˆ๋‹ค.


Details

์ง€๊ธˆ๊นŒ์ง€ hive์— ๊ธฐ๋ณธ ์ ์ธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์‚ดํŽด ๋ดค๋‹ค. ์‚ฌ์‹ค key-value ํ˜•ํƒœ์˜ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉ ํ•œ๋‹ค๋ฉด, shared_preferences์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋™์ผํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ฒˆ์—๋Š” ์œ„์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃจ์ง€ ๋ชปํ•œ put(), add()์— ๋Œ€ํ•ด์„œ ์ฐจ์ด์ ์„ ์‚ดํŽด๋ณด๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋„ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜์ž.

์œ„์—์„œ ์‚ฌ์šฉํ•œ person ๋ฐ•์Šค๋Š” name, age ๋ฅผ ํ‚ค ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ํ•˜๋‚˜์˜ person ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋ช…์˜ person์„ ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ ? person ๋ฐ•์Šค๋ฅผ person1, person2 ... ์ด๋Ÿฐ์‹์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ• ๊นŒ ? .. ์•„๋‹ˆ๋‹ค

hive ์—์„œ๋Š” box๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, ๋ฉ”๋ชจ๋ฆฌ ํ•œ ์˜์—ญ์˜ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๊ธฐ์— ์“ธ๋ฐ์—†์ด box๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ๋„ ๋น„ํšจ์œจ ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐฐ์—ด์— ๋‹ด์•„์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ด๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ข€ ๋” ๋ณต์žกํ•œ ๊ตฌ์กฐ๋กœ ์ €์žฅํ•ด ๋ณด๋„๋ก ํ•˜์ž. ํ‚ค๋ฅผ person์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ Map ๊ตฌ์กฐ๋กœ ๋„ฃ์–ด์„œ ์ €์žฅํ•˜์˜€๋‹ค.

Box box = Hive.box("person");
box.put("person", {
	"name": "tyger",
	"age": 20,
});
final person = box.get("person");
print(person);
print(person["name"]);

// {name: tyger, age: 20}
// tyger

ํ•ด๋‹น ๊ตฌ์กฐ์—์„œ person1, person2 ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•˜์ž. ํ•œ ๋ฒˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด putAll() ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

box.putAll({
	"person1": {
		"name": "tyger1",
		"age": 30,
	},
	"person2": {
		"name": "tyger2",
		"age": 40,
	},
});
print(box.values);

// {name: tyger, age: 20}, {name: tyger1, age: 30}, {name: tyger2, age: 40}

์œ„์˜ ๋ฐฉ๋ฒ•์ด ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ผ๊นŒ ? ๋ฌผ๋ก  ์ €๋ ‡๊ฒŒ ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํ‚ค ๊ฐ’์„ ๋”ฐ๋กœ ์ฃผ์ง€ ์•Š๊ณ , mapIndexed ํ˜•ํƒœ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ํ‚ค ๊ฐ’์ด ๋ถ€์—ฌ ๋˜๊ฒŒ ์ €์žฅํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ๋” ์ข‹์„ ๊ฒƒ์ด๋‹ค.

person box๋ฅผ ์œ„์—์„œ ๋ฐฐ์šด clear() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ „๋ถ€ ๋น„์›Œ์ฃผ๊ณ  ์ด๋ฒˆ์—๋Š” addAll() ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด ๋ณด๋„๋ก ํ•˜์ž.

Box box = Hive.box("person");
box.addAll([
	{
		"name": "tyger",
		"age": 20,
	},
	{
		"name": "tyger1",
		"age": 30,
	},
	{
		"name": "tyger2",
		"age": 40,
	},
]);
print(box.values);
print(box.getAt(2));

// ({name: tyger, age: 20}, {name: tyger1, age: 30}, {name: tyger2, age: 40})
// {name: tyger2, age: 40}

์œ„์˜ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์„œ ๋™์ผํ•œ ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋” ์†์‰ฝ๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฌ๋‹ค.

ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ๋•Œ์— ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์ด ์‚ฌ์šฉ ๋ฌ๋Š”๋ฐ, ๋ฐ”๋กœ getAt(index) ๊ธฐ๋Šฅ์ด๋‹ค. ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ๊ฐ’์„ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์™„์ „ํžˆ ๋™์ผํ•˜๋ฉฐ, ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค ๊ฐ’๋ณด๋‹ค ํฐ ๋ฒ”์œ„๋ฅผ ์กฐํšŒํ•˜๊ฒŒ ๋˜๋ฉด ๋‹น์—ฐํžˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์œ„์˜ ๋ฐฉ์‹์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋ ๊นŒ ? ํ‚ค ๊ฐ’์„ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ‚ค ๊ฐ’์„ ์ฐพ์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

Query

hive ์ €์žฅ์†Œ์˜ ์ฟผ๋ฆฌ ์ง€์› ๋ฐฉ์‹์€ ํ‚ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ณ , add ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ž๋™ ํ‚ค๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด, Flutter์˜ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

hive ๊ณต์‹ ๋ฌธ์„œ์—๋„ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๊ฒŒ ๋‹จ์ ์€ ์•„๋‹ˆ๋ผ๊ณ  ๋‚˜์™€์žˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์™€ Flutter์—์„œ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋Š”๊ฒŒ ์†๋„๋ฉด์—์„œ๋Š” ๋” ์ข‹๋‹ค.

Hive does not have a query language and only has limited support for sorting, which is not necessarily a disadvantage, as you can see in the benchmark. Sorting and filtering are much faster if you do it yourself in Dart.

age๊ฐ€ 30์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ด ์˜ค๋„๋ก ํ•˜์ž. ๊ฐ„๋‹จํ•˜๋‹ค. ๊ธฐ์กด ๋ฐฐ์—ด ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ์™„์ „ํžˆ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

List<dynamic> query = box.values.where((e) => e["age"] == 30).toList();
print(query);

// [{name: tyger1, age: 30}]

์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ์˜ age๋ฅผ 25๋กœ ๋ณ€๊ฒฝํ•ด ๋ณด๋„๋ก ํ•˜์ž.

์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ฐฐ์—ด index ๊ฐ’์„ ์ฐพ์•„ ํ•ด๋‹น index์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด ์˜ค๋„๋ก ํ•˜์ž. ์ด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ๋ฐ”๋กœ putAt(index) ๊ธฐ๋Šฅ์ด๋‹ค.

print(box.values);

// ({name: tyger, age: 20}, {name: tyger1, age: 30}, {name: tyger2, age: 40})

List<dynamic> query = box.values.where((e) => e["age"] == 30).toList();
int index = query.map((e) => box.values.toList().indexOf(e)).first;
box.putAt(index, {
		"name": query.first["name"],
		"age": 25,
	});
    
print(box.values);

// ({name: tyger, age: 20}, {name: tyger1, age: 25}, {name: tyger2, age: 40})

์ด์ œ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ข€ ๋” ๋””ํ…Œ์ผํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ hive์˜ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ธ TypeAdapter์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

TypeAdapter

TypeAdapter๋Š” hive ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  Map ๊ตฌ์กฐ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ค„๋ดค๋Š”๋ฐ, ๋ถˆํŽธํ•˜๊ณ  ์œ„ํ—˜ํ•˜๋‹ค.

๋ณต์žกํ•œ ๊ตฌ์กฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด TypeAdapter๋Š” ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ์ผ ๊ฒƒ์ด๋‹ค.

์ด๋ฒˆ์—๋Š” ์ž๋™์ฐจ ๊ณต์žฅ์—์„œ ์ƒ์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ hive์— ์ €์žฅํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ์‚ญ์ œํ•ด ๋ณด๋ฉด์„œ ์‚ฌ์šฉํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋จผ์ €, ๊ณต์žฅ์—์„œ ์ƒ์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ธ์„ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ์œ„ํ•ด Car ๋ชจ๋ธ์„ ์ƒ์„ฑํ•ด ์ฃผ๋„๋ก ํ•˜์ž.

class

Code Generator๋Š” ์ƒ์„ฑ๋˜๋Š” ์ •ํ•ด์ง„ ๊ทœ์น™์„ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์•ผ๋งŒ ์ œ๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ์ด ๋œ๋‹ค.

hive_generator์—์„œ๋Š” annotation์œผ๋กœ ๊ฐ์ฒด์— HiveType(typeId: id)์„ ๊ฐ ํ•„๋“œ์— HiveField(id)๋ฅผ ๋„ฃ์–ด์ฃผ๊ฒŒ ๋˜์–ด์žˆ๋‹ค.

๊ฐ์ฒด๊ฐ„ HiveType์˜ id๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†์œผ๋ฉฐ, 1~222 ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๊ฐ ํ•„๋“œ๋Š” ๊ฐ์ฒด ๋‚ด์—์„œ๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†์œผ๋ฉฐ, 0~255 ๋ฒ”์œ„ ๋‚ด๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

255๋ฒˆ์ด๋ฉด ํ•„๋“œ ์ƒ์„ฑ์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๊ธฐ์— ์ฐธ๊ณ ๋งŒ ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

๋ณ€์ˆ˜ ํƒ€์ž…์œผ๋กœ๋Š” Flutter์˜ ๊ธฐ๋ณธ ํƒ€์ž…์€ ์ง€์›ํ•˜์ง€๋งŒ, ๋งŒ์ผ MaterialColor๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด MatrialColor ๊ฐ์ฒด๋ฅผ ์ƒ์†๋ฐ›์•„ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

part 'car.g.dart';

(typeId: 1)
class Car {
  (0)
  int number;

  (1)
  Brand type;

  (2)
  String name;

  (3)
  List<String> colors;

  (4)
  bool isRoof;

  Car({
    required this.number,
    required this.brand,
    required this.name,
    required this.colors,
    required this.isRoof,
  });

  
  String toString() =>
      "Car(number: $number, brand: $brand, name: $name, colors: $colors, isRoof: $isRoof)";
}

enum

enum ๊ฐ์ฒด๋„ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

part 'brand.g.dart';

(typeId: 2)
enum Brand {
  (0)
  hyundai,

  (1)
  kia,

  (2)
  genesis,
}

Code Generator

Code Generator๋ฅผ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ build_runner๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ , ์ง€์†์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. ํŽธํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

Generator๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚˜๋ฉด _.g.dart ๋ผ๋Š” ํŒŒ์ผ์ด ์ถ”๊ฐ€๋กœ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

case 1 flutter pub run build_runner build
case 2 flutter pub run build_runner watch --delete-conflicting-outputs

๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด ๋ณด๋„๋ก ํ•˜์ž.

Box box = Hive.box("car_factory");
box.add(Car(
		number: 0,
		brand: CarType.hyundai,
		name: "name",
		colors: ["red"],
		isRoof: false,
	),
);

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ƒ์„ฑํ•œ TypeAdapter๋ฅผ ๋“ฑ๋กํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•ด์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์ด๋‹ค.

HiveError (HiveError: Cannot write, unknown type: Car. Did you forget to register an adapter?)

registerAdapter

TypeAdapter๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋“ฑ๋ก ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค.

๋“ฑ๋ก ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ ์ „ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ์ฃผ๋ฉด ๋œ๋‹ค. ์šฐ๋ฆฌ๋Š” Car, CarType ๊ฐ์ฒด 2๊ฐœ๋ฅผ ์ƒ์„ฑ ํ•˜์˜€๊ธฐ์—, ๊ฐ๊ฐ ๋“ฑ๋กํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

Hive.registerAdapter(CarAdapter());
Hive.registerAdapter(BrandAdapter());

๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ €์žฅํ•ด ๋ณด์ž.

  final List<Car> cars = [
    Car(
        number: 0,
        brand: Brand.hyundai,
        name: "Grandeur",
        colors: ["black", "white", "grey"],
        isRoof: true),
    Car(
        number: 0,
        brand: Brand.hyundai,
        name: "Santafe",
        colors: ["black", "white"],
        isRoof: true),
    Car(
        number: 0,
        brand: Brand.kia,
        name: "Ray",
        colors: ["black", "cyan", "red"],
        isRoof: false),
    Car(
        number: 0,
        brand: Brand.genesis,
        name: "GV80",
        colors: ["black", "khaki", "navy"],
        isRoof: true),
  ];

addAll() ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ ๋ฒˆ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด ์ฃผ๋„๋ก ํ•˜์ž.

Box box = Hive.box("car_factory");
box.addAll(cars);
print(box.values);

ValueListenableBuilder

๋งˆ์ง€๋ง‰์œผ๋กœ valueListenable ํƒ€์ž…์„ ์ง€์›ํ•ด ์ฃผ๊ณ  ์žˆ์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ณ€๊ฒฝ์„ ์ฆ‰์‹œ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค.

ValueListenableBuilder<Box>(
	valueListenable: Hive.box("car_factory").listenable(),
	builder: (BuildContext context, Box value, Widget? child) {
      ...
}),

Example

To-Do ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์•ฑ์„ Hive ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค์—ˆ๋‹ค.

Hive DB๋ฅผ ์•„์ง ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์œผ์‹  ๋ถ„๋“ค์€ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณด๋ฉด, ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

To-Do ์•ฑ์€ ํ•  ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ์ˆ˜์ •ํ•˜๊ณ , ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

Git Repository

๋งˆ๋ฌด๋ฆฌ

NoSQL ๊ธฐ๋ฐ˜์˜ hive ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด์„œ ์‚ดํŽด ๋ดค๋Š”๋ฐ, ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๋„ ๊ฐ„๋‹จํ•˜๊ณ  ์†๋„๋ฉด์—์„œ๋„ ๊ธ์ •์ ์ธ ๋ถ€๋ถ„์ด ๋งŽ์€ ๊ฒƒ ๊ฐ™๋‹ค. ์ฒ˜์Œ์—” ์ฟผ๋ฆฌ ์ง€์›์ด ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ๋‹ค์†Œ ์•„์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ flutter์—์„œ ๊ฐ€๊ณตํ•˜์—ฌ ์‚ฌ์šฉ ํ›„ ๋‹ค์‹œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•˜๋ฉด ๋˜์„œ ๋” ์‹ฌํ”Œํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

๋งค์šฐ ๋ณต์žกํ•œ ๊ตฌ์กฐ์˜ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋Š” ์ข€ ๋” ์‚ฌ์šฉ์„ ํ•ด๋ด์•ผ ์•Œ๊ฒ ์ง€๋งŒ, ํ˜„์žฌ๊นŒ์ง€ ์‚ฌ์šฉํ•ด๋ณธ ๋กœ์ปฌ ์ €์žฅ์†Œ ์ค‘์—๋Š” ์‚ฌ์šฉํ• ๋งŒ ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

๊ธ‰ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋‹ˆ ๋น ์ง„ ๋‚ด์šฉ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์–ด์„œ, ์ถ”๊ฐ€๋กœ ๊ถ๊ธˆํ•˜์‹  ๋ถ„์€ ์–ธ์ œ๋“  ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š” !

profile
Flutter Developer

0๊ฐœ์˜ ๋Œ“๊ธ€