스프링부트

spring-boot-starter-parent 와 spring-boot-dependencies

알쓸개잡 2023. 8. 15.
Spring Boot는 최소한의 구성 작업으로 프로덕션에 바로 사용할 수 있는 Spring 애플리케이션을 빌드하는 프로세스를 간소화하도록 설계되었다. 이를 위해 Spring Boot 기반 애플리케이션에 대한 기본 구성 및 종속성을 제공하는 특별한 상위 프로젝트인 spring-boot-starter-parent 가 만들어졌다.
spring-boot-starter-parent 에 지정된 종속성을 통해서 기본적으로 제공되는 여러 종속성들을 간편하게 사용할 수 있다.

 

spring-boot-starter-parent 관련 내용은 아래 링크에서 확인해 볼 수 있다.

https://central.sonatype.com/artifact/org.springframework.boot/spring-boot-starter-parent/3.1.2/overview

 

Maven Central: org.springframework.boot:spring-boot-starter-parent:3.1.2

Discover spring-boot-starter-parent in the org.springframework.boot namespace. Explore metadata, contributors, the Maven POM file, and more.

central.sonatype.com

 

spring-boot-starter-parent 종속성

작성 시점 기준 버전은 3.1.2 이다.

Spring Boot 프로젝트를 생성할 때 spring-boot-starter-parent 를 프로젝트의 pom.xml 혹은 build.gradle 의 부모로 사용한다. spring-boot-starter-parent 를 추가한 후 프로젝트는 spring-boot-starter-parent 에 지정된 기본 빌드, 종속성 및 구성을 상속하므로 수동으로 지정할 필요가 없다.

출처:https://howtodoinjava.com/spring-boot2/spring-boot-starter-parent-dependency/

spring-boot-starter-parent의 pom 내용은 아래 링크에서 확인할 수 있다.

https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter-parent/3.1.2/spring-boot-starter-parent-3.1.2.pom

 

spring-boot-starter-parent 의 버전목록은 아래 링크에서 확인할 수 있다.

https://central.sonatype.com/artifact/org.springframework.boot/spring-boot-starter-parent/3.1.2/versions

 

개발 중인 spring boot 프로젝트에 spring-boot-starter-parent는 아래와 같이 지정한다.

maven (pom.xml)

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

 

gradle (build.gradle)

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.1.2'
	id 'io.spring.dependency-management' version '1.1.2'
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

 

spring-boot-starter-parent pom 살펴보기

spring-boot-starter-parent pom 파일의 주요 내용

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>3.1.2</version>
</parent>

spring-boot-dependencies를 상속받고 있다.

 

<properties>
    <java.version>17</java.version>
    <resource.delimiter>@</resource.delimiter>
    <maven.compiler.release>${java.version}</maven.compiler.release>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

프로젝트의 기본 속성을 정의하고 있다.

java 버전은 17을 사용하고 인코딩은 UTF-8을 사용하도록 설정하고 있다.

 

spring-boot-dependencies pom 살펴보기

spring-boot-starter-parent에서는 spring-boot-dependencies를 상속받고 있다. spring-boot-dependencies에서는 spring boot에서 기본적으로 사용하고 있는 dependencies 들을 정의하고 있다.

<properties>
    <activemq.version>5.18.2</activemq.version>
    <classmate.version>1.5.1</classmate.version>
    <commons-codec.version>1.15</commons-codec.version>
    ...
    ...
    ...
</properties>

spring boot 에서 기본적으로 제공하는 dependency 들의 버전을 정의하고 있다. 본 예시에서는 spring boot 3.1.2 버전을 사용하고 있기 때문에 spring boot 3.1.2에서 기본적으로 제공하는 dependency 들의 버전을 알 수 있다.

 

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>3.1.2</version>
      </dependency>
      <dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>activemq-amqp</artifactId>
        <version>${activemq.version}</version>
      </dependency>
      <dependency>
        <groupId>com.fasterxml</groupId>
        <artifactId>classmate</artifactId>
        <version>${classmate.version}</version>
      </dependency>
      <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>${commons-codec.version}</version>
      </dependency>
      ...
      ...
      ...
    </dependencies>
</dependencyManagement>

dependencyManagement로 spring boot 사용되는 dependency를 정의하고 있다. dependencyManagement 로 정의하고 있기 때문에 자식 pom(개발 프로젝트 pom) 에 <dependencies></dependencies> 내에 artifact 로 정의한 경우에만  dependency 가 추가되지만 버전은 명시하지 않아도 된다. spring-boot-dependencies 에 정의된 버전이 자동으로 적용되기 때문이다.

 

개발 프로젝트 pom.xml 파일에 기본적으로 추가되는 spring-boot-starter dependency 를 보면 버전 정보를 명시하지 않아도 되는 이유이다.

spring-boot-dependencies 에 정의된 spring-boot-starter 의존성
개발 프로젝트에 지정된 spring-boot-starter 의존성

 

개발 프로젝트에 다른 버전의 의존성 지정하기

spring-boot-dependencies에서 제공하는 org.apache.activemq:activemq-amqp의 버전은 5.18.2 버전이지만 개발 프로젝트에서 org.apache.activemq:activemq-amqp 의 5.18.1 버전을 사용해야 한다면 2가지 방법으로 버전을 재정의 할 수 있다.

 

dependencyManagement에서 버전 재정의

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-amqp</artifactId>
            <version>5.18.1</version>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
	<dependency>
    	<groupId>org.apache.activemq</groupId>
        <artifactId>activemq-amqp</artifactId>
    </dependency>
    ...
    ...
</dependencies>

org.apache.activemq:activemq-amqp 의존성 버전을 5.18.1로 재정의 하였다.

추가된 org.apache.activemq:activemq-amqp 라이브러리는 아래와 같다.

activemq-amqp 의존성만 5.18.1 로 변경

properties 섹션에서 버전 재정의

<properties>
    <activemq.version>5.18.1</activemq.version>
    ...
    ...
</properties>

activemq.version 속성 값을 5.18.1 로 재정의 하였다.

추가된 org.apache.activemq:activemq-amqp 라이브러리는 아래와 같다.

activemq 의 모든 의존성이 5.18.1 로 변경

dependencyManagement와 properties를 통해서 의존성 버전을 변경하는 두 가지 방법을 알아보았다. 두 가지 경우에 대한 차이점은 dependencyManagement 는 동일 group의 개별 artifact 의 버전을 변경할 수 있지만 properties 를 이용한 방법은 동일 group 의 모든 artifact 버전이 변경된다는 것이다.

댓글

💲 추천 글