Rooted In Develop

Spring Boot 원리 : 의존성(Dependency) 관리 본문

Back End/Spring Boot

Spring Boot 원리 : 의존성(Dependency) 관리

RootedIn 2019. 9. 2. 22:57

이 글은 인프런의 백기선님의 강좌를 수강하며 정리한 글입니다.

 

1. 서론

 

예전 Spring Legacy Project의 경우 스프링 프레임워크의 버전업이든지, 써드파티의 버전업이든지 서로간의 의존성 충돌이 일어나기 시작하면 해결하는데 시간이 꽤 걸린다.

 

어떻게 해서 Spring Boot(이하 스프링 부트)는 어떻게 버전 명시 없이 의존성이 주입되는 것일까?

 

우선 스프링 부트 프로젝트의 pom.xml을 살펴봅시다.

 

2. Parent : Dependency Management + Resource Filtering + Plugin Configuration

 

pom.xml(Maven)

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
</parent>

간단하게도, 이 parent에 의해서 스프링 부트의 의존성이 주입되게 된다.

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

dependency에 버전을 명시하지 않았는데도 아래와 같이 의존성이 주입된다.

Maven Dependencies

 

3. DependencyManagement : Dependency ManageMent

 

Maven에서는 parent 대신 dependencymanagement도 사용할 수 있다.

 

이 방법은 Parent와 같이 의존성 관리는 가능하지만, 리소스 필터링이나 플러그인 설정은 불가하다.

 

따라서 Parent를 사용하는 방법으로 스프링 부트 프로젝트를 진행하면 되겠다.

 

4. 특정 버전 명시

 

위 프로젝트에 Spring Boot Starter Data Redis 의존성을 버전을 명시하여 추가해보았다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.1.7.RELEASE</version>
</dependency>

해당 버전은 프로젝트의 Spring Boot 버전과 맞지 않는 버전이므로

"Duplicating managed version 2.1.7.RELEASE for spring-boot-starter-data-redis" 라는 경고가 뜨게 된다.

꼭 해당 버전을 사용하고자 하면 경고를 무시하고 진행하면 되겠지만 컴파일이 안되는 경우는 해당 버전이 문제이므로 버전을 명시하지 않고 스프링 부트가 주입해주는 의존성으로 프로젝트를 진행하면 되겠다.

Comments