본문 바로가기

Build/Gradle

Gradle 도큐먼트: 의존성(Dependencies) 관리

더보기

프로젝트 의존성과 Gradle 의존성 관리에 대해서 소개합니다.

이 문서의 시작에 앞서 이 블로그의 문서: 작업(Tasks) 실행하기를 선행해야 합니다.

프로젝트 의존성

Gradle은 의존성 관리와 자동화에 대한 기술적 지원을 제공합니다.

빌드 스크립트 gradle.build.kts을 열고 repositories 그리고 dependencies 항목을 살펴봅니다.

repositories {
    // Use Maven Central for resolving dependencies.
    mavenCentral()
}

dependencies {
    // Use JUnit test framework.
    testImplementation("junit:junit:4.13.2")

    // This dependency is used by the application.
    implementation("com.google.guava:guava:32.1.2-jre")
}
코드 비고
Line 1:4 respositories { ... } 의존성 원본이 위치한 리포지토리입니다.
Line 6:12 dependencies { ... } Gradle이 의존성을 찾기 위해 참고하는 정보입니다.

mavenCentral()은 Maven 리포지토리를 의미합니다. Maven Central JAR 파일 플러그인  라이브러리를 제공하는 자바의 아티팩트 스토어입니다.

junitguava는 Gradle이 특정화하기 위한 의존성에 대한 정보를 담고 있습니다.

  com.google.guava:guava:32.1.2-jre junit:junit:4.13.2 비고
Group com.google.guava junit 의존성을 배포한 단체에 대한 식별자입니다.
Name guava junit 의존성에 대한 식별자입니다.
Version 32.1.2-jre 4.13.2 Import하려는 버전입니다.

Transitive dependencies이란?

Transitive dependencies는 의역하면 전이 의존성 또는 전이 종속성입니다.

간단하게 의존성을 위한 의존성이라고 생각하면 됩니다.

더보기

guava 의존성은 failureaccess라는 라이브러리를 필요로합니다.

따라서 guava 의존성을 추가하면 failureacess 의존성이 함께 딸려오는데 여기서 failureacess를 Transitive dependencies라고 부릅니다.

프로젝트 루트 디렉토리에서 ./gradlew :app:dependencies를 사용하면 의존성에 대한 트리 구조를 확인 할 수 있습니다.

$ ./gradlew :app:dependencies

> Task :app:dependencies

------------------------------------------------------------
Project ':app'
------------------------------------------------------------

...

compileClasspath - Compile classpath for source set 'main'.
\--- com.google.guava:guava:32.1.2-jre
     +--- com.google.guava:failureaccess:1.0.1
     +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
     +--- com.google.code.findbugs:jsr305:3.0.2
     +--- org.checkerframework:checker-qual:3.12.0
     +--- com.google.errorprone:error_prone_annotations:2.11.0
     \--- com.google.j2objc:j2objc-annotations:1.3

...
코드 비고
Line 12:18 Transitive dependencies com.google.guava:guava:32.1.2-jre 의존성을 추가하기 위한 전이 의존성에 대한 항목이 표시되고 있습니다.
그 안에는 com.google.guava:failureaccess:1.0.1가 있습니다.

프로젝트 의존성을 표시하는 방법

콘솔에서 의존성을 표시하기 위해서 ./gradlew :app:dependencies를 사용했습니다.

의존성을 표시하는 또 다른 방법은 빌드 스캔(Build Scan)입니다.

빌드 스캔을 사용하려면 --scan 옵션을 추가하고 ./gradlew build --scan 명령어를 실행합니다.

$ ./gradlew build --scan

BUILD SUCCESSFUL in 423ms
7 actionable tasks: 7 up-to-date

Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no] yes

Gradle Terms of Service accepted.

Publishing build scan...
https://gradle.com/s/link

빌드 스캔 기능은 공유 가능(Shareable)하고 중앙 집중적(Centralized)으로 작성된 빌드 레코드로 Gradle을 통해 무료로 제공됩니다.

빌드 스캔과 관련된 자세한 내용은 Get started with Build Scan® for Gradle, Apache Maven™, and sbt을 참고합니다.

더보기

빌드 스캔을 사용하려면 약관에 동의해야합니다.

Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no] yes

약관에 동의하면 빌드 스캔 결과를 URL로 제공합니다.

Publishing build scan...
https://gradle.com/s/link

웹 브라우저를 켜고 URL에 들어가면 빌드 스캔을 활성화 하기 위해서 email 입력을 요구합니다.

입력한 email의 수신함을 열고 빌드 스캔 결과(this link)를 클릭합니다.

빌드 스캔 결과를 인터페이스로 제공하는 웹 페이지가 열립니다.

메뉴 탭에서 Dependencies를 열고 compileClasspath runtimeClasspath testCompileClasspath testRuntimeClasspath 항목을 펼칩니다.

