Project/TravelFeelDog

SpringBoot 3.1.0 으로 마이그레이션

sung.hyun.1204 2023. 9. 7. 11:32

기존 프로젝트의 버전은 다음과 같습니다.

 

SpringBoot 의 경우 버전 2.7 을 사용중이였고 , Java 의 경우 버전 17을 사용중이였습니다.

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

group = 'woowahangongdol'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

///gradle-7.6.1

 

Java 의 버전 선택에서는 다음 3가지는 필수로 존재하는 버전을 선택 하고자 했습니다.

 

1. Java 12 버전 에서 도입된 동적 Switch 문 

2. Java 14 Dto 를 위한 Java Record 기능

3. LTS

 

Java 14 버전의 이후의 선택이 가능한 LTS 는 Java 17 버전 이며,  Oracle JDK 기준 2029 년 까지 지원한다 합니다.

 

SpringBoot 의 버전은  3.2.0 pre version 이 나온 상태이며  , 3.1.x 의 버전도 개발이 진행중인 것으로 보입니다.

https://github.com/spring-projects/spring-boot

 

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

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

github.com

 

Spring 6.0 의 눈에 띄는 특징은 다음과 같습니다.

  • Jakarta EE 9+로의 마이그레이션으로 인한 변경
    • Hibernate ORM 5.6.x 버전부터 hibernate-core-jakarta 사용
    • javax.persistence에서 jakarta.persistence로 변경
    • Tomcat 10, Jetty 11, Undertow 2.2.14 (undertow-servlet-jakarta도 포함)으로 업그레이드 필요
    • javax.servlet에서 jakarta.servlet으로 변경 필요 (import)

 

그로 인한 Spring Boot 3.0 버전 부터는 최소 요구사항이 다음과 같아졌습니다.

  • Java 17
  • Hibernate 6.1
  • Jakarta EE 9
  • Gradle 7.5

 

 

SpringBoot 의 경우 2.7 과 3.0 의 선택시 가장 큰 고민은

  • javax.persistence에서 jakarta.persistence 변경  

에 관한 사항으로 임포트 문이 얼만큼 바뀌어야하는지 , deprecate 된 api 는 없는지, 용어의 변경의 따른 수정 범위의 대한 고민이 부족하였고 , SpringBoot 2.7 을 사용하는 결론이 났었습니다 .   

 

" 최신 기술을 지속적으로 팔로업 하지 못하여 개발을 하던 기술을 그대로 사용" 하게된 아쉬운 선택이었습니다

 

SpringBoot 3.0 의 기능

 

많은 변경점들이 있으니 다음 릴리스 노트를 참고하길 바랍니다.

릴리스 노트

 

 

1.  JVM 의 변화  : GraalVM Native Image Support

- 빠르게 어플리케이션을 올릴 수 있다
- 메모리를 덜 사용한다.

 

2. 로깅의 변화 : Log4j2 Enhancements

 

2. HTTP interface 

interface RepositoryService {

    @GetExchange("/repos/{owner}/{repo}")
    Repository getRepository(@PathVariable String owner, @PathVariable String repo);

    // more HTTP exchange methods...

}

서비스 인터페이스 선언만으로 Http Acess 가 가능한 Http Interface Client 가 추가되었습니다.

 

3. RFC 7807 : Spring Web MVC

에러처리에 관한 표준 응답값을 적용한 ErrorResponse 로 ProblemDetail 클래스가 추가되어 , 표준 을 적용하기 쉬워졌습니다.

https://docs.spring.io/spring-framework/docs/6.0.0-RC1/reference/html/web-reactive.html#webflux-ann-rest-exceptions 

 

Web on Reactive Stack

The original web framework included in the Spring Framework, Spring Web MVC, was purpose-built for the Servlet API and Servlet containers. The reactive-stack web framework, Spring WebFlux, was added later in version 5.0. It is fully non-blocking, supports

docs.spring.io

 

3.0 버전 부터는 경로를 자세하게 구분 가능합니다.

 

 /member/register

 

/member/register/ 

 

2.7.7 에서는 두가지의 경로가 동일 한것으로 인식 하였지만 ,

3.0 버전 부터는 다른 경로로 인식하여 정확한 표현이 가능 해졌습니다.

 

Front 의 request APi 경로 코드 또는 컨트롤러의 경로에 변경할 점이 있는지 확인합니다.   

(하나의 방식으로 통일을 권장합니다. 명확한 자원의 표현의 목적을 생각하여  ,  /member/register 보다는  /member/register/  을 사용합니다.)

 

 

 

추가적으로 고려할 점 현 상황 들은 다음과 같습니다.

-> spring fox 가 아닌 spring doc 을 사용하니 변경 사항이 없습니다

-> com.mysql:mysql-connector-j 을 사용중이라 변경이 없습니다.

-> Spring Batch 관련  : @EnableBatchProcessing  삭제 합니다.

 

 

 

  SpringBoot 3.0 으로 migration 해보자 !

 

(가장 최신 버전인 2.7.x 버전 , java 17 을 사용중이라 큰 변환 없이 migration이 가능해 보입니다.)

 

1. plugin 변경

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

 

다음 dependecy 를 gradle 에 추가하여 , 컴파일시 런타임시 변경 사항들에 대하여 분석을 받을 수 있습니다.

runtimeOnly("org.springframework.boot:spring-boot-properties-migrator")
// runtime 은 Gradle 7.0 에 삭제되어 맞지 않다

!!!  migration 이 완료되면 꼭 지우는걸 권장합니다.

 

 

자카르타의 패키지 명이 바뀌었지만 , 대부분의 내부 네임스페이스(클라스명 , 메소드명)은 동일 합니다.

 

intellij IDE 의 도움을 받아 한번에 바꿔 봅니다.

 

변경하고자 하는 단어 선택 후 ctrl + shift + r 을 눌러 모든 단어를 검색 / 변경해 줍니다.

 

다음과 같이 글로벌 예외처리에 사용되는 javax naming 클라스는

import javax.naming.ServiceUnavailableException;

 

Graddle 에 다음과 같이 WebService 관련 라이브러리 설치 후

compileOnly  group: 'jakarta.ws.rs', name: 'jakarta.ws.rs-api', version: '3.0.0-M1'

 

다음과 같이 변경해줍니다.

import jakarta.ws.rs.ServiceUnavailableException;

 

Swagger 의 경우는 다음과 같이 변경해줍니다.

// 변경 전
implementation 'org.springdoc:springdoc-openapi-ui:1.6.15'

// 변경 후
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'

 

 

Lombok 의 경우는 다음과 같이 버전을 명시 해줍니다.

// 변경 전
compileOnly 'org.projectlombok:lombok0'
    annotationProcessor 'org.projectlombok:lombok'

// 변경 후 
compileOnly 'org.projectlombok:lombok:1.18.30'
    annotationProcessor 'org.projectlombok:lombok:1.18.30'

 

롬북 버전 관련 에러입니다.  (빌드 테스트중 발견한 사항입니다.) 

Caused by: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid'

 

이후 완료가 되면 테스트를 진행해 줍니다.

./gradlew test --stacktrace

 

 

-끝-

 

추가 버전 정보

 

- spring-boot-starter-security : 3.1.0 / spring-security-config : 6.1.0

- spring-boot-starter-tomcat : 3.1.0 / tomcat-embed-core : 10.1.8

 

 

 

 

 

 

 

 

 

 

 

 

[참고]

 

- https://revf.tistory.com/260

 

Spring Boot 3.0 무엇이 달라질까?

Spring Boot 3 (Spring Framework 6) 무엇이 달라질까? 지난 10월 20일 Spring Boot 3.0.0 RC1 가 릴리즈 되었습니다. 정식 버전 릴리즈는 11월 말 예정입니다. "We are not expecting any more features to be added at this point, and

revf.tistory.com

 

- 스프링 프래임워크에 따른 스프링 부트의 버전 의존 확인 가능 사이트

https://docs.spring.io/spring-boot/docs/current/reference/html/dependency-versions.html#appendix.dependency-versions

 

Dependency Versions

 

docs.spring.io

 

 

- springBoot Migration Gide 

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

 

Spring Boot 3.0 Migration Guide

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

github.com

 

https://www.samsungsds.com/kr/insights/java_jakarta.html

 

Java EE에서 Jakarta EE로의 전환 | 인사이트리포트 | 삼성SDS

자바 기술자라면 Java EE(Java Platform, Enterprise Edition) 또는 J2EE(Java 2 Platform, Enterprise Edition)를 들어봤을 것입니다. 자바를 이용한 서버 개발 플랫폼으로 한 때 엔터프라이즈 자바 기술을 선도하며 막

www.samsungsds.com

 

 

T 플랫폼 개발 기술 블로그

 

우리팀이 JDK 17을 도입한 이유

안녕하세요, T플랫폼개발실 개발3팀 제이든입니다. 이번 포스팅에서는 저희팀에서 Java 17 버전을 도입하게 된 이유와 개발자 입장에서 주요하다 생각되는 업데이트 내용 및 사용사례를 소개드리

techblog.gccompany.co.kr