Maven 종속성을 관리하는 방법(pom.xml 관리법)

겔로그·2022년 11월 25일
0

Spring Boot

목록 보기
11/21

개발간 pom.xml에 import한 의존성의 버전 차이로 인해 호환성 문제를 겪어보신 분들이 있을 겁니다. 오늘은 이러한 문제가 발생하지 않도록 방지하는 방법에 대해 설명해보고자 합니다.

Issue

기본적으로 maven을 통해 프로젝트를 진행하시는 개발자 분들은 pom.xml에 dependency를 적용할 경우 다음과 같이 버전을 명시하여 사용할 수 있습니다.

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.18.24</version>
</dependency>

Maven 또한 dependency를 다음과 같이 import하라고 버전별로 다음과 같이 제공하고 있습니다.
참고: https://mvnrepository.com/artifact/org.projectlombok/lombok/1.18.24

여기까지 보았을 때 두 가지 의문이 생겼습니다.

  1. 버전을 명시하지 않을 경우 어떻게 될까?
  2. 버전별 상호 호환이 안될 경우엔 어떻게 될까?

1. 버전을 명시하지 않을 경우 어떻게 될까?

spring boot는 버전별로 자체적으로 종속성에 대한 세부 정보를 제공하고 있습니다.
참고: https://docs.spring.io/spring-boot/docs/current/reference/html/dependency-versions.html

다음 리스트에 사용하고 싶은 dependency가 없을 경우, 버전 명시는 필수적이며 포함되어 있을 경우 spring boot에서 가지고 있는 버전으로 import된다고 생각하면 좋을 것 같습니다.

2. 버전별 상호 호환이 안될 경우엔 어떻게 될까?

버전별로 상호 호환이 안될경우 다음과 같은 문제가 발생할 수 있습니다.
1. 컴파일시 에러 발생
2. 런타임시 에러 발생

1번 같은 경우 개발 상황에서 실행 전 확인이 가능하나, 2번은 관련 기능을 직접적으로 실행하지 않는 이상 확인이 어렵다는 문제점이 존재합니다.

최대한 dependency를 사용/최신화 하기 이전에 아래 사진과 같이 dependency import시 포함되는 라이브러리를 확인하시고 어떤 버전과 충돌이 날 수 있는지 고려 후 적용하는 것을 추천드립니다.

해결 방법

1. spring-boot-starter-parent

spring boot starter에서는 parent 기능을 제공하고 있습니다.

해당 기능을 통해 개발자들은 spring boot에서 사용하는 dependency의 호환성 문제를 해결할 수 있습니다.

pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.5</version>
        <relativePath/>
    </parent>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <!-- 버전 명시를 하지 않아도 parent의 버전으로 자동 적용 -->
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
    </dependencies>

2. 변수를 이용한 버전 관리

각 dependency 별로 버전을 명시하는 것이 아닌 변수를 통한 버전 관리를 진행합니다.

    <properties>
        <java-version>1.8</java-version>
        <org.springframework-version>4.3.6.RELEASE</org.springframework-version>
        <org.aspectj-version>1.6.10</org.aspectj-version>
        <org.slf4j-version>1.6.6</org.slf4j-version>
        <jackson.version>2.9.4</jackson.version>
        <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>utf-8</project.reporting.outputEncoding>
    </properties>
	
	<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
      </dependencies>

다음과 같이 버전 관리를 진행할 경우, 유지보수 측면에서 버전 관리를 보다 더 효율적으로 진행할 수 있으며, 버전 최신화시 관련있는 모든 dependency list를 일괄적으로 최신화 할 수 있다는 장점이 존재합니다.

결론

pom.xml에는 프로젝트에서 사용하는 모든 의존성이 존재합니다. 개발 중에는 필요로 하는 라이브러리를 바로바로 추가해 사용하기만 하면 되기 때문에 큰 문제를 느끼지 못하지만 이후 수정, 혹은 유지 보수를 진행할 경우 종속성 관리에 있어 번거로움을 느끼실 수 있습니다.

개발을 진행하면서 부터 종속성 버전 관리를 보다 더 깔끔히 진행하시는 것을 추천드리며 글을 마무리 하겠습니다.

읽어주셔서 감사합니다.

profile
Gelog 나쁜 것만 드려요~

0개의 댓글