3 의존성 관리(Managing Dependencies)

  • 3.1. 의존성 관리 플러그인으로 의존성 관리(Managing Dependencies with the Dependency Management Plugin)
    • 3.1.1. 관리 버전 커스텀(Customizing Managed Versions)
    • 3.1.2. 스프링 부트의 의존성 관리를 단독으로 사용(Using Spring Boot’s Dependency Management in Isolation)
    • 3.1.3. 더 알아보기(Learning More)
  • 3.2. 그레이들의 Bom 지원으로 의존성 관리(Managing Dependencies with Gradle’s Bom Support)
    • 3.2.1. 관리 버전 커스텀(Customizing Managed Versions)

3. 의존성 관리(Managing Dependencies)

스프링 부트 애플리케이션에서 의존성을 관리하려면, io.spring.dependency-management 플러그인을 적용하거나 그레이들의 기본 bom을 사용할 수 있다. 전자의 주요 이점은 프로퍼티 기반 맞춤 관리 버전을 제공하는 반면, 후자를 사용하면 빌드 속도가 빨라질 가능성이 높다.

3.1. 의존성 관리 플러그인으로 의존성 관리(Managing Dependencies with the Dependency Management Plugin)

io.spring.dependency-management 플러그인을 적용하면 스프링 부트 플러그인이 자동으로 사용 중인 스프링 부트 버전에서 spring-boot-dependencies bom을 가져온다. 이는 메이븐(Maven) 사용자가 즐겨 사용하는 방식과 유사한 의존성 관리 경험을 제공한다. 예를 들어, bom에서 관리되는 의존성을 선언할 때 버전을 생략할 수 있다. 이 기능을 사용하려면, 의존성을 선언하고 버전은 생략하면 된다:

Groovy

  dependencies {
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('org.springframework.boot:spring-boot-starter-data-jpa')
  }

Kotlin

  dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
}

3.1.1. 관리 버전 커스텀(Customizing Managed Versions)

의존성 관리 플러그인 적용 시 자동으로 가져오는 spring-boot-dependencies bom은 프로퍼티를 사용하여 관리하는 의존성 버전을 제어한다. 이런 프로퍼티의 전체 목록을 보려면 스프링 부트 레퍼런스에서 의존성 버전 부록(Dependency versions Appendix)을 참고하자.

관리되는 버전을 사용자 정의하려면 해당 프로퍼티를 설정한다. 예를 들어, slf4j.version 프로퍼티에 의해 제어되는 SLF4J의 버전을 사용자 정의할 수 있다:

Groovy

ext['slf4j.version'] = '1.7.20'

Kotlin

extra["slf4j.version"] = "1.7.20"

각 스프링 부트 릴리스는 서드-파티 라이브러리 의존성에 대한 설계 및 테스트를 했다. 버전을 오버라이드하면 호환성 문제가 발생할 수 있으므로 주의해야 한다.

3.1.2. 스프링 부트의 의존성 관리 단독으로 사용(Using Spring Boot’s Dependency Management in Isolation)

스프링 부트 플러그인을 해당 프로젝트에 적용하지 않고 프로젝트에서 스프링 부트 의존성을 관리할 수 있다. SpringBootPlugin 클래스는 그룹 ID, 아티팩트 ID 또는 버전을 몰라도 bom을 가져오는 데 사용할 수 있는 BOM_COORDINATES 상수(constant)를 제공한다.

먼저, 스프링 부트 플러그인에 의존하도록 프로젝트를 구성하되 적용(apply)하지는 말자:

Groovy

  plugins {
    id 'org.springframework.boot' version '3.1.1' apply false
  }

Kotlin

plugins {
  id("org.springframework.boot") version "3.1.1" apply false
}

스프링 부트 플러그인의 의존성이란 의존성 관리 플러그인을 선언하지 않고 사용할 수 있음을 의미한다. 이는 스프링 부트가 사용하는 것과 동일한 버전의 의존성 관리 플러그인을 자동으로 사용함을 의미한다.

