이번에 공부해볼 내용은 Kotlin DSL이 뭔지 알아보고 기존 Groovy DSL을 통해 의존성 관리하던걸 Kotlin DSL로 마이그레이션 하는 것을 해보도록 하겠다.
# Kotlin DSL란?
우선 본격적으로 들어가기 전에 도대체 Kotlin DSL이 뭔지를 알아야 좀 더 이해하기 쉽기 때문에 이녀석이 뭔지를 알아보자!
DSL은 Domain Specific Language의 약자로 특정 분야에 국한해 사용하는 언어를 의미한다.
Kotlin DSL은 Gradle, Android, SQL 등 다양한 분야에서 사용된다.
특히 Android 의존성을 관리할때 Groovy DSL를 사용했는데 안드로이드 스튜디오 4.2(Arctic Fox), 2023-04월부터 Groovy DSL가 아니라 Kotlin DSL를 통해 의존성 관리를 공식 블로그에 기본값 채택했다고 발표하였다.
그래서 아래 사진처럼 안드로이드 스튜디오에서 새로운 프로젝트 생성 시 Recommended라고 나오고 기본으로 선택이 되어있다.
# Kotlin DSL의 장점과 단점
그럼 과연 Groovy DSL에 비해서 장점과 단점이 무엇인지 알아보자!
장점같은경우는 위에 공식문서에도 나와있다.
## 장점
- 정적 타입 체크: Kotlin DSL은 정적 타입 체크를 제공한다. 이로 인해 컴파일 시점에 오류를 찾을 수 있고, 이는 잠재적인 버그를 줄이는 데 도움이 된다.
- 자동 완성: Kotlin DSL은 IDE에서 더 나은 자동 완성을 제공한다. 이는 작업의 효율성을 높이고 오류를 줄이는 데 도움이 된다.
- 안전성: Kotlin DSL은 null 안전성을 제공한다. 이는 NullPointerException에서 오는 버그를 방지하는 데 도움이 된다.
## 단점
- 러닝커브가 있을 수 도 있다: Kotlin DSL은 말 그대로 Kolint 언어를 사용한다. 이는 Kotlin 언어에 익숙하지 않은 개발자들에게는 러닝커브가 높게 존재할 수 있다. 하지만 기존에 Kolint을 사용하던 개발자면 무시해도 되는 단점이다.
- 느린빌드속도: Kotlin DSL이 Groovy DSL에 비해서 빌드 속도가 느리다고 한다.
하지만 이 부분도 점점 나아지고 있다는 거 같다는 소문이 있다.
# Groovy DSL -> Kotlin DSL Migration 방법
이제 기존에 의존성이 Groovy DSL로 되어있던걸 Kotlin DSL으로 변경해 보자!
※ 본 방법은 공식문서 여기에 의해서 작성한 것이다.
1. root project에 bulidSrc 디렉터리를 생성한다.
🤚bulidSrc가 뭘까요?
buildSrc는 빌드 로직을 포함할 수 있는 Gradle 프로젝트 루트 디렉터리로
buildSrc과 Kotlin DSL을 사용해서 매우 적은 구성으로 커스텀 빌드 코드를 작성하고 전체 프로젝트에서 이 로직을 공유할 수 있다.
buildSrc를 변경하면 전체 프로젝트의 빌드 캐시가 무효화되기 때문에 잦은 수정을 피해야 한다.
bulidSrc는 Gradle이 수행되면 디렉터리가 존재하는 체크 한다.
그래서 bulidSrc를 이용하면 복잡한 프로젝트에서도 의존성 버전을 일관성 있게 유지하고, 업데이트를 쉽게 관리할 수 있다.
2. buildSrc 디렉터리 안에 'build.gradle.kts' 파일 생성하기
build.gradle.kts안에 아래와 같은 코드 입력
plugins {
`kotlin-dsl` // kotlin dsl 설정하는 부분
}
repositories {
google()
mavenCentral()
}
object PluginVersion {
const val GRADLE = "8.1.2" // 각자 버전에 맞는 gradle 버전 입력
const val KOTLIN = "1.7.20" // 각자 버전에 맞는 Kotlin 버전 입력
}
dependencies {
implementation("com.android.tools.build:gradle:${PluginVersion.GRADLE}")
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:${PluginVersion.KOTLIN}")
}
3. buildSrc/src/main/kotlin/Dependency.kt 생성한다
이 부분에서는 기존에 의존성 추가할 때 아래와 같은 라이브러리 의존성을 object로 관리를 하면서 추가해 준다
androidx.appcompat.appcompat:x.x.x
androidx.core:core-ktx:x.x.x
object Libs {
object Androidx {
const val core = "androidx.core:core-ktx:1.10.1"
const val lifecycle = "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1"
const val activity = "androidx.activity:activity-compose:1.7.0"
const val
}
object Compose {
const val composeBom = "androidx.compose:compose-bom:2023.08.00"
const val composeUi = "androidx.compose.ui:ui"
const val composeUiGraphics = "androidx.compose.ui:ui-graphics"
const val composeUiToolingPreview = "androidx.compose.ui:ui-tooling-preview"
const val composeMaterial3 = "androidx.compose.material3:material3"
}
}
4. 기존 build.gradle(:app) 파일 확장자를 build.gradle.kts로 변경 및 내용 수정
🤚 KTS: Gradle이 빌드 구성 파일에서 사용하는 Kotlin 언어 버전인 Kotlin 스크립트를 나타낸다. Kotlin 스크립트는
명령줄에서 실행할 수 있는 Kotlin 코드이다
kts로 변경하고 내용을 수정해야 하는데 기존과 달라진 몇 가지 규칙이 있다.
4-1 Plugins 블록
※ 항상 위에 코드가 기존 Groovy DSL이다.
// Groovy DSL
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
// Kotlin DSL
plugins {
id("com.android.application")
id ("kotlin-android")
}
여기서 알아야 할 규칙은 기존에는 id다음 이어질 문자는 '(작은 따옴표)로 시작했지만 Kotlin DSL에서는 id 다음 ( (괄호)를 열고 "(큰 따옴표)로 감싸주는 규칙을 갖고 있다.
4-2 함수 호출 시 괄호를 추가해준다.
// Groovy DSL
implementation 'androidx.core:core-ktx:1.10.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1'
// Kotlin DSL
implementation("androidx.core:core-ktx:1.10.1")
implementation('androidx.lifecycle:lifecycle-runtime-ktx:2.6.1')
4-3 속성을 할당하고 싶으면 = 를 추가해준다.
// Groovy DSL
namespace 'com.example.myapplication'
compileSdk 34
// Kotlin DSL
amespace = 'com.example.myapplication'
compileSdk = 34
🤚 여기서 버전 코드 같은 것들은 하드 코딩을 안 해도 되고 아까 위에서 Dependency.kt 한 것처럼 object 파일을 하나 생성해서 참조를 해도 된다.
아래는 bulid.gradle.kts(:app)의 전체 코드이다. 각자 프로젝트 버전, 상황에 맞게 다를 수 있으니 문법만 보길 추천한다.
plugins {
id("com.android.application")
id("kotlin-android")
}
android {
namespace = "com.ex"
compileSdk = 33
defaultConfig {
applicationId = "com.ex"
minSdk = 33
targetSdk = 33
versionCode = 1
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
viewBinding = true
compose = true
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
dependencies {
implementation(Libs.Androidx.core)
// ....
}
bulidSrc의 폴더 구조는 위와 같다. 혹시나 이렇게 안 보인다면 Sync를 한번 해보는 걸 추천한다.
5. 기존 bulid.gradle(:project) 파일 확장자를 bulid.gradle.kts로 변경 및 내용 수정
// Groovy DSL
plugins {
id 'com.android.application' version '8.2.0-rc01' apply false
id 'org.jetbrains.kotlin.android' version '1.9.0' apply false
}
// Kotlin DSL
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath ('com.android.tools.build:gradle:8.1.2')
classpath ("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20")
}
}
🤚 Gradle 버전과 Kotlin-gradle-plugin 버전은 각자 프로젝트에 맞게 설정하면 된다.
그리고 항상 작업을 다 하면 Sync를 하는 것을 추천한다.
6. 기존 setting.gradle 파일확장자를 setting.gradle.kts로 변경 및 내용 수정
// Groovy DSL
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "My Application"
include ':app'
//Kotlin DSL
rootProject.name = "My Application"
include (":app")
여기까지 했으면 완료이다 이제 bulidSrc폴더에 다양한 objcet 파일을 만들어서 버전이라던가 의존성등 간편하게 관리를 할 수 있게 된다.
평소에는 그냥 하드코딩, 복붙 했던 코드들이 관리하기 편해진 거 같다.
참조
https://www.charlezz.com/?p=45140
https://beomseok95.tistory.com/367
https://velog.io/@yuuuzzzin/Android-buildSrc-Kotlin-DSL%EB%A1%9C-Dependency-%EA%B4%80%EB%A6%AC%ED%95%98%EA%B8%B0
https://developer.android.com/studio/build/migrate-to-kts?hl=ko
'Kotlin 공부 노트' 카테고리의 다른 글
[Kotlin Flow] 코틀린 Flow란? - 예제와 함께 알아보기 (1) | 2024.09.17 |
---|---|
[Kotlin-Coroutine] coroutine Mutex(상호배제) 예제를 통한 사용법 (1) | 2024.06.09 |
DTO, DAO, VO에 알아보자! (0) | 2023.03.30 |
코틀린의 오브젝트란? (object, companion object) (0) | 2022.02.17 |
프래그먼트(Fragment) with Kotlin 알아보기! (0) | 2022.02.10 |