본문 바로가기

안드로이드/팁

[Android] Kotlin DSL 적용기

반응형

Kotlin DSL 이란

DSL이란 Domain Specific Language로 특정 도메인에 최적화된 언어를 말합니다. 

안드로이드에서 'Kotlin DSL' 을 적용했단 의미는 Groovy로 구성되어 있는 gradle 파일을 Kotlin으로 변경하는걸 뜻합니다.

 

Kotlin DSL vs Groovy DSL 

장단점을 충분히 고려하고 사용해본 후  팀이나 프로젝트에 맞는걸 사용하는걸 추천합니다. 

장점

- 컴파일시 에러를 확인

- 자동 완성

- 타입 안정성

- 코틀린 기능 활용 ( 함수형 프로그래밍 ) 

 

단점 

- 초기 빌드가 느림

- 학습 곡선 

 

마이그레이션

저는 진행중인 토이프로젝트에 적용한걸 공유하지만 프로젝트에 맞게 다양한 예시들을 검색해보시며 맞는걸들을 찾아 조합해 적용하는걸 추천드립니다.

 

root 프로젝트에 buildSrc 디렉토리를 생성합니다.

그리고 생성된 폴더안에 build.gradle.kts 파일을 생성합니다.

아래 사진에서 Dependencies.kt는 gradle 파일에서 사용될 버전들을 변수로 관리하고 생성한 파일로 필수는 아닙니다.

 

build.gradle.kts

위에서 생성한 파일에 아래 코드를 추가합니다.

plugins {
    `kotlin-dsl`
}

repositories {
    google()
    mavenCentral()
}

 

 

기존 gradle 파일 변경

기존에 사용중이던 gradle 파일명을 변경합니다.

  • setting.gradle -> setting.gradle.kts
  • build.gradle ( app level ) -> build.gradle.kts
  • build.gradle ( project level ) -> build.gradle.kts 

 

각 내부 코드들도 변경 해줘야 합니다.

 

build.gradle.kts ( app level )

변경 전

plugins {
    id 'com.android.application'
}

 

변경 후

' 대신 "를 사용 합니다.

plugins {
    id ("com.android.application")
    ...
}

 

변경 전

android {
	...
    compileSdk 33
    ...
    
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }

}

 

변경 후

android {
    ...
    compileSdk = Apps.compileSdk
    ...
    
     compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

 

변경 전

ext{
    lifecycle_version = '2.5.1'
    hilt_version = '2.44'
    okhttpVersion = '4.8.1'
    retrofitVersion = '2.9.0'
    flipperVersion = '0.154.0'
    glideVersion = '4.11.0'
}

dependencies {
    implementation 'androidx.core:core-ktx:1.7.0'
    ...
}

변경 후

dependencies {

    val lifecycle_version = "2.5.1"
    val hilt_version = "2.44"
    val okhttpVersion = "4.8.1"
    val retrofitVersion = "2.9.0"
    val flipperVersion = "0.154.0"
    val glideVersion = "4.11.0"

    implementation ("androidx.core:core-ktx:1.7.0")
    ...
    
}

 

build.gradle ( project level ) 

변경 전 

plugins {
    id 'com.android.application' version '7.4.0' apply false
    id 'com.google.gms.google-services' version '4.3.15' apply false
    ....
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

 

변경 후

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id("com.android.application") version "7.4.0" apply false
    id("com.google.gms.google-services") version "4.3.15" apply false
}

tasks.register("clean",Delete::class){
    delete(rootProject.buildDir)
}

 

settings.gradle.kts

변경전

include ':app'

 

변경 후

include (":app")

 

제가 적용하면서 특이점이 있는 변경점 들을 기재 했는데 저와 다르신 부분은 검색을 통해 적용하시면 됩니다.

 

 

적용 이후 에러 

위 변경을 모두 완료한 후 빌드는 되지만 gradle 파일 내부의 빨간줄이 가득했고 
마우스를 호버해보니 아래처럼 에러 문구가 나옵니다.

Cannot access 'java.lang.Comparable' which is a supertype of 'org.gradle.kotlin.dsl.KotlinBuildScript'. Check your module classpath for missing or conflicting dependencies

 

 

찾아보니 많이들 겪는 문제더라구요 대표적인 방법으론 

프로젝트 내부에 있는 캐시 파일 제거나 스튜디오 업데이트를 권장 했습니다.

저는 해결 안된 방법들이지만 참고하시라고 관련 블로그 링크 남깁니다.

 

제가 해결한 방법은 

File > Project Structure > SDK Location > Gradle Setting

위치의 jdk 버전을 변경하니 빨간줄이 사라졌습니다.

 

관련 링크입니다.

 

마이그레이션 관련 구글 공신 문서 링크 입니다.

 

Kotlin DSL에대해 익숙하지 않아 꼭 해봐야 한다고 말씀드리긴 어렵지만

구글에서 기본 스크립트로 사용하겠다고 했기 때문에 경험해보시는걸 추천합니다! 

 

 

 

 

 

 

반응형