─━ IT ━─

"버전 맞추다 날 샌다고?" 😫 의존성 지옥을 구원하는 Maven BOM (Bill of Materials)

DKel 2025. 9. 28. 09:34
반응형

스프링 부트(Spring Boot) 프로젝트를 하다 보면 pom.xml 파일에 수많은 spring-boot-starter-... 의존성(Dependency)을 추가하게 됩니다. 이때 이런 고민 한 번쯤 해보셨을 겁니다. "spring-boot-starter-web이 2.7.5 버전이면, spring-boot-starter-data-jpa도 똑같이 2.7.5로 맞춰야 하나? 다른 Spring 라이브러리들은 چطور؟"

이렇게 서로 연관된 라이브러리들의 호환되는 버전을 일일이 찾아서 맞춰주는 작업은 매우 고통스럽고, 실수하기도 쉽습니다. 이 '의존성 버전 맞추기 지옥'에서 우리를 구원해 줄 메이븐(Maven)의 매우 똑똑하고 우아한 기능이 바로 BOM (Bill of Materials) 입니다.


BOM이란? "이 버전으로 다 통일해!" 선언문

BOM은 직역하면 '자재 명세서' 입니다. 기계를 조립할 때 필요한 모든 부품의 목록과 규격이 적힌 문서와 같죠. 메이븐에서 BOM은 서로 함께 사용될 때 호환성이 검증된 라이브러리들의 버전 목록을 정의해놓은 특별한 pom.xml 파일입니다.

가장 쉬운 비유는 레스토랑의 '세트 메뉴' 입니다. 🍔🍟🥤

  • BOM이 없을 때: 햄버거, 감자튀김, 콜라를 각각 단품으로 주문해야 합니다. 이때 실수로 '어린이용 감자튀김'이나 '제로 슈가 콜라'를 주문하면 세트의 조화가 깨질 수 있습니다.
  • BOM이 있을 때: 그냥 "빅맥 세트 하나요!" 라고만 주문하면, 맥도날드가 가장 잘 어울리는 조합(빅맥 버거, 미디엄 사이즈 감자튀김, 미디엄 사이즈 콜라)을 알아서 챙겨줍니다. 우리는 각 단품 메뉴의 사이즈나 종류를 고민할 필요가 없죠.

BOM이 바로 이 '빅맥 세트' 역할을 합니다. 우리는 그저 "Spring Boot 2.7.5 세트 쓸게!" 라고 선언하기만 하면, 그 세트에 포함된 모든 라이브러리들의 버전은 BOM이 알아서 책임져 주는 것입니다.


직접 사용해보기 (Before vs. After)

pom.xml이 어떻게 깔끔해지는지 직접 확인해 봅시다.

👎 BOM이 없는 경우 (고통의 시작)

XML
 
<dependencies>
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.4</version> </dependency>
  <dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.13.4</version> </dependency>
  <dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-afterburner</artifactId>
    <version>2.13.3</version> </dependency>
  ...
</dependencies>

Jackson 관련 라이브러리를 추가할 때마다, 호환되는 버전을 일일이 찾아서 version 태그에 명시해야 합니다. 매우 번거롭고 실수할 확률이 높습니다.

👍 BOM을 사용하는 경우 (평화)

먼저, 어떤 '세트 메뉴'를 사용할지 <dependencyManagement> 섹션에 선언합니다.

XML
 
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.fasterxml.jackson</groupId>
      <artifactId>jackson-bom</artifactId>
      <version>2.13.4</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

scope를 import로, type을 pom으로 지정하는 것이 핵심입니다.

이제 실제 의존성을 추가할 때는, version 태그를 완전히 생략할 수 있습니다!

XML
 
<dependencies>
  <dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    </dependency>
  <dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    </dependency>
  <dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-afterburner</artifactId>
    </dependency>
  ...
</dependencies>

pom.xml이 훨씬 깔끔해졌고, 버전 관리는 이제 jackson-bom의 버전을 올리는 것만으로 한 번에 처리할 수 있습니다. Spring Boot의 spring-boot-dependencies가 바로 이런 BOM의 대표적인 예시입니다.


마치며

Maven BOM은 복잡한 멀티 모듈 프로젝트나 수십 개의 라이브러리를 사용하는 현대적인 애플리케이션에서, 의존성 버전을 중앙에서 일관성 있게 관리할 수 있도록 돕는 매우 강력하고 실용적인 기능입니다.

더 이상 라이브러리 간의 버전 충돌로 스트레스받지 마세요. 잘 만들어진 '세트 메뉴(BOM)'를 활용하여, 버전 관리는 전문가에게 맡기고 당신은 비즈니스 로직이라는 '메인 요리'에만 집중하세요! 👨‍🍳

반응형