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
'스프링' 카테고리의 다른 글
스프링 세션 (Spring Session)이란? spring-session-jdbc 사용하기 (0) | 2021.11.26 |
---|---|
[Spring] 스프링에서 AOP를 구현하는 방법 (0) | 2021.11.10 |
[Spring Boot] 스프링 부트 그레이들 플러그인(Gradle Plugin) (0) | 2021.09.03 |
[F-lab] 4주차 정리_자바 (0) | 2021.09.03 |
HttpServletRequest 요청 파라미터(parameter) 정보 받아오기 (0) | 2021.05.06 |
댓글