본문 바로가기
Java, Kotlin, Spring

[SpringBoot 3.0] SpringBoot 3.0 버전 업그레이드 방법

by 댕댕미냉 2023. 1. 5.

SpringBoot 3.0

1년이 넘는 기간동안 151명의 개발자들이 5700자 이상의 코드 커밋을 통해 마침내 스프링부트 3.0이 릴리즈 되었습니다. 스프링부트 2.0이 릴리즈 된 이후 4년 반만에 릴리즈 된 스프링 부트의 메이저 버전입니다. 또한, 스프링 프레임워크 6.0과 GraalVM을 지원하는 첫번째 GA(General Availability) 릴리즈이며, 첫 자바 17 기반의 스프링부트 버전이기도 합니다. 스프링부트 3.0은 Jakarta EE 10 을 지원하며, AOT와 Native Image with GraalVM을 지원합니다.

 

 

사전 준비

SpringBoot 3.0으로 업그레이드 하기 전, 다음 내용을 참고하셔야 합니다.

 

1. JDK를 JDK17로 업그레이드 하고, 만약 Native Image features를 사용하고 싶다면, GraalVM을 22.3 이상의 버전을 사용해야 하며, Native Build Tools Plugin은 0.9.17 이상의 버전을 사용해야 합니다.

 

2. SpringBoot 2.7보다 낮은 버전을 사용하고 있었다면, 너무 많은 feature와 API의 변경으로 인해 바로 SpringBoot 3.0으로 버전을 올리는 것은 권장하지 않습니다. 매끄러운 업그레이드를 위해서는 2.4 → 2.6 → 2.7 순으로 버전 업을 한 후, 최종적으로 3.0으로 업그레이드 하는 것을 권장합니다.

 

3. SpringBoot 3.0을 위한 dependency components들이 많이 변경되었으므로, 이 점을 유의해야 합니다.

 

 

SpringBoot 3.0 Upgrade

스프링부트 3.0에서는 몇몇 configuration 설정값들이 이름이 바뀌거나 제거되었습니다. 그에 따라, 기존 버전에서 작성된 application.properties와 application.yml에는 많은 변화가 생길 것입니다. 업그레이드를 쉽게 하기 위해, 스프링부트 3.0은 spring-boot-properties-migrator 모듈을 제공합니다. 프로젝트에 해당 모듈을 추가함으로써, 프로젝트 환경을 분석하고 진단할 수 있을 뿐 아니라 런타임 시 일시적으로 properties 값을 마이그레이션할 수 있습니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-properties-migrator</artifactId>
    <scope>runtime</scope>
</dependency>

마이그레이션 이후에는 위 dependency는 반드시 삭제해야 합니다.

 

 

SpringBoot 3.0 핵심 변경 사항

SpringBoot 3.0으로 버전업되면서 많은 변경사항이 발생하였고, 많은 어플리케이션에 영향이 있는 변화들은 아래와 같습니다.

 

Jakarta EE

Java EE 가 Jakarta EE로 변경됨에 따라, 패키지 이름에 javax를 가진 모든 값들은 jakarta로 변경되어야 합니다. 인텔리제이에서 쉽게 마이그레이션 해주는 기능을 제공하는데, 이를 활용해서 쉽게 변환할 수 있습니다.

 

Image Banner

스프링 부트 3.0 커스텀 배너는 오직 banner.txt만 지원하며, 더이상 이미지 타입들을 지원하지 않습니다.

 

Log Date Format

Logback 및 Log4j2 로그 메세지의 날짜와 시간의 기본 포맷이 ISO-8601 표준을 준수하도록 변경되었습니다. 새로운 기본 포맷은 yyyy-MM-dd’T’HH:mm:ss.SSSXXX으로, T를 이용해 날짜와 시간을 분리하며 타임존을 뒤에 붙입니다. LOG_DATEFORMAT_PATTERN 환경 변수 또는 logging.pattern.dateformat property를 통해 기존 값인 yyyy-MM-dd HH:mm:ss.SSS로 표현할 수 있습니다.

 

ConstructingBinding Annotation

@ConfigurationProperties 어노테이션이 더이상 @ConstructorBinding으로 구성을 표기할 필요 없습니다. Configuration 클래스에 여러 생성자가 있는 경우가 아니면 제거해야 합니다.

 

YamlJsonParser 제거

SnakeYAML의 Json 파싱이 다른 parser의 구현과 일치하지 않기 때문에 제거되었습니다. YamlJsonParser를 사용하고 있었다면, 다른 JsonParser로 변환해야 합니다.

 

Automatic Configuration 파일 변화

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

스프링 부트 2.7에서는 위의 새로운 파일을 소개했는데, 이 파일은 spring.factories에 autoconfigurations를 등록하는 데 사용했었으나, 스프링 부트 3.0에서는 imports 파일을 통해서만 등록할 수 있습니다.

 

Path Matching

Spring MVC와 Spring Webflux의 경로 매칭 규칙이 변경되었습니다. 맨 뒤에 슬래시 유무는 이제 다른 경로를 나타냅니다.

  • SpringBoot 3.0 이전 → /foo/bar == /foo/bar/
  • SpringBoot 3.0 이후 → /foo/bar != /foo/bar/

 

(Deprecated) server.max-http-header-size

server.max-http-header-size는 더이상 사용되지 않으며, server.max-http-request-header-size로 대체되었습니다. 이 특성값은 이제 요청 헤더의 사이즈만을 설정하며, 특정 웹 컨테이너의 응답 헤더의 사이즈는 제한하지 않습니다. 제한하고 싶다면, WebServerFactoryCustomizer를 활용해야 합니다.

 

Jetty

Jetty가 현재 Servlet 6.0을 지원하지 않으므로, Jetty를 사용하는 개발자는 Jakarta Servlet 버전을 5.0으로 줄여야 합니다.

 

Data Access Related

spring.data 접두사가 Spring Data project를 위한 예약어가 되었습니다. 만약 Spring Data Project 의 서브프로젝트들을 사용하고 있다면, 연관된 설정값들은 변경이 되었습니다. 예를 들어, spring.redisspring.data.redis로 변경되었습니다.

데이터 접근과 관련된 컴포넌트들은 이제 새로운 버전을 사용합니다.

  • Flyway 는 9.0 버전으로 업데이트 되었습니다.
  • Hibernate 는 6.1  버전으로 업데이트 되었습니다.
  • R2DBC 는 1.0 버전으로 업데이트 되었습니다.

 

MongoDB

Flapdoodle 내장 MongoDB의 자동 구성이 제거되었으므로, 필요한 경우 직접 가져와야 합니다.

 

Elasticsearch

Elasticsearch의 rest 클라이언트는 새로운 API 구현을 사용하며, 이전의 자동 구성과 Spring Data Elasticsearch의 이전 클라이언트 API는 제거되었습니다.

 

기타

자세한 내용은 아래 링크를 통해 확인하실 수 있습니다.

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide