본문 바로가기
Android

[Android] Gradle을 KTS로 마이그레이션 하기

by 너츠너츠 2023. 2. 2.

 

Kotlin-dsl?

저는 지금까지 Groovy 기반의 gradle파일들로 라이브러리를 선언하고, project단위의 gradle에서 각 라이브러리 버전을 관리했었는데 Groovy 기반이 아니라 Kotlin 파일로 gradle을 관리할 수 있다는 것을 알게 되었습니다. Groovy -> KTS로 migration하는 방법을 소개하고 있습니다.

DSL?

Domain Specific Language의 약자이며, 반대 의미로는 GPL Global Purpose Language가 있습니다.

특정 도메인에 국한되어 사용되는 언어라는 의미이며, Kotlin이 이런 DSL에 해당합니다. 앱을 개발하면서 프레임워크나 라이브러리를 사용할 때, 제공되는 언어를 사용하게 되는데 이 때의 언어가 DSL입니다.

 

Groovy vs KTS

기존의 방식이 아니라 kts 파일로  gradle을 관리할 때의 장점은 무엇일까요?

- kotlin 파일이기 때문에 자동완성이 가능한 점

- 여러 모듈에서 동일하게 필요한 라이브러리들이 있는데, 그런 것들을 for문으로 한 번에 추가할 수 있다는 점

- gradle에서 Kotlin 문법들을 사용할 수 있다는 점

- 라이브러리 버전 뿐만 아니라 EndPoint가 변경되었을 때도 수정일 쉽다는 점

 

Groovy DSL에서 Kotlin DSL로 마이그레이션 

1. root project에 buildSrc 디렉터리 생성하기

2. buildSrc 디렉터리 안에 'build.gradle.kts' 파일 생성하기

plugins {
    `kotlin-dsl`
}

repositories {
    google()
    mavenCentral()
}

3. src>main>java 폴더 생성하고 그 안에 앱 레벨, 버전 정보나 라이브러리 관련 버전 정보를 저장할 파일 생성하기

object ConfigData {
    const val compileSdk = 33
    const val targetSdk = 33
    const val minSdk = 23
    const val versionCode = 1
    const val versionName = "1.0"
    val javaVersion = JavaVersion.VERSION_11
    const val jvmTarget = "11"
}
object Versions {
    const val kotlin = "1.6.10"
    const val hilt = "2.42"
    const val gson = "2.8.6"
    const val coroutineCore = "1.6.1"
    const val retrofit = "2.9.0"
    const val glide = "4.13.2"
}
object Dependencies {
    val kotlin = Kotlin
    val hilt = Hilt

    object Kotlin {
        val coroutine by lazy { "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.coroutineCore}" }
    }

    object Hilt {
        val android by lazy { "com.google.dagger:hilt-android:${Versions.hilt}" }
        val compiler by lazy { "com.google.dagger:hilt-android-compiler:${Versions.hilt}" }
    }
}

4. 모듈별 build.gradle -> build.gradle.kts 로 변경

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}

android {
    namespace = "~~~"
    compileSdk = ConfigData.compileSdk

    defaultConfig {
        applicationId = "~~~"
        minSdk = ConfigData.minSdk
        targetSdk = ConfigData.targetSdk
        versionCode = ConfigData.versionCode
        versionName = ConfigData.versionName

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility = ConfigData.javaVersion
        targetCompatibility = ConfigData.javaVersion
    }
    kotlinOptions {
        jvmTarget = Configuration.jvmTarget
    }
    dataBinding {
        enable = true
    }
}

dependencies {

    implementation(Dependencies.androidx.core)
    implementation(Dependencies.androidx.appCompat)
    implementation(Dependencies.androidx.material)
    implementation(Dependencies.androidx.constraint)

    implementation(Dependencies.navigation.ui)
    implementation(Dependencies.navigation.fragment)

    implementation(Dependencies.hilt.android)
    kapt(Dependencies.hilt.compiler)

    testImplementation(Dependencies.test.jUnit)
    androidTestImplementation(Dependencies.test.jUnitExt)
    androidTestImplementation(Dependencies.test.expresso)
}

 

공부하면서 느낀점

  • 멀티모듈로 변경한 후, 각 모듈별로 라이브러리 버전을 관리하는게 번거로웠는데 buildSrc에 각 라이브러리를 관리하고 KTS를 통해 적용함으로서 기존의 작업을 많이 단축시킬 수 있었습니다.
  • 매번 라이브러리를 복사 붙여넣기할 필요 없이 자동완성이 가능해서 너무 편합니다
반응형

댓글