예제에서 작성한 빌드 스크립트에서 알 수 있듯이 junitguava 의존성을 추가한 것을 알 수 있습니다.

org.junit.jupiter:junit-jupiter:5.9.3com.google.guava:guava:32.1.1-jre 항목을 펼칩니다.

junit guava 의존성에 대한 Transitive dependencies를 트리 구조의 인터페이스로 확인 할 수 있습니다.

프로젝트 의존성 갱신

새로운 의존성을 추가하거나 업데이트하는 일은 빌드 스크립트 gradle.build.kts를 사용합니다.

guava 버전을 수정하고 의존성 트리 구조가 어떻게 변화하는지 살펴봅니다.

implementation("com.google.guava:guava:30.0-jre")

빌드 스크립트 파일을 수정하였으면 Sync를 위해서 IntelliJ IDEA | Gradle | Reload All Gradle Projects 버튼을 클릭합니다.

Gradle 프로젝트의 Sync 작업이 완료되면 콘솔에서 다시 한 번 ./gradlew build --scan을 실행합니다.

guava 버전이 32.1.2-jre에서 30.0-jre로 변경 된 것을 확인 할 수 있습니다.

더보기

마찬가지로 ./gradlew :app:dependencies을 실행하여 의존성 트리를 확인합니다.

guava 버전이 변경되었으며 이와 관련된 Transitive dependencies 역시 최신화되었습니다.

$ ./gradlew :app:dependencies

compileClasspath - Compile classpath for source set 'main'.
\--- com.google.guava:guava:30.0-jre
     +--- com.google.guava:failureaccess:1.0.1
     +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
     +--- com.google.code.findbugs:jsr305:3.0.2
     +--- org.checkerframework:checker-qual:3.5.0
     +--- com.google.errorprone:error_prone_annotations:2.3.4
     \--- com.google.j2objc:j2objc-annotations:1.3

...

버전 카탈로그(Version Catalog) 추가하기

버전 카탈로그는 중앙 집중식으로 의존성을 선언하기 위한 목적으로 사용합니다.

더보기

의존성에 대한 버전 관리를 중앙 파일 하나에서 취급하기 때문에 버전 관리에 효율적이고 안전합니다.

모든 하위 프로젝트는 중앙 파일의 의존성과 버전을 참조합니다.

버전 카탈로그를 참조 중인 모든 하위 프로젝트의 버전 수정이 필요한 경우 중앙 파일을 수정합니다.

카탈로그는 gradle/libs.versions.toml에서 생성되며 하위 프로젝트의 빌드 파일이 이를 참조하게 됩니다.

먼저 카탈로그를 위한 파일을 생성합니다.

$ cd gradle
$ touch libs.versions.toml

파일의 내용은 다음과 같이 작성합니다.

[versions]
junitVer = "5.9.1"
guavaVer = "32.1.2-jre"

[libraries]
junit = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junitVer" }
guava = { module = "com.google.guava:guava", version.ref = "guavaVer" }

app/build.gradle.kts 파일의 dependencies 블록을 다음과 같이 수정합니다.

dependencies {
    testImplementation(libs.junit)
    implementation(libs.guava)
}

Gradle 프로젝트가 정상적으로 실행되는지 확인합니다.

$ ./gradlew run

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 2s
2 actionable tasks: 2 executed

정리 및 복습

  • 프로젝트의 의존성은 빌드 스크립트 파일 gradle.build.kts에서 관리합니다.
respositories { ... } dependencies { ... }
의존성 원본이 위치한 리포지토리입니다.
가장 많이 사용되는 Maven CentralmavenCentral()을 입력합니다.
Gradle이 의존성을 찾기 위해 참고하는 정보입니다.
  • 의존성은 콜론(:)으로 구분자로 구분되며 각각 Group Name Version을 의미합니다.
  • 예를 들어 의존성 com.google.guava:guava:32.1.2-jre은 다음과 같이 구분됩니다.
  com.google.guava:guava:32.1.2-jre 비고
Group com.google.guava 의존성을 배포한 단체에 대한 식별자입니다.
Name guava 의존성에 대한 식별자입니다.
Version 32.1.2-jre Import하려는 버전입니다.
  • 의존성을 추가하면 의존성에 딸려있는 의존성이 함께 추가됩니다.
  • 이때 의존성에 딸려있는 의존성을 Transitive dependencies(전이 의존성)이라고 부릅니다.
  • 프로젝트의 의존성을 표시하는 방법은  ./gradlew :app:dependencies를 사용하는 것과 빌드 스캔(Build Scan) 두 가지가 있습니다.
  • 빌드 스캔은 Get started with Build Scan® for Gradle, Apache Maven™, and sbt을 참고합니다.