spring-boot-dependencies 는 왜 사용하는걸까?

Brunch Kim·2025년 1월 2일
0

spring

목록 보기
2/2

안녕하세요-! 👋😊
오늘 같이 추운 날씨에도 포스팅은 계속됩니다!

Spring Boot 프로젝트에서 spring-boot-dependencies 를 프로젝트 디펜던시로 추가해서 사용하는 프로젝트들이 있는데요. 오늘은 이 라이브러리를 왜 추가해서 사용하는지 그 이유들에 대해서 예시와 함께 살펴보겠습니다.


spring-boot-dependencies 사용 시 장점

1. 의존성 버전 관리의 일관성 및 코드 간소화

• spring-boot-dependencies는 BOM(Bill of Materials) 형태로 제공되며, Spring Boot와 호환되는 안정적인 라이브러리 버전을 정의합니다.
• 이를 통해 개별 의존성의 버전을 지정할 필요가 없으며, 프로젝트 전반에 걸쳐 일관된 버전을 보장합니다.

dependencies {
    implementation "org.springframework:spring-context"
}

위 예시와 같이 버전을 명시하지 않아도, spring-boot-dependencies에 의해 자동으로 적절한 버전이 적용됩니다.
모든 의존성 버전을 하나하나 명시할 필요가 없어 pom.xml 또는 build.gradle 파일이 간소화됩니다.

2. 호환성 보장

• spring-boot-dependencies는 Spring Boot와 함께 사용되는 모든 라이브러리가 서로 호환되도록 테스트됩니다.
• 라이브러리 간 충돌 위험을 줄이고, 안정적인 개발 환경을 제공합니다.

예시)
현재 프로젝트에 Spring Data, Hibernate, Jackson 이 세개의 라이브러리를 디펜던시로 추가하여 사용하려 하는 경우, 각 개별 라이브러리 버전을 명시해서 사용할 수도 있지만, spring-boot-dependencies는 이러한 라이브러리가 특정 Spring Boot 버전과 최적의 호환성을 유지하도록 버전을 자동으로 설정해줍니다. 더 자세한 내용은 밑에서 다루도록 하겠습니다.

3. 보안 및 안정성

• Spring Boot 팀이 지속적으로 보안 취약점을 관리하고, 안정성을 검증합니다.
• 이를 통해 프로젝트에서 사용하는 라이브러리가 최신 보안 패치를 포함하도록 유지됩니다.


BOM 이란?

BOM(Bill of Materials)은 의존성 관리 파일로, 프로젝트에서 사용해야 할 권장 라이브러리 버전 정의서입니다. BOM은 프로젝트에서 의존성 간의 버전 충돌을 방지하고 일관성을 유지하는 데 사용됩니다.
• BOM은 Maven의 dependencyManagement와 Gradle의 platform으로 사용됩니다.
• spring-boot-dependencies는 Spring Boot와 호환되는 모든 주요 라이브러리의 버전을 미리 정의한 BOM입니다.

Gradle에서 BOM 사용 예시

dependencies {
    implementation platform("org.springframework.boot:spring-boot-dependencies:3.4.1")
    implementation "org.springframework:spring-core" // 버전 명시 안 해도 됨!
    implementation "com.fasterxml.jackson.core:jackson-databind" // 버전 명시 안 해도 됨!
}

BOM 에는 어떤 라이브러리들이 관리되고 있는걸까?

spring-boot-dependencies 를 사용한다고해서 반드시 세상 모든 라이브러리들이 안정적으로 자동적으로 관리되는 것은 아닌데요. 그렇다면 BOM 을 통해 어떤 라이브러리들이 관리되고 있는지를 아래 링크를 통해서 확인이 가능합니다.

아래 예시의 경우 Spring boot 3.4.1 의 예시 링크입니다.
https://github.com/spring-projects/spring-boot/blob/v3.4.1/spring-boot-project/spring-boot-dependencies/build.gradle

예를 들어, 다음과 같이 정의된 ch.qos.logback:logback-classic 라이브러리 같은 경우 버전 명시를 하지 않게되면 어떤 버전이 적용되는지 다음과 같이 찾아서 확인할 수 있습니다.

dependencies {
  implementation("ch.qos.logback:logback-classic") // 버전 명시 생략
}

BOM 에서 관리되지 않는 라이브러리 예시

대표적인 라이브러리로 io.github.resilience4j artifact 로 제공되는 라이브러리들이 이러한 경우에 해당됩니다.