의존성 관리 플러그인을 적용한(apply) 다음 스프링 부트의 bom을 가져오도록 구성해보자:

Groovy

apply plugin: 'io.spring.dependency-management'
dependencyManagement {
    imports {
      mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
    } 
}

Kotlin

apply(plugin = "io.spring.dependency-management")
the<DependencyManagementExtension>().apply {
  imports {
    mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
  }
}

위 코틀린 코드는 약간 어색하다. 이는 의존성 관리 플러그인을 적용할 때 명령형 방식을 사용하고 있기 때문이다.

루트 상위 프로젝트에서 플러그인을 적용하거나, 스프링 부트 플러그인에 대해 수행하는 것처럼 plugins 블록을 사용하여 코드를 어색하지 않게 만들 수 있다. 이 방식의 단점은 의존성 관리 플러그인의 버전을 지정해야 한다는 것이다.

plugins {
  java
  id("org.springframework.boot") version "2.7.12" apply false
  id("io.spring.dependency-management") version "1.0.15.RELEASE"
}
dependencyManagement {
  imports {
    mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
  }
}

3.1.3. 더 알아보기(Learning More)

의존성 관리 플러그인의 기능에 대해 자세히 알아보려면 해당 문서를 참고하자.

3.2. 그레이들의 Bom 지원으로 의존성 관리(Managing Dependencies with Gradle’s Bom Support)

그레이들을 사용하면 bom을 플랫폼(platform) 또는 인포스트플랫폼(enforcedPlatform) 의존성으로 선언하여 프로젝트 버전을 관리하는 데 사용할 수 있다. 플랫폼 의존성은 bom의 버전을 권장사항으로 취급하고 의존성 그래프의 다른 버전 및 제약 조건으로 인해 bom에 선언된 것과 다른 의존성 버전이 사용될 수 있다. 인포스트플랫폼 의존성은 bom의 버전을 요구사항으로 취급하며 의존성 그래프에 있는 다른 버전을 오버라이드한다.

SpringBootPlugin 클래스는 다음 예제와 같이 그룹 ID, 아티팩트 ID 또는 버전을 알 필요 없이 스프링 부트 bom 의존성을 선언하는 데 사용할 수 있는 BOM_COORDINATES 상수를 제공한다:

Groovy

dependencies {
  implementation platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
}

Kotlin

dependencies {
  implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES))
}

플랫폼 또는 인포스플랫폼은 선언된 구성 또는 선언된 구성에서 확장되는 구성의 버전만 제한한다. 결과적으로, 둘 이상의 구성에서 동일한 의존성을 선언하는 것이 필요할 수 있다.

3.2.1. 관리 버전 커스텀(Customizing Managed Versions)

그레이들 bom을 사용하면 spring-boot-dependencies의 프로퍼티로 관리하는 의존성 버전을 제어할 수 없다. 대신 그레이들이 제공하는 메커니즘 중 하나를 사용해야 한다. 그 메커니즘 중 하나는 해결 전략(resolution strategy)이다. SLF4J 모듈은 모두 org.slf4j 그룹에 있으므로 다음 예와 같이 해당 그룹의 모든 의존성을 특정 버전을 사용하도록 구성하여 해당 버전을 제어할 수 있다:

Groovy

configurations.all {
  resolutionStrategy.eachDependency { DependencyResolveDetails details ->
    if (details.requested.group == 'org.slf4j') {
      details.useVersion '1.7.20'
    } 
  }
}

Kotlin

configurations.all {
  resolutionStrategy.eachDependency {
    if (requested.group == "org.slf4j") {
      useVersion("1.7.20")
    } 
  }
}

각 스프링 부트 릴리스는 서드-파티 라이브러리 의존성에 대한 설계 및 테스트를 했다. 버전을 오버라이드하면 호환성 문제가 발생할 수 있으므로 주의해야 한다.