본문 바로가기
Develop/Java, Spring

Spring BOM과 플랫폼 설계 (자매품 : Starter)

by 찹키리 2026. 3. 25.

☑️ BOM (Bill Of Materials)

Each release of Spring Boot provides a curated list of dependencies that it supports. In practice, you do not need to provide a version for any of these dependencies in your build configuration, as Spring Boot manages that for you. When you upgrade Spring Boot itself, these dependencies are upgraded as well in a consistent way.

The curated list contains all the Spring modules that you can use with Spring Boot as well as a refined list of third party libraries. The list is available as a standard Bills of Materials (spring-boot-dependencies) that can be used with both Maven and Gradle.

출처 (https://docs.spring.io/spring-boot/reference/)

 

BOM이란 직역하면 재료들의 명세표라는 뜻으로, Spring에서는 특정 라이브러리들의 버전 집합을 관리하는 메타 정보를 의미한다. BOM을 사용하면 개별 dependency에 버전을 직접 명시하지 않고 BOM에서 관리하는 버전을 자동으로 적용할 수 있어 라이브러리 간 버전 충돌 및 호환성 이슈를 방지할 수 있다.

 

Spring 공식 문서에서도 BOM을 사용한 의존성 관리 방안을 제공하고 있으며, BOM을 사용하더라도 개발자는 필요한 경우 라이브러리의 버전을 개별적으로 오버라이드해 사용할 수도 있다.

 

[EX. Maven]

<project>
    <!-- BOM Import -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>3.5.6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- Dependencies Import (버전을 직접 쓰지 않음) -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>
    </dependencies>
</project>

 

 

[EX. Gradle]

dependencies {
    // BOM Import
    implementation platform('org.springframework.boot:spring-boot-dependencies:3.5.6')

    // Dependencies Import (버전을 직접 쓰지 않음)
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'org.postgresql:postgresql'
}

 

💡 Gradle Spring Boot Plugin
  Gradle의 경우 Spring Dependency Management 플러그인이 있어 편리하게 사용할 수 있다.
  참고 (https://docs.spring.io/spring-boot/gradle-plugin/)
plugins {
    id 'java'
    id 'org.springframework.boot' version '3.5.6'
    id 'io.spring.dependency-management' version '1.1.7'
}

repositories {
    mavenCentral()
}

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

 


✔️ 사용 이유

1️⃣ 버전 정합성

  • Spring Boot 프로젝트에서는 엄청나게 많은 라이브러리들이 서로 얽혀있음
  • 특히 Spring Boot Starter의 경우 하나의 스타터 안에는 수많은 또 다른 스타터와 라이브러리들이 포함되어 딸려옴 (transitive dependencies)
  • 의존성 전이 등으로 중복되는 라이브러리 간의 버전 충돌, 호환성 이슈 등을 방지하기 위해 검증된 의존성 버전과 조합을 중앙에서 관리

[EX. spring-boot-starter-web 의존성의 내부 구조 (매우 많은 의존성을 갖고 있음)]

 

[EX. spring-boot-starter-web 안의 spring-boot-starter 의존성의 내부 구조]

 

 

2️⃣ 멀티 모듈

  • BOM은 멀티 모듈 아키텍처에서는 거의 필수적인 요소
  • 각 모듈이 서로를 참조하거나, 동일한 라이브러리를 참조하는 일이 빈번하기 때문에 전체 빌드 혹은 어플리케이션 실행 시점에 의존성이 얽히는 문제를 방지하기 위해 멀티 모듈 전체의 버전 기준표로서의 역할
💡 멀티 모듈
  하나의 root 프로젝트 하위에 다수의 독립적인 모듈로 구성된 프로젝트 구조
  MSA와 비교하자면, MSA는 아키텍처 설계의 관점에서 서비스를 분리하는 개념이고,
  멀티 모듈의 경우 하나의 프로젝트를 구성하는 코드 구조 설계 방안

 

[EX. 멀티 모듈 구조 예시]

 


✔️ BOM + Starter 구조

위에서 BOM+멀티 모듈의 조합에 대해 언급했는데, 멀티 모듈 구조의 Starter + BOM 구조의 의미는 독립된 모듈의 집합과 중앙 관리/통제 플랫폼이라고 정리하면 될 것 같다. 플랫폼이라는 용어가 모호하긴 한데 우선은 개발을 위한 표준화된 기반 정도로 이해하고 사용중이다.

  • BOM : 의존성의 버전과 호환성을 관리하는 기준 (Build/Dependency)
  • Starter : 실제 기능 구성을 제공하는 모듈 (Runtime)