realmをマルチモジュール化したときに気をつけること
こんにちは、tkyです。
Androidアプリ開発のDBとしてRealmを使用して、Realmをマルチモジュール化したときにどのようなことに気をつけるとよいのか私が実際に直面した問題を説明したいと思います。
目的
マルチモジュール化の目的として、Realmの依存をappのようなコアなモジュールから切り離したかったことがあります。
管理のしやすさ、問題が発生したときのスコープを限定させる目的があります。
また、Realmオブジェクトは@RealmObjectというアノテーションを付けますが、差分ビルド毎にアノテーション処理を行っているらしく
差分ビルドにオーバーヘッドが発生している為、ビルド速度を短縮する目的もありました。
やったこと
- realmモジュールを作成する
- RealmModuleを作成する
前者はAndroidのモジュールとしてのrealmモジュールで、
後者はRealmのスキーマとしての依存関係をまとめるためのRealm内で使われる単位のモジュールです。この記事で言いたいこととなります。
新しいドキュメント docs.mongodb.com
古いドキュメント docs.mongodb.com
RealmMoudle
RealmModuleは何のためにいるのかというと、異なるライブラリ間で定義されたRealmのオブジェクト名などがコンフリクトしないように(しても大丈夫なように)
そのライブラリやモジュールで使用するRealmObjectを定義するというのが目的となります。
デフォルトでは自動で作られるものらしいのですがコレを明示的に定義しないと
appモジュールからrealmモジュールにアクセスするときに名前の解決ができなかったりしてちょっと厄介になります。
(そもそもアクセス依存しないように作る、というのはもちろんその通りです。)
@RealmClass open class Foo : RealmObject() @RealmClass open class Bar : RealmObject() // コレを明示的に定義することで命名の競合管理できる @RealmModule( classes = [ Foo::class, Bar::class, ] ) class RealmModule fun initializeRealm() { val realmConfiguration = RealmConfiguration.Builder() .modules(RealmModule()) .build() Realm.setDefaultConfiguration(realmConfiguration) }
まとめ
- Realmをモジュールに分割するときはRealmModuleも一緒につくろう
- 永続化領域をモジュールに分割できた
- 差分ビルドは気持ち早くなった気がする
余談
RealmのDIモジュールもRealmModuleになってしまうので
DI側は RealmDaggerModule
というように命名しています。Hiltにする場合とかもあるかもしれないので素直に RealmDIModule
とかでも良いと思います。