[Spring] Dependency 버전 호환성이 걱정 될 때는 ? Maven BOM !

식빵·2023년 12월 4일
0

Spring Lab

목록 보기
26/33
post-thumbnail

1. Spring Boot 가 아닌 환경에서 라이브러리 버전 호환성

가끔 Spring Boot 기반이 아닌 프로젝트를 구성해야 되는 경우가 있습니다.
Spring boot 의 경우에는 여러 dependency 버전들을 알아서 관리해주지만,
Spring boot 가 아닌 프로젝트에서는 버전 호환성을 개발자가 직접 결정하고,
호환성에 문제가 생길지 모르는 상황에서 안절부절하면서 개발을 해야 됩니다 😱😱



2. 그래서 Maven BOM 이 필요합니다.

이때 사용하면 좋은 게 바로 Maven 의 BOM 입니다.

BOM 은 그냥 쉽게 말해서 pom.xml 에 기재하는 다양한 dependency
대한 버전 정보를 모두 들고 있는 파일이라고 생각하면 됩니다.

이러한 BOMimport 함으로써 저희는 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가지

그렇다면 spring framework 프로젝트를 작성할 때는 어떤 BOM 을
사용하는 게 좋을까요?

저는 크게 2가지 종류의 BOM 을 추천합니다.

  1. spring-boot-dependencies
  2. spring-framework-bom

첫번째 bom 은 spring boot 에서 사용하는 dependencies version 을
모~두 담은 bom 입니다. spring boot 개발자 분들께서 버전에 대한 호환성을
잘 관리해주니 믿고 사용하셔도 됩니다.
게다가 spring boot 와 같이 연계해서 사용되는 여러 라이브러리 (ex: jackson)들에
대한 버전도 모두 갖고 있기 때문에 상당히 유용하죠.

2번째 bom 은 오로지 spring-framework 의 dependencies version 만
가지고 있는 겁니다. spring 과 관련된 작업만 compact 하게 하고 싶으면
이 bom 이 딱 좋겠죠?


자~ 이제 어느정도 감이 잡혔으니 이것들을 어떻게 사용할 수 있는지
그 방법을 알아봅시다.



3. spring-boot-dependencies 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 를 직접 설정해줘야 합니다.

아래에 작성한 자세한 세팅을 보면 무슨 말인지 이해가 되실겁니다.


3-1. springboot starter parent

<?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>

3-2. spring-boot-dependencies

<?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>




4. spring-framework-bom

<?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>



참고 링크

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글