[스프링 부트 개념과 활용] 의존성 관리 (dependency management)
인프런에서 백기선님의 스프링 부트 개념과 활용을 수강하고 개인적으로 공부한 내용을 정리한 글입니다.
의존성 관리
처음 프로젝트를 생성하고 pom.xml에서 설정을 할 때 아래와 같은 의존성을 추가했었다.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<!-- Add typical dependencies for a web application -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
spring-boot-starter에서 제공하는 라이브러리들의 버전을 따로 명시하지 않았는데도 적절한 버전을 가져오고 있다. 이건 스프링 부트에서 제공하는 의존성 관리 기능 덕분이다.
parent인 spring-boot-starter-parent.pom
에 들어가보면 parent가 또 들어있다. 한번 더 위로 올라가보자.
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
spring-boot-dependencies.pom
에 들어가보면 이런식으로 버전들이 관리되고 있다.
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
...
상위에 정의되어 있는 의존성 중 하나라도 사용하게 되면, 직접 버전을 명시하지 않아도 spring-boot-dependencies
가 관리하는 버전을 사용할 수 있다. parent에 정의된 것과 다른 특정 버전을 사용하고 싶을 때만 명시하면 된다.
이렇게 계층구조를 통한 의존성 관리엔 개발자가 직접 관리해야하는 의존성 수가 줄어든다는 장점이 있다.
Parent POM을 사용하고 싶지 않다면
spring-boot-starter-parent를 사용하지 않더라도, import
scoped dependency를 사용하면 의존성 관리의 장점을 그대로 누릴 수 있다. <dependencyManagement>
에서 import를 사용하면 artifactId에 딸려오는 의존성을 포함해 모든 의존성의 버전을 고정할 수 있다.
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
예를들어 위와 같이 작성된 설정은 spring-boot-dependencies와 거기에 딸려오는 모든 의존성들의 버전이 기존에 설정된 버전을 무시하고 2.3.1.RELEASE으로 고정된다.
단 spring-boot-dependencies.pom
에는 의존성 외에도 자바 버전, 인코딩 설정 등을 비롯해 스프링 부트에 최적화된 각종 설정이 정의되어 있기 때문에, 가급적 parent
를 사용하는 것을 추천한다.
의존성 관리 응용
의존성을 추가하는 방법
사용가능한 의존성을 찾고 싶을 땐 https://mvnrepository.com/에서 검색하면 된다.
Maven 탭에서 dependency를 추가하기 위한 정보가 담긴 스크립트가 나오는데, 복사해서 pom.xml에 붙여넣어보자.
왼쪽에 아이콘이 뜨는지의 여부로 version을 관리하지 않는 dependency라는 것을 알 수 있다. 이 경우 어떤 버전을 쓰게될지 알 수 없기 때문에 직접 명시해주는 것이 좋다.
Spring 버전 변경해보기
spring-boot-dependencies.pom의 <properties></properties>
안에는 모든 의존성의 버전을 일괄적으로 관리하고 있다. 이 파일에서 spring.version을 찾아보면 버전이 5.0.7.RELEASE로 되어있다.
pom.xml에 <properties></properties>를 직접 추가해서 스프링 버전을 5.0.6으로 내려보자.
우측 창을 보면 프로젝트에서 사용하는 스프링 버전이 5.0.6으로 바뀐 것을 확인할 수 있다. 그 외에도 바꾸고 싶은 버전이 있다면 properties 태그 안에 작성해주면 된다.
References
'if (study) > Spring' 카테고리의 다른 글
[스프링 부트 개념과 활용] 자동 설정 (Auto Configuration) (0) | 2020.07.20 |
---|---|
[스프링 부트 개념과 활용] 스프링 부트 시작하기 (0) | 2020.07.20 |
[예제로 배우는 스프링 입문] Spring IoC, AOP, PSA (0) | 2020.07.20 |