개발/Spring Boot

Spring Boot에서 build.gradle은 의존성 관리를 어떻게 하는걸까?

Debin 2022. 9. 15.
반응형

먼저 이전에 우아한 스프링 부트에 대한 공부 기록을 남기면서 의문점이 한 가지 남아있었다.

이전 우아한 스프링 부트에 대한 공부 기록이 남아있는 게시글은 아래와 같다.

 

https://devdebin.tistory.com/229?category=1039778 

 

우아한 스프링 부트 공부 기록

스프링 부트 스프링 부트는 스프링을 쉽게 제공하기 위해 제공되는 툴이다. 참고로 스프링이란 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크다. 스프링

devdebin.tistory.com

 

우리 개발자들은 스프링 부트를 사용하면서 직접적인 의존성의 버전을 적지 않아도 구체적인 의존성의 버전을 가져온다.

maven의 경우는 pom.xml 파일에서 parent가 버전을 이미 다 알고 있기 때문이었다.

실제로 pom.xml에서 groupId와 spring-boot-starter-parent를 추적하면서

spring-boot-dependencies 파일이 나오면서 의존성들의 버전이 자세히 적혀있는 xml 파일이 나왔다.

그러다가 문득 의문이 들었다.

그렇다면 build.gradle에서는 의존성들의 명시적인 버전을 관리하는 어떤 파일(예를 들면 parent)이 없는데

어떻게 버전을 적지 않아도 될까?? 저번에 강의를 듣고는 애매하게 넘어갔지만 이번에 이에 대해서 정리해보려고 한다.

Spring Boot Gradle Plugin

스프링부트의 공식 문서를 살펴보면 의존성 관리에 대해 몇 가지 기억할 내용이 있다.

 

  • 스프링 부트는 각 배포 버전에 따라 지원하는 의존성 버전과 그 목록을 선별해서 제공한다.
  • 의존성 버전을 스프링 부트가 관리하므로 개발자가 의존성에 대한 구체적인 버전을 적을 필요가 없다.
  • 스프링 부트를 버전을 높이면 의존성도 스프링 부트 버전에 맞게 업그레이드 된다.
  • 선별된 의존성 목록에는 Spring Boot와 함께 사용할 수 있는 모든 Spring 모듈과 정제된 외부 라이브러리 목록이 포함되어 있다. 
  • 이 의존성들은 Maven 과 Gradle spring-boot-dependencies 모두에서 사용할 수 있는 표준 BOM(Bills of Materials)으로 제공된다.

이런 지식을 갖추고 스프링 부트 6.1.3 (스프링 부트로 개발하기)에서 Gradle 부분을 들어가니 짧게 이런 내용이 있었다.

번역하면 'Gradle과 함께 스프링 부트를 사용하는 방법에 대해서 알아보려면 Spring Boot의 Gradle 플러그인에 대해 학습하시오'

의존성과 관련해서 Spring Boot Gradle Plugin의 내용이 핵심인 것 같다. 이제 본격적으로 이에 대해 알아보자.

 

Spring Boot Gradle Plugin은 Gradle이 스프링 부트를 지원하게 도와준다.

이를 통해 jar & war 아카이브를 패키징하고, 애플리케이션 실행을 도와준다.

이번 포스팅에서 제일 중요한 부분은  Spring Boot Gradle Plugin이 의존성 관리를 도와준다는 것이다!!!!

 

그럼 플러그인은 어떻게 시작하는 것일까??

build.gradle에서 Spring Boot Gradle Plugin이 적용되는 build.gradle의 코드를 쉽게 찾을 수 있다.

plugins {
	id 'org.springframework.boot' version '2.7.3' //이 부분이 플러그인 적용
	id 'io.spring.dependency-management' version '1.0.13.RELEASE'
	id 'java'
}

플러그인 적용을 위에서 살펴보았다. 사실 Spring Boot Gradle Plugin인만 적용해서는 큰 의미가 없다고 한다.

Spring Boot Gradle Plugin 플러그인은 다른 플러그인이 들어와야 그에 대한 적절한 반응을 하는 플러그인이다.

예를 들어 위 코드에서는 java 플러그인이 들어왔으므로 jar 빌드 작업이 자동으로 구성되는 것이다.

 

그럼 어떤 플러그인이 종속성에 대한 관리를 하는 것일까?? 필자가 위에서 설명하지 않을 코드를 넣지는 않았다. 

바로 두 번째 라인 코드다.

io.spring.dependency-management

io.spring.dependency-management 플러그인을 적용하면,

Spring Boot Gradle Plugin이 자동적으로 해당 버전의 스프링 부트가 지원하는 spring-boot-dependencies bom을 가져온다.

 

자연스럽게 넘어가지말고... bom이란 무엇이지?!

BOM (Bill Of Materials)

  • BOM은 프로젝트 종속성의 버전을 제어하고 해당 버전을 정의하고 업데이트하는 중앙 위치를 제공하는 데 사용되는 특별한 종류의 POM이다.
  • BOM은 의존해야 하는 버전에 대해 걱정하지 않고 모듈에 의존성을 추가할 수 있는 유연성을 제공한다.
  • 그럼 pom.xml에서 많이 본 pom은 무엇일까?

POM (Project Object Model)

  • POM은 Maven에서 종속성을 가져오고 프로젝트를 빌드하는 데 사용하는 정보 및 구성(프로젝트에 대한)을 포함하는 XML 파일이다.

이제 정리를 한 번 해보겠다.

 

  1. Spring Boot Gradle Plugin을 먼저 적용한다.
  2. io.spring.dependency-management을 적용한다.
  3. 그러면 Spring Boot Gradle Plugin이 해당 플러그인을 인식해 우리가 사용하는 스프링 부트 버전이 지원하는
    spring-boot-dependencies bom을 가져오는 것이다.

결론은 우리가 의존성의 구체적인 버전을 적지 않고, 스프링 부트가 버전을 일관적으로 관리할 수 있었던 이유는 bom 덕분이다.

그럼 이제 한 가지 궁금한 점이 있다. 이 bom은 어디서 가져오는 것일까..?

 

필자의 추측이다. (피드백 환영입니다!!!)

아래 링크로 이동하면 spring-boot-dependencies 내부의 build.gradled이 있다.

그러면 build.gradle 내부의 bom이라는 코드가 존재하는데 여기 엄청나게 많은 외부 라이브러리(의존성)과 버전이 적혀있다.

아마 여기서 가져온다라고 표현하는게 맞는지는 모르겠는데, 여기가 버전 관리를 하는 bom인 것 같다.

https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-dependencies/build.gradle

 

GitHub - spring-projects/spring-boot: Spring Boot

Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

github.com

 

이렇게 build.gradle이 어떻게 버전 관리를 하는지 살펴보았다. 

매일매일 공식 문서를 읽고 있는데 확실히 좋은 습관인 것 같고, 효율적으로 내가 모르는 부분을 알 수 있는 것 같다.

좋은 개발자가 되기 위한 필수 조건인 공식 문서 읽기..!! 꾸준히 진행해야겠다.

 

이상으로 포스팅을 마칩니다. 감사합니다.

 

참고자료

https://docs.spring.io/spring-boot/docs/2.7.3/reference/htmlsingle/#using

https://docs.spring.io/spring-boot/docs/2.7.3/gradle-plugin/reference/htmlsingle/#introduction

https://www.baeldung.com/spring-maven-bom

반응형

댓글