[안드로이드 멀티 모듈] 10. AndroidRoomConventionPlugin 만들기

2024. 12. 16. 11:00·안드로이드/멀티 모듈
반응형

지난 포스트에서는 Compose로 구성된 화면을 위한 AndroidPresentationUIConventionPlugin을 만들었습니다.

이번 시간에는 Room 데이터베이스를 사용하기 위한 AndroidRoomConventionPlugin을 만들겠습니다.
해당 플러그인은 데이터베이스와 관련된 모듈에서 적용하는 컨벤션 플러그인 입니다.

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 브랜치를 확인하시면 됩니다.

 

GitHub - taein8935/multi-module-template-aos

Contribute to taein8935/multi-module-template-aos development by creating an account on GitHub.

github.com

저작자표시 비영리 변경금지 (새창열림)

'안드로이드 > 멀티 모듈' 카테고리의 다른 글

[안드로이드 멀티 모듈] 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
'안드로이드/멀티 모듈' 카테고리의 다른 글
  • [안드로이드 멀티 모듈] 11. JvmLibraryConventionPlugin 만들기
  • [안드로이드 멀티 모듈] 9. AndroidPresentationUIConventionPlugin 만들기
  • [안드로이드 멀티 모듈] 8. AndroidLibraryComposeConventionPlugin 만들기
  • [안드로이드 멀티 모듈] 7. AndroidLibraryConventionPlugin 만들기
코딩덕
코딩덕
안드로이드, 리액트 등의 개발 노하우와 최신 AI 기술을 다루는 기술 블로그입니다. 실무 중심의 경험을 바탕으로 마주한 문제와 해결 과정을 체계적으로 기록하며, 개발자에게 실질적으로 도움 되는 프로그래밍 팁과 인사이트를 쉽고 명확하게 공유하고자 합니다.
  • 코딩덕
    개발자가 들려주는 IT 이야기
    코딩덕
  • 전체
    오늘
    어제
    • 분류 전체보기 (66)
      • 안드로이드 (62)
        • 멀티 모듈 (11)
        • 클린 아키텍처 (11)
        • 트러블 슈팅 (5)
        • 코틀린 (3)
        • 코루틴 (2)
        • Compose (1)
        • Compose UI (6)
        • Compose Dialog (8)
        • Compose Paging3 (11)
        • Compose State (2)
        • Util (1)
      • Github (3)
        • PR Template (2)
        • AI Code Review (1)
      • 리액트 (1)
        • NextJs (1)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Gradle
    Clean Architecture
    코루틴
    OnBackPressedDispatcher
    Jetpack Compose
    enum class
    ViewModel
    코틀린
    flow
    멀티 모듈
    Dialog
    데이터 레이어
    LazyRow
    multi module
    클린 아키텍처
    UI Layer
    트러블슈팅
    paging3
    MutableState
    ScrollView
    pr template
    ai code review
    sealed class
    Github
    jsonadapter
    Usecase
    pager
    recyclerview
    안드로이드
    dynamic json
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코딩덕
[안드로이드 멀티 모듈] 10. AndroidRoomConventionPlugin 만들기
상단으로

티스토리툴바