본문 바로가기
스프링

스프링에서 버전을 일관성있게 다루는 방법: BOM

by 책 읽는 개발자_테드 2021. 10. 26.
반응형

Maven POM

· Maven에서 종속성을 가져오고 프로젝트를 빌드하는 데 사용하는 정보 및 설정을 포함하는 XML 파일

 

Maven BOM

· Bill Of Materials(자재 명세서)의 약자

· 프로젝트 종속성의 버전을 제어하고, 해당 버전을 정의하며, 업데이트하는 중앙 위치를 제공하는 데 사용되는 특별한 종류의 POM

   - BOM은 의존해야 하는 버전에 대한 걱정없이, 모듈에 의존성을 추가할 수 있는 유연성을 제공함

 

Transitive Dependencies(전이 의존성)

Maven은 pom.xml에서 자체 의존성에 필요한 라이브러리를 발견하고, 자동으로 포함할 수 있다. 또한 라이브러리가 수집되는 의존성 수준의 개수는 제한이 없다.

 

이때, 2개의 의존성이 특정 아티팩트의 다른 버전을 참조할 때 충돌이 발생한다. 여기서 메이븐은 사용된 버전의 종속성 트리에서 해당 프로젝트에 가장 가까운 버전을 포함한다. 이것을 의존성 관리(Dependency Management)라고 한다.

 

Dependency Management(의존성 관리)

· 간단히 말해서 의존성 관리는 의존성 정보를 중앙 집중화하는 메커니즘이다.

· 공통 부모를 상성하는 프로젝트 세트가 있는 경우 모든 의존성 정보를 BOM이라는 공유 POM 파일에 넣을 수 있다.

 

▶ 예시 - BOM 파일 작성

<project ...>
	
    <modelVersion>4.0.0</modelVersion>
    <groupId>baeldung</groupId>
    <artifactId>Baeldung-BOM</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>BaelDung-BOM</name>
    <description>parent pom</description>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>test</groupId>
                <artifactId>a</artifactId>
                <version>1.2</version>
            </dependency>
            <dependency>
                <groupId>test</groupId>
                <artifactId>b</artifactId>
                <version>1.0</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>test</groupId>
                <artifactId>c</artifactId>
                <version>1.0</version>
                <scope>compile</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

· BOM은 모든 아티팩트 정보와 버전을 포함할 수 있는 의존성 관리 섹션이 있는 일반 POM 파일이다.

· 위의 프로젝트 Test는 Baeldung-BOM을 상속한다.

· BOM은 import가 가능하다.

   - 프로젝트는 단일 부모만 상속할 수 있으므로,

      큰 프로젝트에서는 상속 방식보다 필요한 만큼 BOM을 import 하는 것이 대안이 될 수 있다. 

 

TODO: Overwriting BOM Dependency

 

Spring BOM

서드파티 라이브러리 또는 다른 Spring 프로젝트가 이전 릴리즈에 대한 전이 의존성을 가져오는 것을 발견할 수 있다. 이때, 직접 의존성을 명시적으로 선언하는 것을 잊어버리면 문제가 발생할 수 있다.

 

이러한 문제를 해결하기 위해 Maven은 BOM 의존성 개념을 지원한다. Spring 의존성이 동일한 버전인지 확인하기 위해 의존성 관리 섹션에 spring-framework-bom을 가져올 수 있다.

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>4.3.8.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

 

이렇게 하면 아래와 같이 Spring 아티팩트를 사용할 때 버전 속성을 지정할 필요가 없다.

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
    </dependency>
<dependencies>

 

출처

https://www.baeldung.com/spring-maven-bom

 

반응형

댓글