[원리]_01_의존성 관리
의존성 관리 이해
스프링 부트 의존성 관리 - parent
-
스프링 부트는
parent
를 사용하여 의존성을 관리한다.
앞서 의존성을 몇개만 추가하고, 별도로 버전을 지정하지 않았음에도 의존성이 추가가되었다. 스프링부트가 제공하는 Dependency 관리 기능 때문이다.
어떻게 관리가 될까? spring-boot-starter-parent
의 parent
폼을 보자
여기에도 parent
폼이 있다. parent는 spring-boot-dependencies
이 프로젝트가 가장 최상위에 존재하고, 그 하위에 spring-boot-starter-parent
가 있는 것이다.
※ spring-boot-dependencies
- 여러가지 버전들이 적혀있다.
dependencyManagement
가 정의되어 있다. springboot 버전, spring boot test의 버전 등등…- 의존성들이 여기에 정의돼있다.
- 우리가 pom.xml에
dependencyManagement
에 정의되어 있는 dependency를 하나라도 쓰게 되면, 우리가 직접 버전을 명시하지 않아도dependencyManagement
에서 관리하는 버전으로 사용하게 되는 것이다.
계층구조로 쉽게 확인할 수 있다.
장점
-
우리가 직접 관리해야할 의존성의 수가 줄어든다.
-
스프링 버전을 올리거나 third-party 의 버전을 올려야하는 경우, 올리는 버전은 스프링의 어떤 버전과 호환되는지 모른다. 실제 돌려봐서 알아내거나
class not found exception
이 발생하지 않는지… 보고 문제가 생기면 다른 방법을 찾거나, 버전을 낮추거나 하는 일들이 거의 없어졌다. -
이제는 아주 쉽게
starter
위주로 의존성을 추가해주면 된다.
-
-
pom에서 지원하지 않는 의존성을 추가하는 경우에는 버전까지 명시해야 한다.
- 스프링 부트 디팬던시에서 관리하는 의존성들은 굳이 버전을 명시하지 않아도 된다. 특별히 원하는 버전이 있다면 명시해도 된다. 부모에서 상속받는 버전에 오버라이딩된다.
스프링 부트 의존성 관리 - parent 외
우리만의 상속 구조가 있어서 프로젝트에 parent 선언을 못하는 경우 - 방법 2가지
-
<parent>
에 넣어 둔, 우리의 프로젝트의 parent로spring-boot-starter-parent
를 넣어주면 된다.그러면 타고타고와서 의존성 관리를 받을 수 있다.
-
<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
로 기본 설정되어 있다.
리소스에 스프링 부트가 사용하는 properties
와 yaml
파일들(중요★)을 포함시켜주는 등… 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.” 이 기능만 제공해주는 것이다.
의존성 관리 응용
- 의존성 검색
- MVN Repository 에서 의존성 검색
-
의존성 추가 : 버전관리를 해주는 의존성을 추가할 때
-
(예제)
spring data jpa
의존성 추가 -
spring data japa는 스프링 부트에서 starter를 제공해준다.
버전은 따로 명시하지 않음
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
왼쪽에
o
아이콘이 생기는 경우는 버전 명시하지 않아도 된다. 마우스 오버를 하면 몇 버전이 추가되었는지 확인 가능※ 참고 - cmd + 클릭으로 해당 패키지 구현부로 갈 수 있는데, 그 기능이 안되거나 왼쪽 아이콘이 보이지 않는다면, 색인이 잘못된 것이다. [File] > [Invalidate Caches / Restart] 하면 다시 돌아온다.
-
-
의존성 추가 : 버전관리를 해주지 않는 의존성을 추가할 때
-
(예제)
Modelmapper
의존성 추가 -
MVN Repository에서 검색
<dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmapper</artifactId> <version>2.3.8</version> </dependency>
-
Model Mapper ?
도메인 모델(좌)의 필드 값들을 DTO(우) 객체에 코드를 하나하나 적어서 값을 넣어줘야 하는데, Model Mapper를 이용하면 이를 코드 한줄로 쉽게 할 수 있다.
-
o
아이콘이 띄지 않는다. → 스프링 부트가 버전 관리를 해주지 않는다. ⇒ 버전을 명시해줘야 함.(버전을 명시하지 않아도 어떠한 로직으로 정해지는 것 같은데 Best Practice가 아니므로 꼭 버전 명시!!)
-
- 스프링이 관리하는 의존성들도 버전이 보이지 않을 뿐, 명시되어있는 것이다. 특정 버전으로 묶여있는 것이 Best Practice이다.
- 안그러면 어떠한 버전이 들어올지 모르고, 개발할 때와 배포할 때 다른 버전이 들어올 수 있는 문제가 있다.
-
(스프링 부트가 관리하는) 기존 의존성의 버전 변경
- 프로젝트의 properties에 명시해주면 해당 버전으로 오버라이딩된다.
현재 기본 버전이 5.2.8 이다. 이를 일괄적으로 변경하고자 한다면
spring-boot-dependencies
의<properties>
에 각각의 의존성들에 대한 버전들이 일괄적으로 정의되어있다.변경하고자 하는 패키지 속성값 (예시 -
spring-boot.version
)을 복사해서 프로젝트의 properties에 추가해준다.<properties> <spring-boot.version>2.3.1.RELEASE</spring-boot.version> </properties>
-
java 버전을 변경하고 싶다면,
spring-boot-starter-parent
의java.version
을 복사해와서 properties에 추가해주면 된다.<java.version>1.8</java.version>
-
모든 프로퍼티, 플러그인 설정 또한 동일한 방법으로 버전 변경