BOM 에 포함되지 않는 이유는 다음과 같습니다.

  1. Spring Boot 생태계의 핵심 라이브러리가 아님
    • Spring Boot BOM은 주로 Spring Framework, Spring Data, Spring Security, Spring Batch 등 Spring Boot와 밀접한 관련이 있는 라이브러리를 포함합니다.
    • Resilience4j는 Spring Boot 기반에서 사용할 수 있는 라이브러리지만, Spring Boot 팀이 직접 관리하거나 핵심 기능에 포함되는 라이브러리가 아닙니다.

  2. 독립적인 라이브러리 관리
    • Resilience4j는 독립적인 오픈소스 프로젝트로, Spring Boot의 BOM과는 별도로 관리됩니다.
    • Spring Boot는 이 라이브러리를 쉽게 사용할 수 있도록 Starter(예: resilience4j-spring-boot3)를 제공하지만, BOM에 포함시키지는 않습니다.

--

다만, io.github.resilience4j » resilience4j-circuitbreaker 의 경우 Spring Cloud Circuit Breaker 라는 대안이 존재하며 이 라이브러리는 BOM 에 포함되어있습니다.

BOM 에 포함된 Spring Cloud Circuit Breaker 를 사용하는 예시

dependencies {
	// 버전 명시가 불필요합니다. BOM 에서 관리되기 때문입니다.
    implementation "org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j"
}

BOM 에 포함되지 않는 Resilience4j Circuit Breaker 를 사용하는 예시

dependencies {
	// 버전 명시가 필요합니다.
    implementation "io.github.resilience4j:resilience4j-spring-boot3:2.0.2"
}

Q1) 버전 명시를 하지 않으면 어떻게 될까요?

Maven의 경우
• Maven은 dependencyManagement 섹션에서 정의된 버전을 따르거나
• 부모 POM(예: spring-boot-dependencies 또는 다른 공통 부모 POM)에서 지정된 기본 버전을 따르게 됩니다.
• 위 두가지 케이스에도 해당되지 않는 경우 버전 명시를 필요로하는 다음과 같은 에러가 발생합니다.

```
[ERROR] Failed to execute goal on project your-project: Could not resolve dependencies for project ...
[ERROR] Could not find artifact <dependency> in central (https://repo.maven.apache.org/maven2)
```

Gradle의 경우
• Gradle은 해당 의존성이 다른 라이브러리에서 전이적 의존성으로 사용되고 있다면, 그 의존성의 버전을 선택합니다.
• 전이적 의존성이 없을 경우, Gradle은 최신 안정 버전을 선택하려고 시도할 수 있습니다. 하지만 이는 프로젝트에서 항상 안전한 선택이 아닐 수 있습니다.

Resilience4j 예시

implementation "io.github.resilience4j:resilience4j-spring-boot3" // 버전 명시 안되어있음

선택된 버전 확인

./gradlew dependencies | grep resilience4j

출력 예시

io.github.resilience4j:resilience4j-spring-boot3:2.0.0 -> 2.0.2

위 결과에서, Gradle이 현시점 기준 v2.0.2 최신 버전을 자동으로 선택했음을 알 수 있습니다.
그러나 이 동작은 궁금증 해결을 위해 보여드린 것일 뿐 이렇게 버전이 처리되는 것은 권장하지 않습니다. 특정 버전에 의존한 개발 환경에서는 언젠가 반드시 문제가 발생하게 되어있습니다.
따라서 결론은 BOM 에서 관리되지 않는 라이브러리인 경우 반드시 버전을 명시적으로 지정해서 사용해야 안전하게 어플리케이션을 운영할 수 있습니다.


Q2) BOM 에서 관리되는 라이브러리의 버전을 무시하고 내가 임의로 특정 버전을 적용하면 어떻게 될까?

Spring Boot BOM에서 관리되는 라이브러리를 직접 특정 버전을 지정하여 추가하면, Spring Boot BOM의 기본 버전 대신 명시적으로 지정한 버전이 우선 적용됩니다. 즉, 두 버전이 공존하지 않으며, 프로젝트에는 명시적으로 지정한 버전만 사용됩니다.

dependencies {
    // Spring Boot BOM 사용
    implementation platform("org.springframework.boot:spring-boot-dependencies:3.4.1")

    // Spring Boot BOM에 의해 관리되는 Jackson 라이브러리
    implementation "com.fasterxml.jackson.core:jackson-databind"

    // 특정 버전을 명시
    implementation "com.fasterxml.jackson.core:jackson-databind:2.14.1" // BOM보다 우선 적용됨
}

참고

Spring Boot 3.4.1 BOM 파일 - GitHub
https://github.com/spring-projects/spring-boot/blob/v3.4.1/spring-boot-project/spring-boot-dependencies/build.gradle

maven central repository
https://github.com/spring-projects/spring-boot/blob/v3.4.1/spring-boot-project/spring-boot-dependencies/build.gradle

profile
브런치 즐기는 여유있는 날

0개의 댓글

관련 채용 정보