Convention Plugin 작업

수호·2025년 11월 5일

Convetion Plugin을 도입하게 된 이유

샘플 프로젝트에서 모듈화를 진행하면서 모듈 수가 8개로 늘어났습니다.
각 모듈마다 build.gradle.kts 파일을 따로 관리해야 했는데,
이 파일들을 각각 수정하고 버전을 맞추는 과정이 점점 번거로워졌습니다.

특히, 공통 라이브러리 의존성을 모든 모듈에 중복으로 작성해야 한다는 점이 가장 큰 문제였습니다.
어떤 모듈에 어떤 라이브러리가 포함되어 있는지 한눈에 파악하기 어렵고,
버전이 달라지는 경우 모든 파일을 일일이 수정해야 하는 비효율이 발생했습니다.

이러한 문제를 해결하기 위해 공통 설정을 한 곳에서 집중적으로 관리하고,
모듈에서는 필요한 플러그인만 간단히 선언하도록 하기 위해
Gradle Convention Plugin을 도입하게 되었습니다.

  1. build-logic/build.gradle.kts
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"
        }
    }
}

요즘은 하루하루 시간이 잘 가는 것 같다. 내가 적용하고 싶었던 기술들을 도입하면서 거기서 더 필요한 기능들을 찾게 되고 그것들을 배워가는 것이 너무 즐겁다.

이제 마지막 테스트 코드 작성을 하면 본 차세대 프로젝트를 시작하기 위한 준비는 끝이다!

남은 준비까지 화이팅!

profile
처음부터 다시 시작!!

0개의 댓글