지난 포스트에서는 Compose로 구성된 화면을 위한 AndroidPresentationUIConventionPlugin을 만들었습니다.
이번 시간에는 Room 데이터베이스를 사용하기 위한 AndroidRoomConventionPlugin을 만들겠습니다.
해당 플러그인은 데이터베이스와 관련된 모듈에서 적용하는 컨벤션 플러그인 입니다.
1. Room과 관련된 의존성 추가하기
먼저, libs.versions.toml 파일에 아래와 같이 Room을 사용하기 위한 라이브러리와 플러그인을 추가하겠습니다.
room-compiler, room-ktx, room-runtime, room-gradle-plugin로 구성된 4개의 라이브러리와 androidx.room 플러그인을 추가합니다.
Room 데이터베이스는 ksp도 필요하므로 함께 추가해주겠습니다.
// libs.versions.toml
[versions]
room = "2.6.1"
ksp = "1.9.22-1.0.17" // 코틀린 버전에 맞춰야함
...
[libraries]
room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }
room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
room-gradlePlugin = { group = "androidx.room", name = "room-gradle-plugin", version.ref = "room" }
ksp-gradlePlugin = { group = "com.google.devtools.ksp", name = "com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" }
...
[plugins]
room = { id = "androidx.room", version.ref = "room" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
...
2. AndroidRoomConventionPlugin 만들기
이제 AndroidRoomConventionPlugin을 만들겠습니다. 위 과정에서 추가한 의존성들을 해당 컨벤션 플러그인에 적용해야 합니다.
pluginManager를 통해서 androidx.room 및 ksp 플러그인을 적용하고 dependencies 블록에 Room과 관련된 의존성을 추가한 모습입니다.
// AndroidRoomConventionPlugin.kt
class AndroidRoomConventionPlugin: Plugin<Project> {
override fun apply(target: Project) {
target.run {
pluginManager.run {
apply("androidx.room")
apply("com.google.devtools.ksp")
}
extensions.configure<RoomExtension> {
schemaDirectory("$projectDir/schemas")
}
dependencies {
"implementation"(libs.findLibrary("room.runtime").get())
"implementation"(libs.findLibrary("room.ktx").get())
"ksp"(libs.findLibrary("room.compiler").get())
}
}
}
}
다른 컨벤션 플러그인과 다르게 Room 플러그인의 확장 설정을 구성한 모습을 볼 수 있습니다.
바로 extensions.configure<RoomExtension> 블록인데, Room 데이터베이스 스키마를 저장할 디렉토리를 설정해주는 코드입니다. 여기서는 해당 컨벤션 플러그인을 사용하는 모듈의 루트 경로에 schemas 폴더로 지정해주었습니다.
3. AndroidRoomConventionPlugin 적용하기
먼저 프로젝트 레벨의 build.gradle.kts 파일에 ksp와 room 플러그인을 사용할 것 이라고 명시해주겠습니다.
// build.gradle.kts (Project: MultiModuleTemplate)
plugins {
alias(libs.plugins.ksp) apply false
alias(libs.plugins.room) apply false
...
}
Gradle에서 컨벤션 플러그인을 인식하기 위해서 libs.versions.toml에 id를 추가하겠습니다.
그리고 build-logic에도 id와 컨벤션 플러그인 이름을 사용하여 추가하겠습니다.
// libs.versions.toml
[plugins]
multi-module-android-room = { id = "multi.module.android.room", version = "unspecified" }
...
// build.gradle.kts (Module :build-logic-convention)
gradlePlugin {
plugins {
...
register("androidRoom") {
id = "multi.module.android.room"
implementationClass = "AndroidRoomConventionPlugin"
}
}
}
그리고 Room 데이터베이스를 사용하려는 모듈에 AndroidRoomConventionPlugin을 적용하면 됩니다. 여기서는 database 모듈에 적용해주었습니다.
// build.gradle.kts (Module: core:database)
plugins {
alias(libs.plugins.multi.module.android.library)
alias(libs.plugins.multi.module.android.room)
}
android {
namespace = "com.multi.module.core.database"
}
dependencies {
...
}
4. 정리
Room 데이터베이스를 사용하기 위한 AndroidRoomConventionPlugin을 만들었습니다. Room은 ksp를 사용하기 때문에 ksp와 관련된 설정도 잊지 않고 같이 해주어야 합니다.
다음 포스팅에서는 안드로이드에 의존성이 없는 도메인 모듈을 위한 JvmLibraryConventionPlugin을 만들겠습니다.
이번 포스팅의 결과물은 아래 Github Repository의 10-AndroidRoomConventionPlugin 브랜치를 확인하시면 됩니다.
'안드로이드 > 멀티 모듈' 카테고리의 다른 글
[안드로이드 멀티 모듈] 11. JvmLibraryConventionPlugin 만들기 (1) | 2024.12.19 |
---|---|
[안드로이드 멀티 모듈] 9. AndroidPresentationUIConventionPlugin 만들기 (1) | 2024.08.26 |
[안드로이드 멀티 모듈] 8. AndroidLibraryComposeConventionPlugin 만들기 (0) | 2024.08.19 |
[안드로이드 멀티 모듈] 7. AndroidLibraryConventionPlugin 만들기 (0) | 2024.08.12 |
[안드로이드 멀티 모듈] 6. AndroidApplicationComposeConventionPlugin 만들기 (1) | 2024.08.07 |