ticktakclockの日記

技術ポエムを綴ったりします。GitHub idも同じです (@ticktakclock)

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 とかでも良いと思います。