티스토리 뷰
안녕하세요. 오랜만에 포스팅을 작성하는데, 이미 나온지는 조금 되었지만 Springboot 3.0 (Springframework 6.0 기반)이 출시와 어떤 내용들이 변경되었는지에 대해 정리하고자 하여 포스팅을 작성하게 되었습니다.
개요
스프링부트가 3.0이 정식 출시(2022/11/22) 따라 3.0(SpringFramework 6)에서의 변경 사항을 Document 기반으로 정리해보려고 합니다.
- documentation : https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga
- SpringFramework 6 : https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x/
- 릴리즈 노트 : https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes
변경 사항 목록
- Java 17 이상을 지원합니다. (Kotlin 1.7+)
- Java EE를 jakarta EE 로 대체합니다 (javax.* 에서 jakarta.* 로 변경됩니다.)
- GraalVM 기반의 Spring Native가 3년간의 실험을 마치고 공식 지원을 시작합니다.
- HTTP/RSocket Interface Client를 제공합니다,
- Micrometer Observation API가 자동으로 구성되며, Observability 가 공식 지원을 시작합니다.
- HTTP API 에러 처리를 위한 RFC 7807 스펙을 지원합니다.
- 보안상 이슈로 /api/hello 와 /api/hello/ 는 더 이상 일치하지 않습니다.
- Logback 및 Log4j2 날짜 및 시간의 기본값이 ISO-8601 표준을 따릅니다.
- 사용되지 않는 (Deprecated) 모든 코드가 제거됩니다.
Springboot 버전 별 지원 기간 (출처 : https://spring.io/projects/spring-boot)
Springframework 버전 별 지원 기간 (출처 : https://spring.io/projects/spring-framework)
변경 내역
위 변경 사항 중 큰 변경 사항으로는 다음과 같은 특징이 있습니다.
- Java17과 Java19 지원
- Java EE API → Jakarta EE 9+ 로 이동
- Servlet, JPA 등 일부 namespace javax → jakarta. 으로 변경
- Hibernates ORM 5.6.x 버전부터 hibernates-core-jakarta 를 사용
- javax.persistence에서 jakarta.persistence 로 변경
- javax.serlvet 에서 jakarta.servlet 으로 변경 필요 (import 패키지 변경)
- Jakarta EE9 및 Jakarta EE10 런타임 호환성
- 최신 와스 서버와의 호환 (Tomcat 10 이상, Jetty11, Undertow 2.3)
- GraalVM 지원
- Oracle GraalVM은 대체 JIT(Just-In-Time) 컴파일러를 사용하여 Java 및 JVM 기반 애플리케이션의 성능을 가속화할 수 있는 고성능 JDK입니다.
- 참고 내용
- Spring framework 6.0 기반
- HTTP API RFC 7087 스펙 지원
- Problem Details for HTTP APIs
- 발생한 에러를 JSON 형태로 상세하게 응답하기 위한 표준
- MIME type application/problem+json
- 링크 : https://www.rfc-editor.org/rfc/rfc7807
- Problem Details for HTTP APIs
- HTTP/RSocket Interface Client 제공
- 서비스 인터페이스 선언만으로 HTTP 와 RSocket (Netflix 에서 개발한 Reactive Stream 프로토콜) 액세스 가능
- RestClient 또는 WebClient 와 같은 클래스를 직접 구현하지 않아도 인터페이스 선언만 하면 API를 호출 가능
- 모니터링을 위한 메트릭 지원 강화
- Micrometer Observation API 자동 구성, Observability 공식 지원
- Micrometer 로 애플리케이션 메트릭을 효율적으로 기록하고, OpenZipkin 및 OpenTelemetry 와 같은 공급자를 통해 추적을 구현
- 링크 : https://spring.io/blog/2022/10/12/observability-with-spring-boot-3
- @RequestMapping 자동 탐색 종료
- 더 이상 자동 탐색을 하지 않음
- 반드시 @Controller를 사용해야 한다.
- AOT 엔진 도입
- Spring AOT란 빌드 시 스프링 애플리케이션을 분석하고 최적화 하는 도구
- GraalVM Native Congifutation 이 필요로 하는 Refletion Configuration 을 생성
- 프로젝트 실행 전 바이트 코드를 해석하여 빠른 시작 속도를 제공
- 컴파일 시 데드 코드를 제거하여 메모리 사용량 감소
- 쉽게 말해서 애플리케이션의 시작 시간을 빠르게 하는 기술
- 근데 AOT 기능을 적용하기 위해선 아직 고려해야 하는 요소가 많고 러닝커브가 높은 것 같아 운영환경에 적용하기 보단 앞으로 개선되는 것을 지켜봐야 할 기술
- Trailing Slash Matching Configuration 기본 지원 종료
- 보안 상의 이슈로 아래의 두개의 api 는 더 이상 일치하지 않습니다.
@GetMapping("/v1/api/example")
@GetMapping("/v1/api/example/")
- 보안 상의 이슈로 아래의 두개의 api 는 더 이상 일치하지 않습니다.
Springboot 3.0 마이그레이션 체크포인트
- JDK 17로 업그레이드
- Springboot 버전 마이그레이션 시 버전 별로 순서대로 진행
ex) Springboot 2.4.x
need) Springboot 2.5 → 2.6 → 2.7 → 3.0 - 사용하지 않는 Deprecated 코드는 제거
- -Werror 컴파일러 옵션을 사용하여 Deprecated Warning 시 에러 발생하도록 설정 후 수정 권장
- -Werror 컴파일러 옵션을 사용하여 Deprecated Warning 시 에러 발생하도록 설정 후 수정 권장
- yaml 파일, properties 파일 수정
- spring.config.user-legacy-process은 더이상 지원하지 않습니다. 따라서 spring.config.use-legacy-processing 제거 필요
- application.yml 혹은 application.properties 등에서 Spring Boot Config Data의 일부 프로퍼티의 이름이나 뎁스(depth)를 수정해야 합니다. 예를 들어 아래와 같이 spring.redis.port가 spring.data.redis.port로 수정됐습니다.
##### YAML 파일
# As-Is
spring:
redis:
port: 6379
# To-Be
spring:
data:
redis:
port: 6379
##### Properties 파일
# As-Is
spring.redis.port=6379
# To-Be
spring.data.redis.port=6379
- Java EE와 Jakarta EE API를 혼합하여 사용하지 못함.
- Hibernate, Thymeleaf, Tomcat, Jettey, Undertow 등은 이미 Jakarta EE로 전환 되었음
- 외부 라이브러리 혹은 타사 라이브러리를 사용하고 있으면 Jakarta.* 를 사용하고 있는지 체크, Spring Framework 6 호환 체크
- SecurityConfig 사용 시 아래와 같이 변경을 해야지만 에러 발생 방지
authorizeRequests() -> authorizeHttpRequests()
antMatchers() -> requestMatchers()
regexMatchers() -> RegexRequestMatchers()
- Springboot의 마일스톤 확인
- Springboot 지원 및 상업적 지원 내용 확인
- Springboot 2.7 의 대응은 2023년 11월이 마지막 Release 계획
- Springboot 2.7 에 대한 상업적 지원은 2025년 8월까지 지원
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday