시리즈

[Flutter] Isar vs hive vs ObjectBox 비교

20220921
db
flutter
hive
isar
nosql
objectbox

요즘은 백엔드에 데이터를 보관하는 것이 너무나 일반적이다. 하지만, 여전히 로컬에 데이터를 저장하는 것은 중요하다.
백엔드의 부하를 줄이기 위해서(비용, 서버 부하) 또는 앱의 데이터 접근 속도를 높이기 위해 오프라인 캐시 db를 두기도 하고, 아예 백엔드가 없이 로컬 db만 있는 stand-alone 앱들도 존재한다.

hive


플러터에서 로컬 db 분야는 SQL 에서는 sqflite, NoSQL 에서는 hive 가 오랜 기간 정상을 지키고 있다. 지금도 pub.dev like 기준으로는 2개가 최고이고, 전체를 통합해서 보면 hive가 1등이다. (shared_preferences나 get_storage 는 db가 아니다.)

hive 는 거의 완벽해 보인다. 문법이 간결하고, 매우 빠르다.(sqflite 나 SharedPref 등과 비교할 때) 쿼리가 불가능하다는 점이 약점이지만, 로컬 db 에서 복잡한 쿼리를 수행할 일은 드물다.

hive의 간단한 문법


모두 hive의 간결함을 사랑했지만, NoSQL DB의 성능을 더욱 획기적으로 개선시켜 보려는 시도들이 시작됐다.

바로 ffi(foreign function interface)의 도움을 받는 것이다.

hive 는 순수 100% dart 로 만들어졌고, dart vm 의 한계는 명확하다. 싱글 스레드 위에서 돌아가니 멀티 스레딩을 할 수 없어 속도가 느리고, GC(garbage collector) 가 있어 메모리 관리가 쉽지 않고, 심지어 dart 언어의 object 크기가 상대적으로 큰 편이다.

hive의 개발 언어

그런 고민들을 hive 개발자가 쓴 이슈 (https://github.com/hivedb/hive/issues/246)에서 볼 수 있다.

hive 2.0 은 Rust 로 개발 중이라는 이슈가 올라오고 부터 isar 라는 이름으로 stable 선언을 하기 까지 2년 정도가 걸렸다.

사람들은 그렇게 인내심이 크지 않다.

objectbox

objectbox는 hive 2.0 이 하려는 것을 먼저 선보였다.
Rust 가 아닌 C, C++ 을 이용해서 hive 보다 빠른 속도와 적은 메모리 사용량을 보였다.

objectbox-dart 의 개발언어


isar보다 빠르게 위치를 선점한 이유는 여러가지 있겠지만, 개인적인 생각으로는 첫째, simon leier 1인 + 소수의 컨트리뷰터에 그치는 isar 의 개발진과 달리, objectbox는 스타트업이긴 하지만 기업 개발팀의 제품이다.
두번째는 isar는 빠르게 변화하는 flutter 하나를 타겟으로 하고 있지만, objectbox 는 모든 플랫폼을 대상으로 만들고 있다. ios, android 는 물론이고, iot 디바이스까지 목표로 하고 있다.
개발 타겟 플랫폼이 많으면 더 느리게 결과물이 나올 것 같지만, objectbox-dart가 나오기 전에 objectbox는 이미 android와 ios, iot 를 타겟으로 한 objectbox를 가지고 있었고, objectbox-dart 는 포팅만 하면 반 이상 만들어 지는 것이었다.

마치 플러터 지도 sdk를 만든다고 할 때 카카오의 경우는 기존의 android, ios sdk 를 이용해만들 수 있는 것과 비슷하다.

objectbox 의 예제 코드

hive의 간결함도 크게 잃지 않았다. native lib 를 추가로 가져와야 하는 번거로움은 있지만, 나중에 볼 isar도 그건 마찬가지다.




isar 는 2022년이 되서야 stable 을 선언한 아직 따끈따끈한 녀석이다. db 를 채용할 때는 신뢰성이 중요하기 때문에 보통 신입을 선호하지는 않지만, hive와 비교한다면 신뢰성은 충분하다고 생각한다.

우선 개발자 본인이 추천하고 있고, https://isar.dev/faq.html#isar-vs-hive

실제로 isar는 꾸준히 새 버전이 나오고 있지만, hive는 몇 달 째 업데이트가 멈췄다.

isar의 개발 언어

속도는 당연히 매우 빨라졌고, objectbox에는 없는 쿼리나 문자 검색, multi-isolate 같은 고급 기능들도 지원하고 있다.

다만, 얻은 것들이 많은 대신 간결함을 포기했다.
isar 예제 코드

sqflite 에 비하면 간단하지만, drift 같은 ORM 쪽이나 firebase cloudstore 에서 나올 것 같은
긴 문법들이 보인다.
반대로 말하면, 이런 코드에 이미 익숙하다면 적응하기 편할 수 있다.


로컬 db의 최대 성능, 고급 쿼리가 필요하다면 isar 를 한 번 사용해보자.

objectbox 는 속도와 간결함 그 어느 것도 놓칠 수 없다면 적당한 선택이다.

hive 는 설치와 문법의 간결함 하나만으로도 여전히 좋은 친구다.


개인적인 의견 : hive와 isar는 당분간은 provider와 riverpod의 관계처럼 공생하지 않을까 싶다.


.

piano (press key Q)

Categories

flutter ( 82 ) dart ( 34 ) android ( 32 ) kotlin ( 11 ) plugin ( 8 ) provider ( 8 ) vim ( 7 ) bloc ( 6 ) iOS ( 6 ) state management ( 6 ) 플러터 ( 6 ) PS ( 5 ) algorithm ( 5 ) architecture ( 5 ) async ( 5 ) getx ( 5 ) java ( 5 ) API ( 4 ) BOJ ( 4 ) class ( 4 ) daily ( 4 ) git ( 4 ) golang ( 4 ) memo ( 4 ) riverpod ( 4 ) state ( 4 ) stream ( 4 ) test ( 4 ) web ( 4 ) widget ( 4 ) windows ( 4 ) HTTP ( 3 ) androidX ( 3 ) app state ( 3 ) context ( 3 ) crash ( 3 ) db ( 3 ) editor ( 3 ) error ( 3 ) extension ( 3 ) github ( 3 ) hive ( 3 ) ide ( 3 ) package ( 3 ) pubspec ( 3 ) python ( 3 ) syntax ( 3 ) vscode ( 3 ) app icon ( 2 ) await ( 2 ) chocolatey ( 2 ) consumer ( 2 ) cp949 ( 2 ) deployment ( 2 ) dev ( 2 ) flavor ( 2 ) gesture ( 2 ) globalkey ( 2 ) go ( 2 ) google ( 2 ) hack ( 2 ) js ( 2 ) json ( 2 ) key ( 2 ) keystore ( 2 ) list ( 2 ) listview ( 2 ) lock ( 2 ) mac ( 2 ) map ( 2 ) navigation ( 2 ) nosql ( 2 ) project ( 2 ) pub ( 2 ) recyclerview ( 2 ) rxdart ( 2 ) sdk ( 2 ) selector ( 2 ) setting ( 2 ) size ( 2 ) soc ( 2 ) synchronized ( 2 ) tdd ( 2 ) tip ( 2 ) version ( 2 ) viewmodel ( 2 ) vundle ( 2 ) webview ( 2 ) xcode ( 2 ) yaml ( 2 ) ( 2 ) 플러터 단점 ( 2 ) 16.0 ( 1 ) 2.0 ( 1 ) 2023 ( 1 ) AATP2 ( 1 ) ChangeNotifierProvider ( 1 ) Example ( 1 ) Guava ( 1 ) ImageReader ( 1 ) Mo's algorithm ( 1 ) OAuth2 ( 1 ) OpenGL ( 1 ) Oreo ( 1 ) ProgressBar ( 1 ) REST API ( 1 ) Trie ( 1 ) activity ( 1 ) adaptive ( 1 ) android P ( 1 ) android context ( 1 ) android11 ( 1 ) apktool2 ( 1 ) app exit ( 1 ) append ( 1 ) appicon ( 1 ) arkit ( 1 ) array ( 1 ) asciidoc ( 1 ) async * ( 1 ) async* ( 1 ) audio ( 1 ) authorization ( 1 ) await for ( 1 ) behaviorsubject ( 1 ) beta ( 1 ) binary ( 1 ) binarysearch ( 1 ) blender ( 1 ) book ( 1 ) bottomsheet ( 1 ) break ( 1 ) broadcast ( 1 ) browser ( 1 ) bubbles ( 1 ) bug ( 1 ) build ( 1 ) buildcontext ( 1 ) buildnumber ( 1 ) bundle ( 1 ) button ( 1 ) bytecode ( 1 ) cache ( 1 ) camera2 ( 1 ) cameramanager ( 1 ) cd ( 1 ) chrome ( 1 ) ci ( 1 ) circle ( 1 ) clean ( 1 ) clean architecture ( 1 ) cli ( 1 ) clip ( 1 ) clipboard ( 1 ) cloud ide ( 1 ) cmdlet ( 1 ) code ( 1 ) coding test ( 1 ) command ( 1 ) comparator ( 1 ) complexity ( 1 ) concurrency ( 1 ) conditional ( 1 ) const ( 1 ) constraint ( 1 ) constraintlayout ( 1 ) controlc ( 1 ) controlv ( 1 ) converter ( 1 ) copy ( 1 ) copy project ( 1 ) coupling ( 1 ) coverage ( 1 ) cp ( 1 ) css ( 1 ) cupertino ( 1 ) cursor ( 1 ) cv ( 1 ) data class ( 1 ) data structure ( 1 ) dataBinding ( 1 ) database ( 1 ) debounce ( 1 ) decompile ( 1 ) delegate ( 1 ) deno ( 1 ) design pattern ( 1 ) development ( 1 ) device ( 1 ) di ( 1 ) dialog ( 1 ) dio ( 1 ) drawable ( 1 ) drug ( 1 ) emmet ( 1 ) encoding ( 1 ) english ( 1 ) entries ( 1 ) environment ( 1 ) equality ( 1 ) equatable ( 1 ) euc-kr ( 1 ) euckr ( 1 ) exit ( 1 ) expand ( 1 ) expanded ( 1 ) export ( 1 ) extension method ( 1 ) facade ( 1 ) fake ( 1 ) field ( 1 ) figma ( 1 ) final ( 1 ) fixed ( 1 ) flutter pub ( 1 ) flutter web ( 1 ) flutter_inappwebview ( 1 ) flutter_test ( 1 ) flutterflow ( 1 ) fold ( 1 ) fonts ( 1 ) form ( 1 ) frame ( 1 ) future ( 1 ) gestureDetector ( 1 ) gestureRecognizer ( 1 ) gesturearena ( 1 ) get-command ( 1 ) get_cli ( 1 ) getbuilder ( 1 ) getx단점 ( 1 ) gitignore ( 1 ) glut ( 1 ) google fonts ( 1 ) gopath ( 1 ) goto ( 1 ) gradient ( 1 ) graphics ( 1 ) gvim ( 1 ) hackaton ( 1 ) hash ( 1 ) hashmap ( 1 ) hot reload ( 1 ) how to ( 1 ) html ( 1 ) i18n ( 1 ) icon ( 1 ) id ( 1 ) impeller ( 1 ) implementation ( 1 ) import ( 1 ) indicator ( 1 ) inkwell ( 1 ) interrupt ( 1 ) intl ( 1 ) introduction ( 1 ) io ( 1 ) isar ( 1 ) iterable ( 1 ) iteration ( 1 ) javascript ( 1 ) julia ( 1 ) juno ( 1 ) jupyter ( 1 ) kakaomap ( 1 ) keytool ( 1 ) korean ( 1 ) kotlin syntax ( 1 ) l10n ( 1 ) lambda ( 1 ) language ( 1 ) layer ( 1 ) layout ( 1 ) lineageOS ( 1 ) localkey ( 1 ) localtoglobal ( 1 ) long list ( 1 ) ls ( 1 ) mac osx ( 1 ) markdown ( 1 ) markup ( 1 ) material ( 1 ) method ( 1 ) microtask ( 1 ) migrate ( 1 ) mintlify ( 1 ) mock ( 1 ) module ( 1 ) monitor ( 1 ) moor ( 1 ) mouse ( 1 ) mouseregion ( 1 ) multiplatform ( 1 ) multiset ( 1 ) multithread ( 1 ) mutable ( 1 ) mvvm ( 1 ) new ( 1 ) node ( 1 ) nodejs ( 1 ) nosuchmethod ( 1 ) null-safety ( 1 ) numberformat ( 1 ) nvim ( 1 ) object ( 1 ) objectbox ( 1 ) objectkey ( 1 ) obx ( 1 ) online ide ( 1 ) operator ( 1 ) orientation ( 1 ) parabeac ( 1 ) parse ( 1 ) paste ( 1 ) path ( 1 ) pattern ( 1 ) pitfall ( 1 ) play store ( 1 ) pod ( 1 ) podfile ( 1 ) pointer ( 1 ) pointers ( 1 ) powershell ( 1 ) private ( 1 ) programming ( 1 ) pull to refresh ( 1 ) puzzle ( 1 ) pycharm ( 1 ) realitykit ( 1 ) recursion ( 1 ) reduce ( 1 ) reference ( 1 ) regex ( 1 ) regular expression ( 1 ) release note ( 1 ) renderbox ( 1 ) renderobject ( 1 ) repl ( 1 ) repository ( 1 ) response ( 1 ) rm ( 1 ) rotue ( 1 ) round ( 1 ) run ( 1 ) scope ( 1 ) scroll ( 1 ) search ( 1 ) server ( 1 ) serverless ( 1 ) service ( 1 ) sharp ( 1 ) singlerepo ( 1 ) singleton ( 1 ) sketch ( 1 ) sliver ( 1 ) sliverlist ( 1 ) snippets ( 1 ) sogae ( 1 ) sorting ( 1 ) source ( 1 ) sparse ( 1 ) sparse array ( 1 ) spec ( 1 ) split ( 1 ) sqflite ( 1 ) sqlite ( 1 ) sqrt decomposition ( 1 ) stateful ( 1 ) statefulwidget ( 1 ) step ( 1 ) stepper ( 1 ) string ( 1 ) stringbuffer ( 1 ) stringbuilder ( 1 ) studio ( 1 ) study ( 1 ) sub-directory ( 1 ) svn ( 1 ) swiftui ( 1 ) swipe to refresh ( 1 ) system_alert_window ( 1 ) system_cache ( 1 ) systemnavigator ( 1 ) tail recursion ( 1 ) tailrec ( 1 ) tap test ( 1 ) text ( 1 ) texteditingcontroller ( 1 ) textfield ( 1 ) texttheme ( 1 ) themedata ( 1 ) then ( 1 ) thread ( 1 ) throttle ( 1 ) time ( 1 ) tool ( 1 ) tools ( 1 ) tooltip ( 1 ) ts ( 1 ) tutorial ( 1 ) typescript ( 1 ) ui ( 1 ) unittest ( 1 ) update ( 1 ) usb ( 1 ) utf8 ( 1 ) ux ( 1 ) valuekey ( 1 ) variable ( 1 ) vector ( 1 ) versioncode ( 1 ) very_good ( 1 ) view ( 1 ) vim plugin ( 1 ) vimrc ( 1 ) virtualenv ( 1 ) wasm ( 1 ) web app ( 1 ) webview_flutter ( 1 ) while ( 1 ) widget tree ( 1 ) window ( 1 ) wsl ( 1 ) yield ( 1 ) 강의 ( 1 ) 개발 ( 1 ) 개발 공부 ( 1 ) 공부법 ( 1 ) 그래픽스 ( 1 ) 꼬리재귀 ( 1 ) 꿀팁 ( 1 ) 데노 ( 1 ) 두줄 ( 1 ) 디노 ( 1 ) 번역 ( 1 ) 블록 ( 1 ) 상태관리 ( 1 ) 실험 ( 1 ) 안드로이드 ( 1 ) 안드로이드프로젝트 ( 1 ) 안드로이드프로젝트복사 ( 1 ) 어이없는 ( 1 ) 조건부 임포트 ( 1 ) 주절주절분노조절실패의식으흐름 ( 1 ) 패키지 ( 1 ) 프로젝트복사 ( 1 ) 플러그인 ( 1 )