[Android] Groovy에서 KTS로 마이그레이션


개요

최근 진행한 프로젝트에서 gradle 빌드 구성 파일들을 Groovy에서 KTS로 이전함으로써 Kotlin 문법으로의 통일감에서 장점을 느낄 수 있었습니다. Kotlin DSL 을 사용하였을 때의 장단점과 마이그레이션하는 방법에 대해 알아보도록 하겠습니다.


용어 정리

KTSKotlin DSL이라는 용어를 찾아볼 수 있는데, 디벨로퍼에서 다음과 같이 이에 대한 용어 정리를 해두었습니다.

  • KTS: Gradle이 빌드 구성 파일에서 사용하는 Kotlin 언어 버전인 Kotlin 스크립트를 나타냅니다. Kotlin 스크립트는 명령줄에서 실행할 수 있는 Kotlin 코드입니다.

  • Kotlin DSL: Android Gradle 플러그인 Kotlin DSL을 나타내는 경우가 대부분이나 기본 Gradle Kotlin DSL을 나타내는 경우도 있습니다.

Groovy에서 이전하는 맥락에서 KTSKotlin DSL이란 용어는 서로 바꿔 사용할 수 있습니다. 즉, Android 프로젝트를 Groovy에서 KTS로 변환하거나 Groovy에서 Kotlin DSL로 변환하는 것은 사실상 동일합니다.


마이그레이션 효과

Groovy에서 kts로 이전함으로써 얻을 수 있는 장단점들은 다음과 같은 것들이 있습니다.

  • Kotlin언어로 통일함으로써 gradle 파일의 가독성이 높습니다.
  • IDE 상에서 컴파일 시간 확인과 같은 여러 지원 기능들이 더욱 활성화되어 있습니다.
  • 다만, KTS를 이용한 빌드는 Groovy를 사용하는 빌드보다 더 느린 경우가 있습니다.

정리해보자면, 개발자가 느끼는 개발 경험은 좋아지지만, 성능적인 면에서는 아직 이슈가 있는 모양입니다. 하지만 Kotlin으로 통합이라는 점이 충분히 매력적이어서인지 최근의 구글 프로젝트들을 보면 전부 kts를 사용하는 추세입니다.


마이그레이션 방법

1. 문자열을 큰따옴표로 통합

Kotlin에서는 문자열에 큰따옴표를 사용해야 합니다. 따라서 모든 문자열에 대한 작은따옴표들을 큰따옴표로 변환합니다.

From.

1
2
3
4
group 'com.acme'
dependencies {
    implementation 'com.acme:example:1.0'
}

To.

1
2
3
4
group "com.acme"
dependencies {
    implementation "com.acme:example:1.0"
}


2. 함수 호출 및 속성 할당

Groovy에서 수행하던 함수 호출과 속성 할당 문법을 괄호연산자를 통해 명확히 해주어야 합니다.

From.

1
2
3
4
5
6
7
8
9
10
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
    jvmTarget "1.8"
}
dependencies {
    implementation "com.acme:example:1.0"
}

To.

1
2
3
4
5
6
7
8
9
10
compileOptions {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
    jvmTarget = "1.8"
}                      
dependencies {
    implementation("com.acme:example:1.0")  
}


3. 파일 이름 변경

Groovy DSL 스크립트 파일은 .gradle 확장자를 사용하는 반면, Kotlin DSL의 경우 .gradle.kts 확장자를 사용합니다. 따라서 파일 확장자를 변경해주어야 합니다.

  • build.gradle -> build.gradle.kts
  • settings.gradle -> settings.gradle.kts


4. Plugin 블록 수정

2번과 동일한 맥락으로 수정합니다.

From.

1
2
3
4
5
6
apply plugin: 'kotlin-android'
plugins {
    id 'com.android.application'
    id 'kotlin-kapt'
    id 'androidx.navigation.safeargs.kotlin'
}

To.

1
2
3
4
5
6
apply(plugin = "kotlin-android")
plugins {
    id("com.android.application")
    id("kotlin-kapt")
    id("androidx.navigation.safeargs.kotlin")
}


5. Boolean 속성에 대한 이름 수정

Kotlin DSL에서는 전부는 아니지만 일부 boolean 값을 갖는 속성에 대해서 이름에 is 접두사를 갖습니다.

From.

1
2
3
4
5
6
7
buildTypes {
        release {
            minifyEnabled true
            debuggable false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

To.

1
2
3
4
5
6
7
8
9
10
buildTypes {
        release {
            isMinifyEnabled = true
            isDebuggable = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }


참고

0%