샘플 프로젝트에서 모듈화를 진행하면서 모듈 수가 8개로 늘어났습니다.
각 모듈마다 build.gradle.kts 파일을 따로 관리해야 했는데,
이 파일들을 각각 수정하고 버전을 맞추는 과정이 점점 번거로워졌습니다.
특히, 공통 라이브러리 의존성을 모든 모듈에 중복으로 작성해야 한다는 점이 가장 큰 문제였습니다.
어떤 모듈에 어떤 라이브러리가 포함되어 있는지 한눈에 파악하기 어렵고,
버전이 달라지는 경우 모든 파일을 일일이 수정해야 하는 비효율이 발생했습니다.
이러한 문제를 해결하기 위해 공통 설정을 한 곳에서 집중적으로 관리하고,
모듈에서는 필요한 플러그인만 간단히 선언하도록 하기 위해
Gradle Convention Plugin을 도입하게 되었습니다.
plugins {
`kotlin-dsl` // ✅ 반드시 필요
kotlin("jvm") version "1.9.10" // Kotlin JVM 플러그인 (버전은 프로젝트에 맞게 지정)
id("java-gradle-plugin") // Gradle 플러그인 개발 플러그인
}
dependencies {
implementation(gradleApi()) // ✅ Gradle의 Project, Plugin, Extension 등 인식 가능
implementation(localGroovy()) // ✅ Groovy DSL 접근용
compileOnly(libs.android.gradlePlugin) // Android Gradle Plugin API (AGP) 의존성
compileOnly(libs.kotlin.gradlePlugin) // Kotlin Gradle Plugin API 의존성
implementation(libs.hilt.gradlePlugin) // Hilt Gradle Plugin API 의존성 (필요 시)
implementation(libs.ksp.gradlePlugin) // KSP Gradle Plugin API 의존성 (필요 시)
}
gradlePlugin {
plugins {
register("androidApplication") {
id = "beaver.android.application"
implementationClass = "AndroidApplicationConventionPlugin"
}
register("androidLibrary") {
id = "beaver.android.library"
implementationClass = "AndroidLibraryConventionPlugin"
}
register("androidApplicationCompose") {
id = "beaver.android.application.compose"
implementationClass = "AndroidApplicationComposeConventionPlugin"
}
register("androidLibraryCompose") {
id = "beaver.android.library.compose"
implementationClass = "AndroidLibraryComposeConventionPlugin"
}
register("hilt") {
id = "beaver.android.hilt"
implementationClass = "HiltConventionPlugin"
}
register("room") {
id = "beaver.android.room"
implementationClass = "RoomConventionPlugin"
}
}
}

요즘은 하루하루 시간이 잘 가는 것 같다. 내가 적용하고 싶었던 기술들을 도입하면서 거기서 더 필요한 기능들을 찾게 되고 그것들을 배워가는 것이 너무 즐겁다.
이제 마지막 테스트 코드 작성을 하면 본 차세대 프로젝트를 시작하기 위한 준비는 끝이다!
남은 준비까지 화이팅!