-
SpringBoot 3.1.0 으로 마이그레이션Project/TravelFeelDog 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 클래스가 추가되어 , 표준 을 적용하기 쉬워졌습니다.
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
- 스프링 프래임워크에 따른 스프링 부트의 버전 의존 확인 가능 사이트
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
우리팀이 JDK 17을 도입한 이유
안녕하세요, T플랫폼개발실 개발3팀 제이든입니다. 이번 포스팅에서는 저희팀에서 Java 17 버전을 도입하게 된 이유와 개발자 입장에서 주요하다 생각되는 업데이트 내용 및 사용사례를 소개드리
techblog.gccompany.co.kr
'Project > TravelFeelDog' 카테고리의 다른 글
OOE: Java heap 분석기 (feat 20만건 벌크 인서트) (0) 2023.09.22 Firebase 에서 OAuth2 , JWT 로 전환기(2) (0) 2023.09.22 SpringBoot MySql bulkInsert 도입기 (0) 2023.08.30 Service Layer 에 읽기 쓰기 분리기 (0) 2023.08.10 Firebase 에서 OAuth2 , JWT 로 전환기(1) (0) 2023.08.08 - Jakarta EE 9+로의 마이그레이션으로 인한 변경