Server/Gradle

Gradle - DependencyManagement 이해하기!

JaeHoney 2023. 5. 30. 08:25

멀티 모듈 프로젝트에서 외부 라이브러리를 사용할 때 고민이 있었다.

  • A 프로젝트와 B 프로젝트와 C 프로젝트에서 모두 동일한 버전의 라이브러리를 사용해야 하는 상황
  • 각 프로젝트의 build.gradle에서 라이브러리 의존성 버전을 일일이 동기화해줘야 한다.

이러한 문제를 잘 해결할 수 없을까..?

dependency-management-plugin

Gradle의 의존성 관리 플러그인(Dependency-management-plugin)을 사용하면 이를 해결할 수 있다.

 

의존성 관리 플러그인은 Maven과 같은 의속성의 관리 및 제외를 제공하는 Gradle Plugin이다.

  • Gradle 6.8 이상 Java 8 버전 이상에서 지원된다.

사용하기 전에

DependencyManagement는 Gradle 플러그인 포탈에서 가져와 적용할 수 있다.

사용 방법

DependencyManagement를 사용하는 방법은 크게 2가지가 있다.

  1. DSL을 활용해서 의존성을 직접 구성
  2. MavenBom을 Import

1. 의존성 관리 DSL

종속성 관리 DSL을 활용하는 방법이다.

dependencyManagement {
    dependencies {
        dependency 'org.springframework:spring-core:4.0.3.RELEASE'
    }
}
dependencyManagement {
    dependencies {
        dependency group:'org.springframework', name:'spring-core', version:'4.0.3.RELEASE'
    }
}

위와 같이 dependencyManagement를 선언하면 아래와 같이 dependencies(의존성) 에서는 버전 명시가 없어도 dependencyManagement에 있는 버전을 가져와서 사용한다.

dependencies {
    implementation 'org.springframework:spring-core'
}

 

그룹 및 버전이 동일한 여러 라이브러리에 대한 의존성을 사용할 경우 집합을 사용할 수 있다.

dependencyManagement {
     dependencies {
          dependencySet(group:'org.slf4j', version: '1.7.7') {
               entry 'slf4j-api'
               entry 'slf4j-simple'
          }
     }
}

2. MavenBom 가져오기

MavenBom을 활용한 방법이다.

 

아래는 root_gradle의 일부이다. (직접 프로젝트에 적용한 부분을 그대로 가져왔다.)

dependencyManagement를 등록하면 해당 의존성을 사용하는 모든 모듈에서 의존성 버전이 동일하게 관리된다.

 

내부적으로는 Maven Bom을 가져와 버전을 프로젝트 의존성에 적용한다.

그래서 각각의 모듈(프로젝트)에서는 버전을 명시하지 않고 의존성을 추가해주기만 하면 된다.

Override 문제

주의할 점은 버전을 중복해서 작성할 때이다.

dependencyManagement {
    imports {
        mavenBom 'io.spring.platform:platform-bom:1.1.1.RELEASE'
    }
    dependencies {
        dependency 'com.google.guava:guava:18.0'
    }
}

Bom에 버전이 명시되어 있음에도 의존성 버전이 직접 명시되면 Bom으로 가져온 버전이 무시되고, 의존성에 직접 선언된 버전이 우선된다.

 

dependencyManagement {
    overriddenByDependencies = false
}

의존성 버전이 Override되는 현상을 원하지 않는다면 해당 구문을 추가하면 된다.

참고

더 다양한 기능에 대해서는 아래를 참고하자.