[원리]_01_의존성 관리

3 minute read

의존성 관리 이해

스프링 부트 의존성 관리 - parent

앞서 의존성을 몇개만 추가하고, 별도로 버전을 지정하지 않았음에도 의존성이 추가가되었다. 스프링부트가 제공하는 Dependency 관리 기능 때문이다.

어떻게 관리가 될까? spring-boot-starter-parentparent 폼을 보자

여기에도 parent폼이 있다. parent는 spring-boot-dependencies이 프로젝트가 가장 최상위에 존재하고, 그 하위에 spring-boot-starter-parent가 있는 것이다.

※ spring-boot-dependencies

  • 여러가지 버전들이 적혀있다.
  • dependencyManagement 가 정의되어 있다. springboot 버전, spring boot test의 버전 등등…
  • 의존성들이 여기에 정의돼있다.
  • 우리가 pom.xml에 dependencyManagement에 정의되어 있는 dependency를 하나라도 쓰게 되면, 우리가 직접 버전을 명시하지 않아도 dependencyManagement에서 관리하는 버전으로 사용하게 되는 것이다.

계층구조로 쉽게 확인할 수 있다.

image-20200824173223744

장점

  • 우리가 직접 관리해야할 의존성의 수가 줄어든다.

    • 스프링 버전을 올리거나 third-party 의 버전을 올려야하는 경우, 올리는 버전은 스프링의 어떤 버전과 호환되는지 모른다. 실제 돌려봐서 알아내거나 class not found exception이 발생하지 않는지… 보고 문제가 생기면 다른 방법을 찾거나, 버전을 낮추거나 하는 일들이 거의 없어졌다.

    • 이제는 아주 쉽게 starter위주로 의존성을 추가해주면 된다.

  • pom에서 지원하지 않는 의존성을 추가하는 경우에는 버전까지 명시해야 한다.

    • 스프링 부트 디팬던시에서 관리하는 의존성들은 굳이 버전을 명시하지 않아도 된다. 특별히 원하는 버전이 있다면 명시해도 된다. 부모에서 상속받는 버전에 오버라이딩된다.

스프링 부트 의존성 관리 - parent 외

우리만의 상속 구조가 있어서 프로젝트에 parent 선언을 못하는 경우 - 방법 2가지

  1. <parent>에 넣어 둔, 우리의 프로젝트의 parent로 spring-boot-starter-parent를 넣어주면 된다.

    그러면 타고타고와서 의존성 관리를 받을 수 있다.

  2. <parent>가 다른 것으로 고정이 되어있어서 바꿀 수 없는 경우, <dependencyManagement> 라는 엘리먼트를 사용하면 된다.

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-gcp-dependencies</artifactId>
                <version>1.1.0.M1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    

    ※ 참고 : dependency management

※ 단점

spring-boot-starter-parent에서는 의존성만 가져오는 것외에 여러 설정들이 있다.

properties에 기본적으로 자바 1.8 버전이 설정되어 있고, 모든 인코딩(outputEncoding)은 UTF-8로 기본 설정되어 있다.

리소스에 스프링 부트가 사용하는 propertiesyaml 파일들(중요★)을 포함시켜주는 등… plugin설정..

스프링 부트에 최적화된 설정들이 추가가 되어있다. 이러한 설정이 하나도 먹히지 않는다는 단점이 있다.

따라서 이 방법보다는 parent 방식을 사용하는 것을 추천한다.

parent로 받아서 사용해야 더 많은 기능을 기본으로 셋팅해준다.

dependency management를 이용하는 것은 “A dependency management section, inherited from the spring-boot-dependencies POM, that manages the versions of common dependencies. This dependency management lets you omit <version> tags for those dependencies when used in your own POM.” 이 기능만 제공해주는 것이다.


의존성 관리 응용

  1. 의존성 검색
  2. 의존성 추가 : 버전관리를 해주는 의존성을 추가할 때

    • (예제) spring data jpa 의존성 추가

    • spring data japa는 스프링 부트에서 starter를 제공해준다.

      버전은 따로 명시하지 않음

      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
      

      왼쪽에 o 아이콘이 생기는 경우는 버전 명시하지 않아도 된다. 마우스 오버를 하면 몇 버전이 추가되었는지 확인 가능

      image-20200824204052077

      ※ 참고 - cmd + 클릭으로 해당 패키지 구현부로 갈 수 있는데, 그 기능이 안되거나 왼쪽 아이콘이 보이지 않는다면, 색인이 잘못된 것이다. [File] > [Invalidate Caches / Restart] 하면 다시 돌아온다.

  3. 의존성 추가 : 버전관리를 해주지 않는 의존성을 추가할 때

    • (예제) Modelmapper 의존성 추가

    • MVN Repository에서 검색

      <dependency>
          <groupId>org.modelmapper</groupId>
          <artifactId>modelmapper</artifactId>
          <version>2.3.8</version>
      </dependency>
      
    • Model Mapper ?

      image-20200824205219600

      도메인 모델(좌)의 필드 값들을 DTO(우) 객체에 코드를 하나하나 적어서 값을 넣어줘야 하는데, Model Mapper를 이용하면 이를 코드 한줄로 쉽게 할 수 있다.

    • o 아이콘이 띄지 않는다. → 스프링 부트가 버전 관리를 해주지 않는다. ⇒ 버전을 명시해줘야 함.

      (버전을 명시하지 않아도 어떠한 로직으로 정해지는 것 같은데 Best Practice가 아니므로 꼭 버전 명시!!)

    image-20200824205920503

  • 스프링이 관리하는 의존성들도 버전이 보이지 않을 뿐, 명시되어있는 것이다. 특정 버전으로 묶여있는 것이 Best Practice이다.
  • 안그러면 어떠한 버전이 들어올지 모르고, 개발할 때와 배포할 때 다른 버전이 들어올 수 있는 문제가 있다.
  1. (스프링 부트가 관리하는) 기존 의존성의 버전 변경

    • 프로젝트의 properties에 명시해주면 해당 버전으로 오버라이딩된다.

    현재 기본 버전이 5.2.8 이다. 이를 일괄적으로 변경하고자 한다면

    image-20200824212051065

    spring-boot-dependencies<properties>에 각각의 의존성들에 대한 버전들이 일괄적으로 정의되어있다.

    image-20200824212303702

    변경하고자 하는 패키지 속성값 (예시 - spring-boot.version)을 복사해서 프로젝트의 properties에 추가해준다.

    <properties>
      <spring-boot.version>2.3.1.RELEASE</spring-boot.version>
    </properties>
    

    image-20200824211943307

  • java 버전을 변경하고 싶다면, spring-boot-starter-parentjava.version을 복사해와서 properties에 추가해주면 된다.

    <java.version>1.8</java.version>
    
  • 모든 프로퍼티, 플러그인 설정 또한 동일한 방법으로 버전 변경