Nia 01. Gradle Version Catalog

동훈이·2023년 2월 24일
0

nia

목록 보기
1/3
post-thumbnail

Nia 프로젝트 분석하기 첫 주제로 Gradle Version Catalog 에 대해서 알아보려고 합니다.

Gradle은 안정적인 빌드 환경을 구축하기 위한 필수 도구 중 하나입니다.
하지만 Gradle의 버전 관리는 어렵고 예전부터 여러가지의 방법으로 관리를 해오고 있었습니다.
이러한 문제를 해결하기 위해 Gradle 7부터는 Gradle Version Catalog 기능이 도입되었습니다.
이 기능을 사용하면 버전 관리를 간소화하고 개발자들이 더욱 쉽게 라이브러리 및 플러그인 버전을 관리할 수 있습니다.
Nia 프로젝트에서도 사용이 되었고, 앞으로 작업하는 프로젝트에도 적용을 해보기 위해 이 글을 작성하였습니다.

버전관리? 기존에는 어떻게 하고 있었더라?

기존에 버전관리는 2가지중 하나를 사용하고 있을 것입니다.

build.gradle 에 선언하기

implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.31")

첫 번째 방법의 문제점은 버전 관리가 어렵다는 것입니다. 하나의 파일에서 관리가 되는것이 아닌 각각의 build.gradle 파일에서 작성을 해주어야 하고, 반복되는 라이브러리들이 많아질 것 입니다.
이때 변경 사항이 생겨 적용을 하게 되는 과정이 번거로울 수 있습니다.

buildSrc 모듈을 만들어 정의하고 참조하기

/buildSrc
object Dependency {
    object Kotlin {
        const val version = "1.5.31"
        const val coroutine = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$version"
    }
}

/build.gradle
implementation(Dependency.Kotlin.coroutine)

두 번째 방법의 문제점은 빌드 시간이 느려질 수 있다는 것입니다. buildSrc의 상수를 변경하면 전체 그레들을 다시 빌드해야 하므로 빌드 시간이 늘어날 수 있습니다. 또한 모듈을 생성하려면 추가적인 노력이 필요하므로 단순히 버전 관리용으로는 적합하지 않습니다.

이 Gradle 버전 카탈로그는 이러한 문제를 해결하고 종속성 버전을 더 쉽게 관리할 수 있도록 합니다. 천천히 알아가보도록 하겠습니다

Gradle Version Catalog 에 대해서

Gradle Version Catalog는 Toml 파일을 사용하여 버전 정보를 관리합니다. 해당 파일을 통해 버전 그룹을 정의하고, 각 그룹에서 사용 가능한 버전을 지정한다. Gradle은 이 파일을 읽어서 라이브러리와 플러그인의 버전을 찾아서 사용합니다.

이를 통해 버전 정보를 일관되게 관리할 수 있으며, 버전 충돌을 방지할 수 있습니다. 이러한 장점들은 빌드 시스템의 안정성과 유지보수성을 향상시키며, 빌드 프로세스를 간소화하고 개발자의 작업 효율을 높이는 데 도움을 줍니다.

dependencies {
    implementation(libs.groovy.core)
}

위 코드는 Gradle Version Catalog 를 적용한 build.gradle 파일이며 해당 소스에서 libs 카탈로그를 나타내며 buildSrc 모듈과 동일한 방식으로 작성합니다.

buildSrc 보다 버전 카탈로그를 사용하는 이점 중 하나는 버전 카탈로그가 상수를 인라인하는 대신 함수 호출을 사용한다는 것입니다. 즉, 상수 값을 변경해도 모든 플러그인 코드의 재빌드가 트리거되지 않아 더 효율적일 수 있습니다.

여기서 상수 표현은 우리가 선언한 버전 또는 라이브러리 주소를 나타냅니다.

Gradle Version Catalog 작성방법

버전 카탈로그를 생성하려면 루트 gradle 디렉터리에 libs.versions.toml 파일을 생성하기만 하면 됩니다.

이제 파일을 작성해보도록 할텐데요 toml 파일은 4가지 영역으로 나뉩니다.

[version]: 이 섹션은 라이브러리 선언 섹션에서 사용할 수 있는 버전을 선언하는 데 사용됩니다.
[libraries]: 이 섹션은 라이브러리를 선언하는 데 사용됩니다.
[plugins]: 이 섹션은 Gradle 플러그인을 선언하는 데 사용됩니다.
[bundle]: 이 섹션은 번들을 선언하는 데 사용됩니다.

예를 들어 Firebase를 추가해 보겠습니다. 이전에는 다음과 같이 Gradle을 구성했을 수 있습니다.

implementation(platform("com.google.firebase:firebase-bom:31.2.0"))
implementation("com.google.firebase:firebase-auth-ktx")
implementation("com.google.firebase:firebase-firestore-ktx")
implementation("com.google.firebase:firebase-analytics-ktx")

위 구성을 기반으로 toml 을 작성해보도록 하겠습니다.

[version]
firebase = "31.2.0"

[libraries]
firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebase" }
firebase-auth-ktx = { group = "com.google.firebase", name = "firebase-auth-ktx" }
firebase-firestore-ktx = { group = "com.google.firebase", name = "firebase-firestore-ktx" }
firebase-analytics-ktx = { group = "com.google.firebase", name = "firebase-analytics-ktx" }

[bundle]
firebaes = ["firebase-auth-ktx", "firebase-analytics-ktx", "firebase-firestore-ktx"]

파일을 작성했으니 이제 바로 build.gradle 로 가서 선언부만 수정해주면 됩니다.

implementation(libs.firebase.bom)
implementation(libs.firebase.auth.ktx)
implementation(libs.firebase.firestore.ktx)
implementation(libs.firebase.analytics.ktx)

이렇게 gradle version catalog 에 대해서 알아보았는데 확실히 기존보다 버전 관리가 편하고 무엇보다 타 프로젝트를 시작할때 toml 파일만 옮겨주면 매번 라이브러리 버전을 찾으러 다니지 않아도 되니 확실히 편한점이 있는거 같습니다.

nia 에서는 https://github.com/android/nowinandroid/blob/main/gradle/libs.versions.toml 다음과 같은 toml을 구성하고 있습니다. 해당 파일을 기준으로 내가 필요로 하는 라이브러리를 추가적으로 넣거나 아에 새로 생성해보는것도 좋을 것 같습니다.

그 외에 toml 을 자동으로 생성해주는 gitignore.io 같은 서비스도 생기면 좋을 것 같은? 바램 입니다.

profile
안드로이드 개발자

0개의 댓글