2023 4월 13일 구글이 Android의 새로운 빌드 언어로 Kotlin DSL을 채택
구글이 채택한 Kotlin DSL이 무엇인지, 어떤 장점이 있는지 알아본다.
Kotlin DSL
Kotlin으로 작성된 도메인 특화 언어(DSL)로 Gradle, Android 등 여러 영역에서 사용되며 정적 타입 검사, 람다 함수, 확장 함수 등과 같은 Kotlin 언어의 장점을 살려 직관적인 DSL을 구축 가능하게 한다.
Kotlin DSL 채택 이유
꼭 Kotlin DSL을 사용해야 하는 것은 아니나 다른 DSL의 비해서 특정 도메인이나 작업에 대해 보다
표현력이 뛰어나고 유연한 코드를 작성할 수 있도록 도와주는 도구로 채택된 것으로 본다
Kotlin DSL is Now the Default for New Gradle Builds
Today we're excited to announce that we're switching the default language for build scripts to Kotlin! We've been working with the Gradle and JetBrain
android-developers.googleblog.com
Kotlin DSL 장점
간결하고 가독성이 높은 코드
- Kotlin은 간결하고 표현력이 뛰어난 프로그래밍 언어, Kotlin의 장점을 살려 더욱 간결하고 가독성이 높은 코드를 작성할 수 있게 함
타입 안전성
- 정적 타입 언어로 컴파일 시점에서 오류 검출, 컴파일러의 검사를 통해 더욱 안정적인 코드를 작성 가능
IDE 지원
- 안드로이드 스튜디오를 비롯한 다양한 IDE 지원, IDE에서 DSL의 구문 강조 표시, 자동 완성, 코드 내비게이션 등의 기능을 활용할 수 있으며, 개발 생산성을 향상 가능
유연성과 확장성
- Kotlin은 객체 지향 프로그래밍과 함수형 프로그래밍을 모두 지원하므로, Kotlin DSL을 작성할 때 유연하고 확장 가능한 구조를 구성 가능
Kotlin의 기능 활용
- Kotlin은람다식, 확장 함수, Null 안전성 등 다양한 특징과 기능 제공, Kotlin DSL을 사용하면 이러한 기능을 활용하여 DSL를 보다 효율적으로 작성 가능
Kotlin DSL 단점
학습 곡선
- Kotlin DSL은 Kotlin 언어의 특성과 문법을 이해필요, Kotlin 언어에 익숙하지 않은 개발자들에게는 학습 곡선이 존재할 수 있다.
생산성 저하
- 표현력이 높고 강력한 기능을 제공하지만, 초기 구현 및 설정에는 추가적인 작업이 필요할 수 있다. 기존의 설정 방식이나 프레임워크에 익숙한 개발자들에게는 처음에는 생산성 저하가 있을 수 있다.
제한된 확장성
- Kotlin 언어의 기능과 제한적인 범위 내에서 확장이 가능하나 특정한 요구사항이나 도메인에 따라 확장의 어려움이 존재할 수 있다. 이는 Kotlin 언어의 한계이거나 DSL 설계의 한계로 인해 발생할 수 있다.
Kotlin DSL, Groovy DSL 차이
Kotlin | Groovy | |
언어 | Kotlin 언어 | Groovy 언어 |
문법 | 정적 타입, 람다식, 확장 함수 등의 Kotlin 문법 |
동적 타입, 클로저, 메소드 체인 등의 Groovy 문법 |
타입 안전성 | 정적 타입으로 타입 안전성 보장 | 동적 타입으로 타입 안전성 제한적 |
확장성 | Kotlin 언어 기능을 활용한 확장성 | Groovy 언어 기능을 활용한 확장성 |
가독성 | Kotlin 표현력을 활용한 가독성 | Groovy 표현력을 활용한 가독성 |
IDE 지원 | 안드로이드 스튜디오 등 Kotlin IDE에서 지원 | IntelliJ IDEA 등 Groovy IDE에서 지원 |
도구 및 라이브러리 | Kotlin과 Gradle 통합 지원 | Groovy와 Gradle 통합 지원 |
사용범위 | 주로 안드로이드 및 Kotlin 기반 프로젝트 | 다양한 프로젝트 및 스크립트 |
학습 곡선 | Kotlin 언어 | Groovy 언어 |
이런 장∙단점을 가졌지만, 모든 프로젝트에 Kotlin DSL을 사용할 수는 없다.
어떤 DSL을 사용할지의 대한 여부는 프로젝트의 특정 상황과 요구 사항에 따라 결정해야 한다.
구글에서 Kotlin DSL을 Android 앱용 Gradle 빌드 파일의 기본 스크립트로 사용하겠다고 밝힌 시점에서,
변화가 빠른 Android 생태계를 따라가기 위해 지금부터는 적극적으로 Kotlin DSL을 활용할 것이다.
buildSrc
의존성 관리와 IDE 자동완성 지원을 위해 kotlin 코드를 가지는 buildSrc 모듈을 만들 수 있다.
Gradle이 수행되면 buildSrc 디렉터리가 존재하는지 체크한다.
이 경우 Gradle은 자동적으로 코드를 컴파일하고 테스트한 뒤 당신의 빌드 스크립트의 classpath에 넣는다.
이 방법은 유지 보수, 리팩터링 및 코드 테스트가 더 쉽다.
빌드 로직을 포함할 수 있는 Gradle 프로젝트 루트 디렉터리
buildSrc와 Kotlin DSL을 사용해서 매우 적은 구성으로 커스텀 빌드 코드를 작성하고 전체 프로젝트에서 이 로직을 공유하여 사용
buildSrc를 변경하면 전체 프로젝트의 빌드 캐시가 무효화되기 때문에 잦은 수정을 피해야 한다.
Setting
rootDirectory에 buildSrc Directory 생성
buildSrc/build.gradle.kts 생성
plugins {
`kotlin-dsl`
}
repositories {
mavenCentral()
}
buildSrc/src/main/kotlin/Dependency.kt 생성
사용할 의존성 작성 (임시로 라이브러리 dependency만)
import Versions.hilt
import Versions.room
object Versions {
const val hilt ="2.49"
const val ksp = "1.9.21-1.0.15"
const val room = "2.6.1"
}
object Lib {
object Room{
const val core = "androidx.room:room-runtime:$room"
const val compiler = "androidx.room:room-compiler:$room"
const val ktx = "androidx.room:room-ktx:$room"
}
object Activity{
const val ktx = "androidx.activity:activity-ktx:1.8.1"
}
object Dagger{
object Hilt{
const val core = "com.google.dagger:hilt-android:$hilt"
const val compiler = "com.google.dagger:hilt-android-compiler:$hilt"
}
}
object Kotlin{
const val coroutine = "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4"
}
}
각 그래들 kts로 변경 / build.gradle -> build.gradle.kts 변경
작성한 dependency 사용 (사용이 안될 때 Sync 진행)
build.gradle.kts (:app)
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("com.google.devtools.ksp")
id("dagger.hilt.android.plugin")
}
android {
namespace = "com.ljb.example"
compileSdk = 34
defaultConfig {
applicationId = "com.ljb.cleanarchitecture"
minSdk = 21
targetSdk = 34
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
...
}
dependencies {
...
implementation(Lib.Dagger.Hilt.core)
ksp(Lib.Dagger.Hilt.compiler)
implementation(Lib.Activity.ktx)
}
build.gradle.kts (:project)
plugins {
...
id("com.google.devtools.ksp") version Versions.ksp apply false
id("com.google.dagger.hilt.android") version Versions.hilt apply false
}
setting.gradle.kts
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name="Example"
include (":app")
Kotlin DSL
https://developer.android.com/studio/build/migrate-to-kts?hl=ko
https://android-developers.googleblog.com/2023/04/kotlin-dsl-is-now-default-for-new-gradle-builds.html
https://blog.imqa.io/kotlin-dsl/
buildSrc
https://seansation-blog.tistory.com/7
'Kotlin > Basic' 카테고리의 다른 글
object, companion object (0) | 2024.01.02 |
---|---|
Stream Fuction (0) | 2022.03.14 |
Closure, Scope Function (let, also, run, apply, with) (0) | 2022.03.11 |
Coroutine (0) | 2022.01.17 |