Dependency Mechanism에 대해

Dependency mechanism에 대해

들어가며

  • 하나의 프로젝트의 의존성을 관리하는것은 매우 쉽다.
  • 하지만 여러개의 모듈을 가진 프로젝트에서 의존성을 관리하는 일은 어려운 일이다.
  • 이런 문제를 해결하기 위해 아래와 같은 전략들이 등장하게 된다.

Transitive Dependency란?

  • 의존성을 추가하면 해당 의존성이 가진 의존성도 함께 포함되어서 가져오게 된다.
  • 그렇게 같이 포함되어서 가져오게 된 의존성을 Transitive Dependecy라고 한다.

Dependency mediation이란?

  • 여러가지 의존성을 만나는 경우 어느 의존성을 선택하는지에 대한 전략이라고 볼 수 있다.
  • 아래와 같은 의존성 상황을 만났다고 가정해보자
  A
  ├── B
  │   └── C
  │       └── D 2.0
  └── E
      └── D 1.0
  • Maven은 가장 낮은 Depth의 의존성을 채택하는 전략을 선택하고 있다.
    • 그렇기 때문에 Dependency D는 A -> E로 가져오는 방법은 선택하고 1.0을 가져온다.
  • 1.0 대신 2.0을 가져오고 싶은 경우에는 어떻게 해야 할까?
    • 다음과 같이 명시적으로 선언하는게 가장 좋은 방법이다.
    • 가장 낮은 Depth의 의존성인 2.0을 선택하고 가져온다.
 A
  ├── B
  │   └── C
  │       └── D 2.0
  ├── E
  │   └── D 1.0
  │
  └── D 2.0

Dependency Management이란?

  • 다음과 같은 2개의 pom.xml이 있다고 가정해보자.
  • 부모의 XML
<project>
 <modelVersion>4.0.0</modelVersion>
 <groupId>maven</groupId>
 <artifactId>A</artifactId>
 <packaging>pom</packaging>
 <name>A</name>
 <version>1.0</version>
 <dependencyManagement>
   <dependencies>
     <dependency>
       <groupId>test</groupId>
       <artifactId>c</artifactId>
       <version>1.0</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>test</groupId>
       <artifactId>d</artifactId>
       <version>1.2</version>  <!-- 부모는 1.2 Version -->
     </dependency>
   </dependencies>
 </dependencyManagement>
</project>
  • 부모를 상속받은 자식 XML
<project>
  <parent>
    <artifactId>A</artifactId>
    <groupId>maven</groupId>
    <version>1.0</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>maven</groupId>
  <artifactId>B</artifactId>
  <packaging>pom</packaging>
  <name>B</name>
  <version>1.0</version>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>test</groupId>
        <artifactId>d</artifactId>
        <version>1.0</version> <!-- 부모의 Version 대신 직접 버젼을 명시하는 것을 볼 수 있다 -->
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>test</groupId>
      <artifactId>c</artifactId>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
</project>
  • 부모가 선언한 Dependency D에 대해서 자식은 1.0으로 dependencyManagement를 통해 관리하고 있다.
    • 프로젝트에서 개발자가 직접적으로 버젼을 직접적으로 명시해주는 것이다.

그냥 dependencies에 추가하면 dependency mediation을 통해 해결할 수 있는것이 아닌가?

  • dependencyManagement와 dependencies 차이점이 존재한다.
    • dependencyManagement는 의존성이 추가되었을 때 수행된다.
    • 즉 자식이 의존성을 상속받아 작성하여도 의존성 영향은 없다.
  • dependencies는 자식의 의존성까지 영향을 미치기 때문에 주의해서 사용해야 한다.
    • 상속받는 모든 의존성이 dependencyManagement를 선언해야하는 상황이 오게 된다.

Reference

0%