SW/Gradle

Gradle: Dependency Analysis, 쉽게 이해하기: Subproject와 Transitive Dependency 방법, 예제

얇은생각 2025. 2. 21. 07:30
반응형

개발하다 보면 "이 Library는 왜 필요하지?"라는 궁금증이 들 때가 많죠? 특히 큰 프로젝트에서는 여러 Subproject가 서로 얽혀 있고, Dependency도 복잡하게 엮여 있어요. 이런 걸 제대로 관리하지 않으면, 어느 날 갑자기 "이게 왜 Error가 나는 거지?" 하면서 머리를 싸매게 될 수도 있죠. 😵‍💫 하지만 걱정 마세요! Gradle이 이런 복잡한 관계를 깔끔하게 정리해 주는 든든한 Tool이니까요.

오늘은 Gradle Dependency Analysis를 쉽게 풀어서 이야기해 볼게요. Subproject 간의 관계를 명확히 이해하고, Transitive Dependency가 어떻게 작용하는지도 함께 살펴봅시다. 어렵지 않아요! 편하게 따라오세요. 😊

 


 

Gradle: Dependency Analysis, 쉽게 이해하기: Subproject와 Transitive Dependency 방법, 예제

 

Subproject Dependency, 어떻게 확인할까?

기본 개념 살펴보기

Gradle을 사용하면 Multi-Module Project에서 각각의 Subproject가 독립적으로 Dependency를 가질 수 있어요. 특정 Subproject의 Dependency를 확인하는 방법은 간단합니다. 다음 Command 하나면 끝!

gradle :SubprojectName:dependencies

 

혹시 Project 전체 Dependency를 한눈에 보고 싶다면?

gradle dependencies

 

실행하면 무슨 일이?

Gradle이 각 Build 단계(Compile, Runtime, Test 등)에서 필요한 Library 목록을 Tree 형태로 정리해 줍니다. 이런 느낌이죠:

+--- project :services
|    +--- project :data
|    |    +--- project :integration
|    |    \--- com.fasterxml.jackson.core:jackson-databind:2.13.1
|    \--- junit:junit:4.13.2

 

이걸 보면 뭐가 보이나요?

  • services Project는 data Project를 필요로 해요.
  • data Project는 integration Project에 의존하고 있네요.
  • jackson-databind 같은 Library는 Transitive Dependency로 포함되죠.
  • junit은 Test 용도로 추가되어 있습니다.

 

이렇게 Dependency Tree를 분석하면, Project가 어떤 Library와 연결되어 있는지 한눈에 확인할 수 있어요.

 


 

Transitive Dependency가 뭐야?

쉽게 풀어보면

Transitive Dependency란, 직접 추가하지 않았지만 다른 Library를 통해 자동으로 포함되는 Dependency예요. 예를 들면, 내가 A라는 Library를 추가했는데, A가 B를 필요로 한다면? B도 자동으로 따라오게 됩니다. 🚀

 

왜 중요한가요?

Transitive Dependency 덕분에 우리는 매번 모든 Library를 일일이 추가할 필요가 없어요. 하지만 단점도 있어요. 생각보다 너무 많은 Library가 따라와서, 필요하지 않은 Code가 Project에 포함될 수도 있고, Version Conflict 문제도 발생할 수 있습니다.

 


 

Gradle Dependency Tree, 한눈에 파악하는 법

Dependency Tree 보는 Command

Gradle은 Dependency Tree를 시각적으로 확인할 수 있도록 도와줘요. 이 Command 하나만 실행하면 돼요:

gradle dependencies --configuration compileClasspath

 

이렇게 하면 Compile 시점의 Dependency 목록이 Tree 형태로 쭉 출력됩니다.

 

 

특정 Dependency만 보고 싶다면?

출력이 너무 길다면, 특정 범위의 Dependency만 확인할 수도 있어요.

gradle dependencies --configuration runtimeClasspath

 

이렇게 하면 Runtime 시점에 필요한 Library만 확인할 수 있죠.

 


 

Dependency 문제 해결 꿀팁! 🛠️

1. Dependency Version Conflict 해결하기

문제: 같은 Library인데 서로 다른 Version이 필요할 경우가 있어요. 이러면 Project가 꼬일 수도 있죠.

해결 방법: dependencyInsight Command를 사용해서 어느 부분에서 Conflict가 나는지 파악해 봅시다.

gradle dependencyInsight --dependency jackson-databind --configuration compileClasspath

 

2. 불필요한 Transitive Dependency 제거하기

문제: 사용하지 않는 Library가 Dependency에 포함되어 있는 경우가 있죠.

해결 방법: 특정 Library를 제외하는 설정을 적용할 수 있어요.

dependencies {
    implementation ('com.example:library:1.0') {
        exclude group: 'org.unwanted', module: 'unwanted-library'
    }
}

 

3. 누락된 Dependency 해결하기

문제: 필요한 Library가 제대로 로드되지 않을 때가 있어요.

해결 방법: build.gradle 파일에서 Repository 설정이 올바르게 되어 있는지 확인하세요.

repositories {
    mavenCentral()
}

 


 

기억할 것들 ✨

gradle dependencies Command로 Subproject Dependency 확인하기
✅ Transitive Dependency 흐름 파악해서 불필요한 Dependency 제거하기
dependencyInsight Command로 Version Conflict 문제 해결하기
✅ BOM(Bill of Materials)과 Dependency Locking 기능 활용하기

반응형