**스프링부트**는 기본적으로 사용되는 의존성들과 각 의존성의 버전을 미리 구성해준다. 이로써 개발자는 어떤 의존성을 사용할지 또는 각 의존성간 어떤 버전이 호환성이 좋은지 걱정할 필요없이 즉시 작업을 시작할 수 있게 된다. 그런데 때로는 특정 의존성의 버전을 변경하고 싶을 수도 있다. 그래서 **스프링부트**에서는 손쉽게 의존성 버전을 사용자가 변경할 수 있는 방법을 제공하고 있다.
# 스프링부트 의존성 버전 사용자 정의
의존성 버전을 변경하는 방법을 살펴보기 전에 **스프링부트**에서 어떻게 미리 각 의존성 버전을 설정해주고 또 어디에서 어떻게 관리되고 있는지 간단히 확인해보자.
지난 포스팅 [스프링부트 사용하세요. - 스프링프레임워크 개발환경 자동화 도구](http://eglowc.tistory.com/37)에서 `Maven`을 이용한 **스프링부트** 설치방법을 설명하면서 다음과 같은 `pom.xml`을 구성했었다.
```xml:line-numbers
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.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>
<!-- Package as an executable jar -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
```
>`Maven`에서 **스프링부트**를 설치하기 위해 작성한 `pom.xml`.
여기서 `line:2-6`을 살펴보면 `<parent>`를 이용해 `spring-boot-starter-parent`를 상속하고 있음을 확인할 수 있다. 사실 `spring-boot-starter-parent`를 상속하는게 필수는 아니다. 개인의 선택에 따라 상속하지 않고 직접 필요한 의존성들을 추가하고 관리할 수도 있다. [Using Spring Boot without the parent POM](http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#using-boot-maven-without-a-parent)에서 `spring-boot-starter-parent`없이 사용하는 방법을 확인할 수 있다.
#
만약 `spring-boot-starter-parent`를 사용하지 않는다면 **스프링부트**의 의존성 관리를 지원받지 못하게 된다.(직접 `spring-boot-dependencies`를 import하면 쓸 수 있음) 반드시 그래야 하는 상황이 아니라면 `spring-boot-start-parent`를 사용하는편이 더 편리할 것이다. 간단히 `spring-boot-starter-parent`에 대해서 알아보자.
## spring-boot-starter-parent
`Maven`프로젝트를 기준으로 설명하고 있으며, `spring-boot-starter-parent`를 상속하는 경우 기본적인 특징들이 적용된다.
**특징 :**
- 기본 컴파일 레벨을 Java 1.6 으로 지정
- UTF-8 소스 인코딩
- `spring-boot-starter-dependencies`를 상속하여 `<version>`태그를 생략하고 의존성을 관리
- [resource filtering](https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html)
- [exec plugin](http://www.mojohaus.org/exec-maven-plugin/), [surefire](http://maven.apache.org/surefire/maven-surefire-plugin/), [Git commit ID](https://github.com/ktoso/maven-git-commit-id-plugin), [shade](http://maven.apache.org/plugins/maven-shade-plugin/)
> [13.2 Maven - using-boot-maven](http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#using-boot-maven) 참고
위에 나열한 여러가지 특징들과 편의성을 얻게 되는데 현재 포스팅에서 다루는 내용과 긴밀한 특징은 `spring-boot-start-dependencies`의 상속을 포함하게 된다는 것이므로 이것에 대해서만 다룬다. [spring-boot-dependencies/pom.xml](https://github.com/spring-projects/spring-boot/blob/v1.4.1.RELEASE/spring-boot-dependencies/pom.xml)을 살펴보면 **스프링부트**에서 사용하는 각 의존성 버전들이 어떻게 관리되고 있는지 확인할 수 있다. 그 중 의존성 버전을 정의하고 있는 내용을 일부분만 살펴보자.
## spring-boot-dependencies 의 pom.xml
`pom.xml`에서 `<properties>`의 일부분을 살펴보자.
```xml:line-numbers
<properties>
...
<h2.version>1.4.192</h2.version>
<gson.version>2.7</gson.version>
<slf4j.version>1.7.21</slf4j.version>
<spring.version>4.3.3.RELEASE</spring.version>
<tomcat.version>8.5.5</tomcat.version>
...
</properties>
```
> 직접 [spring-boot-dependencies/pom.xml](https://github.com/spring-projects/spring-boot/blob/v1.4.1.RELEASE/spring-boot-dependencies/pom.xml)을 살펴보면 더 많은 내용을 확인할 수 있다. 그 중 몇가지만 추려서 작성된 것임을 참고.
`spring-boot-dependencies` 의 `pom.xml`을 살펴보니 `<properties>`에서 많은 의존성들의 버전을 명시해두고 있다. 익숙한 것들이 많이 보인다. 기본적으로 **스프링부트**는 이곳에 명시된 의존성 버전들을 참조해서 사용한다.(물론 직접적이던 간적적이던 `spring-boot-dependencies`의존성을 사용할 때에만) 이제 본격적으로 의존성 버전을 사용자화 하는 방법을 알아보자.
# 의존성 버전 사용자화 방법
`spring-boot-dependencies`의존성이 추가되었다는 가정하에 `Maven`환경에서 작성된 프로젝트를 기준으로 설명하도록 한다.
#
1. 프로젝트의 `pom.xml` 파일을 연다.
2. `<properties>`엘리먼트를 추가하고 원하는 의존성에 해당하는 버전정보를 명시한다.
```xml:line-numbers
<properties>
<slf4j.version>1.7.5</slf4j.version>
</properties>
```
> **스프링부트 1.4.1**의 `slf4j`의존성의 기본 버전은 **1.7.2**이지만 앞에서처럼 프로젝트의 `pom.xml`파일에 새로운 버전을 명시하면 **스프링부트**는 해당 버전을 참조하여 의존성을 관리하게 된다.
앞에서 주저리주저리 길게 설명한 내용들에 비해 실제 작업은 굉장히 단순하고 쉽다. **스프링부트**의 의존성 버전 참조 우선순위에 의해 사용자 프로젝트내 `pom.xml`에 명시된 버전 정보가 우선순위가 높으므로 **스프링부트**는 사용자가 원하는 의존성 버전을 사용하게 된다. 그럼 잘 변경 되었는지 확인해보자.
## 변경된 의존성 버전 확인
아마도 대부분 `IDE`를 사용할텐데 그런 경우라면 `Maven`에 의해 추가된 외부 의존성의 정보를 쉽게 도구로써 확인할 수 있을테니 설명을 생략한다. 만약 찾기 어렵거나 `IDE`를 사용하지 않는다면 `Maven`을 이용해 확인할 수도 있다.
```cmd:line-numbers
$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building eglowc-posting 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.10:tree (default-cli) @ eglowc-posting ---
[INFO] com.eglowc:eglowc-posting:jar:1.0-SNAPSHOT
[INFO] \- org.springframework.boot:spring-boot-starter-web:jar:1.4.1.RELEASE:compile
[INFO] +- org.springframework.boot:spring-boot-starter:jar:1.4.1.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot:jar:1.4.1.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-autoconfigure:jar:1.4.1.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter-logging:jar:1.4.1.RELEASE:compile
[INFO] | | +- ch.qos.logback:logback-classic:jar:1.1.7:compile
[INFO] | | | +- ch.qos.logback:logback-core:jar:1.1.7:compile
[INFO] | | | \- org.slf4j:slf4j-api:jar:1.7.5:compile
[INFO] | | +- org.slf4j:jcl-over-slf4j:jar:1.7.5:compile
[INFO] | | +- org.slf4j:jul-to-slf4j:jar:1.7.5:compile
[INFO] | | \- org.slf4j:log4j-over-slf4j:jar:1.7.5:compile
[INFO] | +- org.springframework:spring-core:jar:4.3.3.RELEASE:compile
[INFO] | \- org.yaml:snakeyaml:jar:1.17:runtime
[INFO] +- org.springframework.boot:spring-boot-starter-tomcat:jar:1.4.1.RELEASE:compile
[INFO] | +- org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.5:compile
[INFO] | +- org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.5:compile
[INFO] | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:8.5.5:compile
[INFO] +- org.hibernate:hibernate-validator:jar:5.2.4.Final:compile
[INFO] | +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] | +- org.jboss.logging:jboss-logging:jar:3.3.0.Final:compile
[INFO] | \- com.fasterxml:classmate:jar:1.3.1:compile
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.8.3:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.8.3:compile
[INFO] | \- com.fasterxml.jackson.core:jackson-core:jar:2.8.3:compile
[INFO] +- org.springframework:spring-web:jar:4.3.3.RELEASE:compile
[INFO] | +- org.springframework:spring-aop:jar:4.3.3.RELEASE:compile
[INFO] | +- org.springframework:spring-beans:jar:4.3.3.RELEASE:compile
[INFO] | \- org.springframework:spring-context:jar:4.3.3.RELEASE:compile
[INFO] \- org.springframework:spring-webmvc:jar:4.3.3.RELEASE:compile
[INFO] \- org.springframework:spring-expression:jar:4.3.3.RELEASE:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.179 s
[INFO] Finished at: 2016-09-22T15:19:13+09:00
[INFO] Final Memory: 20M/226M
[INFO] ------------------------------------------------------------------------
```
> `mvn dependency:tree`명령어로 현재 의존성 정보를 트리 형태로 출력한다.
출력된 정보중 `line:18`부터 살펴보면 `slf4j`의 의존성 버전이 `1.7.5`로 되어 있음을 확인할 수 있다.
이상으로 **스프링부트**에서 공통 의존성의 버전 사용자화 방법에 대한 설명을 마치도록 한다. 이처럼 **스프링부트**는 많은 것들을 자동화하고 공통된 설정과 기능들을 제공하면서도 손쉽게 사용자의 필요에따라 구성과 설정을 변경할 수 있도록 배려하고 있다는 사실을 알게되었다.