Spring Boot

Spring Boot 버전 관리 원리

iksadnorth 2023. 7. 27. 13:22

👣 개요

Spring Boot의 장점 중 하나로 꼽히는 특징은 '자동 버전 관리'다.
Spring Framework에는 애플리케이션을 만들기 위해 여러 라이브러리들을 사용하게 된다.

예를 들어, Flyway를 이용해 DB 마이그레이션 등등의 기능을 구성하고
성능 향상을 위한 캐싱 DB로 Redis를 사용하기도 한다.
간단히 해당 라이브러리를 다운받고 사용하면 쉬울 것 같지만 사용하고 있는 Spring Framework의 버전이
다운 받은 라이브러리와 호환이 되지 않아 호환되는 버전을 찾고 적용하는 일을 수행해야 한다.
이는 비즈니스 코드와는 동떨어진 작업이고 시간, 에너지가 다소 무의미하게 소비되는 작업이다.

Spring Boot에서는 이런 Dependency들의 호환되는 버전을
미리 확인하고 이를 관리하는 기능을 갖추고 있기 때문에 
단순 노동에 가까운 이런 작업을 하지 않아도 된다.

 

👣 버전 관리 주체 in Gradle

해당 build.gradle에는 다음과 같은 플러그인을 사용해 자동 버전 관리가 이루어집니다.

plugins {
    id 'org.springframework.boot' version '2.5.3'
    
    // 이 플러그인을 추가해야 자동 버전 관리가 동작합니다.
    id 'io.spring.dependency-management' version '1.0.11.RELEASE' 
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    // 다른 의존성들...
}

spring-boot-starter-parent 프로젝트를 기반으로 하는 Spring Boot의 Maven 프로젝트와는 달리,
Gradle에서는
spring-boot-starter-parent 프로젝트를 상속하는 것이 불가능하므로
io.spring.dependency-management 플러그인을 사용하여 자동 버전 관리를 활성화한다.

결국 의존성의 버전을 명시하지 않아도 버전을 결정해주는 주체는
io.spring.dependency-management 플러그인라고 볼 수 있다.

만약 개발자가 위 플러그인이 적용되고 있는 와중에 직접 버전을 명시한다면 어찌될까?

plugins {
    id 'org.springframework.boot' version '2.5.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}

dependencies {
    // 직접 의존성의 버전을 부여한 예시.
    implementation 'org.springframework.boot:spring-boot-starter-web:1.0.0'
    
    // 다른 의존성들...
}

만약 위와 같이 직접 버전을 명시한다면 기본 버전 설정을 무시하고 명시한 버전을 따라가게 되어 있다.
때문에 원한다면 특정 의존성의 버전을 명시할 수 있다.

 

👣 SpringBoot starter

Gradle을 이용해 Dependency를 관리를 하면 다음과 같은 접두어를 자주 마주친다.

spring-boot-starter-XXX

해당 의존성들은 특정 분야의 기술을 사용하기 위해 미리 Spring Boot 측에서 포장해놓은 의존성 묶음이다.
예를 들어 spring-boot-starter-web을 사용한다면 내부에 Spring MVC, Tomcat, Jackson 등을 정의해놓고 있으며 내부적으로 의존성 충돌이 일어나지 않게 버전을 명시하고 있다.

물론 위에서의 플러그인과 역할이 중복되는 것이 아닌가 생각을 하게 되지만
Starter 역시 버전들이 명시되어 있다.
때문에 Starter의 버전을 개발자가 직접 명시할 것이 아니라면
io.spring.dependency-management 플러그인을 사용해 버전 관리를 위임할 수 있다.

 

👣 자주 사용하는 starter

  1. spring-boot-starter-web: 웹 애플리케이션을 개발하기 위한 스타터 패키지
    • 내부 의존성:
      • Spring MVC: 웹 애플리케이션의 웹 프레임워크
      • Tomcat (또는 Jetty 또는 Undertow): 내장 웹 서버
      • Jackson: JSON 데이터 처리
      • 등등 기타 웹 관련 의존성들
  2. spring-boot-starter-data-jpa: JPA를 사용하여 DB와 상호작용하는 스타터 패키지
    • 내부 의존성:
      • Spring Data JPA: 데이터베이스와 JPA를 연동하는 기능
      • Hibernate: JPA 구현체
      • JDBC: JDBC 데이터베이스 지원
      • 등등 기타 JPA와 데이터베이스 관련 의존성들
  3. spring-boot-starter-security: 웹 보안을 구성하는 스타터 패키지
    • 내부 의존성:
      • Spring Security: 웹 보안을 처리하는 프레임워크
      • 등등 기타 웹 보안 관련 의존성들
  4. spring-boot-starter-test: 테스트 코드 작성을 위한 스타터 패키지
    • 내부 의존성:
      • JUnit: 단위 테스트 프레임워크
      • Mockito: 모의 객체(Mock)를 사용한 테스트 지원
      • Spring Test: Spring 애플리케이션을 테스트하기 위한 지원
      • 등등 기타 테스트 관련 의존성들
  5. spring-boot-starter-thymeleaf: Thymeleaf 템플릿 엔진을 사용하기 위한 스타터 패키지
    • 내부 의존성:
      • Thymeleaf: HTML 템플릿 엔진
      • 등등 기타 템플릿 엔진 관련 의존성들

'Spring Boot' 카테고리의 다른 글

Spring Boot HTTPS 적용  (0) 2023.07.28
Executable Jar  (0) 2023.07.28
application.yml 프로퍼티  (0) 2023.07.27
Spring Boot 자동 설정 원리  (0) 2023.07.27
Servlet에서 Spring Boot까지의 발전 양상  (0) 2023.07.12