인프런에서 백기선님의 스프링 부트 개념과 활용을 수강하고 개인적으로 공부한 내용을 정리한 글입니다.

의존성 관리

처음 프로젝트를 생성하고 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에 정의된 것과 다른 특정 버전을 사용하고 싶을 때만 명시하면 된다.

IDE 좌측에 저런 기호가 뜬다면 parent에서 버전을 관리해주는 dependency다

이렇게 계층구조를 통한 의존성 관리엔 개발자가 직접 관리해야하는 의존성 수가 줄어든다는 장점이 있다.

 

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