가끔 Spring Boot
기반이 아닌 프로젝트를 구성해야 되는 경우가 있습니다.
Spring boot
의 경우에는 여러 dependency
버전들을 알아서 관리해주지만,
Spring boot
가 아닌 프로젝트에서는 버전 호환성을 개발자가 직접 결정하고,
호환성에 문제가 생길지 모르는 상황에서 안절부절하면서 개발을 해야 됩니다 😱😱
이때 사용하면 좋은 게 바로 Maven 의 BOM 입니다.
BOM
은 그냥 쉽게 말해서 pom.xml
에 기재하는 다양한 dependency
에
대한 버전 정보를 모두 들고 있는 파일이라고 생각하면 됩니다.
이러한 BOM
을 import
함으로써 저희는 pom.xml
에 어떤
dependency
를 사용할지만 지정해주면 BOM
에 작성된 버전 정보들이
자동으로 dependency
에 적용됩니다.
이해를 위해서 아주 간단한 예시를 작성합니다.
<!-- BOM import 예시 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.dailycode</groupId>
<artifactId>my-custom-bom</artifactId>
<version>1.2.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- dependency 작성 예시 -->
<dependencies>
<dependency>
<!-- 1. 어떤 라이브러리를 쓸지만 지정! -->
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<!-- 2. 버전 정보는 생략 -->
<!--<version>5.2.4</version>-->
</dependency>
</dependencies>
그렇다면 spring framework 프로젝트를 작성할 때는 어떤 BOM 을
사용하는 게 좋을까요?
저는 크게 2가지 종류의 BOM 을 추천합니다.
spring-boot-dependencies
spring-framework-bom
첫번째 bom 은 spring boot 에서 사용하는 dependencies version 을
모~두 담은 bom 입니다. spring boot 개발자 분들께서 버전에 대한 호환성을
잘 관리해주니 믿고 사용하셔도 됩니다.
게다가 spring boot 와 같이 연계해서 사용되는 여러 라이브러리 (ex: jackson)들에
대한 버전도 모두 갖고 있기 때문에 상당히 유용하죠.
2번째 bom 은 오로지 spring-framework 의 dependencies version 만
가지고 있는 겁니다. spring 과 관련된 작업만 compact 하게 하고 싶으면
이 bom 이 딱 좋겠죠?
자~ 이제 어느정도 감이 잡혔으니 이것들을 어떻게 사용할 수 있는지
그 방법을 알아봅시다.
spring-boot-dependencies
는 사실 적용할 수 있는 방법이 2가지 있습니다.
하나는 spring-boot-starter-parent
을 통한 우회적 적용법이고,
다른 하나는 spring-boot-dependencies
를 사용하는 직접 적용법입니다.
2방법 모두 결과적으로는 spring-boot-dependencies
bom 을 사용하니,
편하게 고르시면 됩니다...만!
spring-boot-dependencies
을 직접 적용할 때는 본인이
java.version
뿐만 아니라 maven.compiler.*
, Encoding
관련
properties 를 직접 설정해줘야 합니다.
아래에 작성한 자세한 세팅을 보면 무슨 말인지 이해가 되실겁니다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--
BOM 추가. BOM을 직접 import 하는 방식과는 다르지만,
결과적으로는 spring-boot 가 사용하는 dependency version 정보를 담는
BOM 을 IMPORT 하는 것과 동일한 효과를 줍니다.
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.14</version>
<relativePath/>
</parent>
<!--
인코딩(=UTF-8), maven 컴파일러 버전은
spring-boot-starter-parent 통해서 자동으로 세팅됩니다.
maven 컴파일러 버전은 java.version 을 따릅니다.
-->
<properties>
<java.version>11</java.version>
</properties>
<!-- dependency 를 추가할 때는 version 기입을 안해도 됩니다! -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!--
java.version 뿐만 아니라,
maven.compiler, Encoding 설정도 해줘야 합니다
-->
<properties>
<java.version>21</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<!-- BOM 적용! -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.1.6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--
springboot starter parent 와는 달리 아래처럼
properties 설정을 더 세부적으로 해줘야합니다.
springboot starter parent 는 자동으로 아래와 같은
properties 를 세팅해줍니다.
-->
<properties>
<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<!-- BOM 추가 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>5.3.27</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- dependency 를 추가할 때는 version 기입을 안해도 됩니다! -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
</project>