기존에는 Gradle에 라이브러리를 추가할때
implementation 'com.squareup.retrofit2:retrofit:(version)'
이런식으로 추가를 하고있었는데 다른 오픈 프로젝트 분석을 하다가 발견을 했다.
implementation(libs.hilt.android)
이런식으로 Gradle에 추가를 하고 있었는데 libs? 이게 뭐길래 다 저기서 등록하는 걸까? 라는 생각을 갖게 되었고 구글링을 해보니 toml 파일에서 쉽게 관리를 할 수 있다는것을 알게 되었다.

프로젝트단에 gradle에 libs.versions.toml 파일을 추가해주시면됩니다.
[versions]
agp = "8.3.2"
kotlin = "1.9.22"
kotlinxCoroutines = "1.7.3"
kotlinxSerializationJson = "1.6.2"
ksp = "1.9.22-1.0.18"
coreKtx = "1.13.0"
retrofit = "2.9.0"
...
[libraries]
...
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
hilt-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" }
hilt-android-testing = { group = "com.google.dagger", name = "hilt-android-testing", version.ref = "hilt" }
kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" }
kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" }
retrofit-core = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" }
retrofit-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit" }
...
[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
androidLibrary = { id = "com.android.library", version.ref = "agp" }
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
toml은 4개로 구성되어 있는데 저는 우선 3개만 쓰고 있습니다.
[versions]
해당 라이브러리의 버전을 관리할 수 있습니다.
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.androidxComposeCompiler.get()
}
이런식으로 composeOptions에서 코틀린컴파일러버전도 따로 관리가 가능해서 좋습니다.
get()하면 해당 버전을 읽어옵니다.
[libraries]
실질적으로 라이브러리의 주소가 들어가는 곳 입니다.
위에 적은 retrofit2로 예시를 들어보겠습니다.
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
group = "com.squareup.retrofit2"
name = "retrofit"
version = retrofit << 위에서 정의한 버전을 가져다가 쓰면 됩니다.
retrofit-core = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" }
이런식으로 작성을 하시면 됩니다.
api(libs.retrofit.core)
그리고 gradle에서 이렇게 작성하고 Sync Now 해주시면 됩니다.
[plugins]
plugins {
id("com.android.application") version "8.3.2" apply false
}
plugins {
id("com.android.application")
}
기존에 plugins도 위와 같이 작성이 가능합니다.
androidApplication = { id = "com.android.application", version.ref = "agp" }
->
alias(libs.plugins.androidApplication) apply false
이런식으로 바꿔서 적용을 할 수 있습니다.
[bundles]
retrofit = [
"retrofit-core",
"retrofit-converter-gson"
]
번들에서 따로 retrofit만 넣을 수 있습니다.
implementation(libs.bundles.retrofit)
이렇게 넣으면 retrofit 번들로 꾸려진 건 한번에 적용이 됩니다.
후기
개인적인 생각으로는 싱글모듈앱에서는 사용하면 좋고 아니어도 괜찮은 느낌이다.
하지만 앱의 확장성을 생각한다면 해주는 편이 관리하기가 수월한 것 같다.
최근에 멀티모듈로 구성한 앱을 개발할 때 toml로 사용을 해봤는데 처음 설정만 해놓으면 꾸준히 앱을 관리하는 측면에서 훨씬 수월한것 같다.
앞으로도 toml로 계속 쓰게될 것 같다.
Toml 쉽다! 편하다!
참고
https://developer.android.com/build/migrate-to-catalogs?hl=ko#kts