Web/웹 상식

[Spring] Spring 6.0 과 Spring Boot 3.0에는 뭐가 달라질까

MarrRang 2022. 7. 28. 12:53

Spring 5.x 버전, Spring Boot 2.x 버전이 얼마 전에 나왔던 것 같은데 벌써 메이저 버전이 또 올라간다는 소식이 들렸습니다. 이미 수개월 전에 나왔던 소식이지만 제가 좀 늦는 편이라 이제야 보게 되어서 이렇게 정리합니다.

 

Spring 6.0, Boot 3.0의 현재 출시 상황

Spring 6.0 준비하기
Spring 6.0 Roadmap

Spring 6.0은 위와 같이 2021년 12월에 M1 버전이 나왔다는 뉴스가 떴었습니다. 그 후 2022년 7월 즉, 현재 시점에 RC1이 뜨는 것으로 되어 있지만 Spring Blog Release 에는 7월 14일에 M5 버전이 나왔습니다. 그래서 RC1 버전은 2022년 8월중에 나오지 않을까 싶습니다. Boot의 상황은 어떨까요?

Spring Boot 3.0 Overview

Spring Boot는 기반 소스인 Spring Framework의 개발 일정에 뒤이어 나오게 됩니다. Spring 6.0의 GA가 2022년 4분기로 되어 있고 Spring Boot는 그것과 비슷하게 나오게 될 것 같습니다. 그리고 현재는 Spring Blog Release에 2022년 7월 21일에 M4 버전이 출시가 공지되어 있습니다.

 

정리하자면 2022년 12월 정도에는 Spring 6.0, Spring Boot 3.0의 GA 버전을 보게 될 것 같습니다.

 

Spring 6.0, Boot 3.0에서 달라지는 점

Spring 5.x -> 6.0 달라지는 점

  • Java 17기반으로 변경
  • 일부 Java EE API 지원 종료
  • XML이 점차적으로 Spring에서는 사라지게 될 것
  • RPC 지원 종료
  • 새로운 AOT 엔진 도입 (밑에 설명 추가)
  • @Inject 같은 JSR에서 지원하던 어노테이션들이 jakarta.annotation 패키지의 어노테이션으로 변경
  • HttpMethod가 enum에서 class로 변경
  • 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)
  • Commons FileUpload, Tiles, FreeMarker JSP support 같은 서블릿 기반 기능이 지원 종료됩니다.
    • multipart file 업로드 혹은 FreeMarker template view는 StandardServletMultipartResolver 사용을 권장
    • 이외에는 Rest 기반 웹 아키텍처 사용
  • Spring MVC와 Spring WebFlux에서 더 이상 type 레벨에서의 @RequestMapping을 자동 탐색하지 않음
    • interface의 경우에는 @RequestMapping을 붙여도 더 이상 탐색되지 않음
    • 따라서 Class에 붙이거나 interface에도 사용하고 싶으면 @Controller도 붙여야 함
    • spring-cloud-openfeign에서도 이것 때문에 interface레벨 @RequestMapping 지원 종료(Git Issue)
  • URL에서 마지막으로 나오는 / 매칭해주는 trailing slash matching configuration 기본적으로 지원하지 않음 (옵션 추가 시 사용 가능)
@RestController
public class MyController {

  // 기존에는 아래 형식도 /some/greeting과 똑같이 매칭, 6.0부터는 default 옵션으로는 매칭 안해줌
  @GetMapping("/some/greeting/")
  public String greeting {
    return "Hello";
  } 
}

 

공식 깃헙에서 설명하고 있는 정보들을 나열했습니다. 추가적인 정보는 이후에 추가하겠습니다. (07/28 최신화)

 

Spring Boot 2.x -> 3.0 달라지는 점

  • 최소 요구사항 변경 (M4 기준)
    • Gradle 7.5
    • Groovy 4.0
    • Jakarta EE 9
    • Java 17
    • Kotlin 1.6
    • Hibernate 6.1
    • Spring Framework 6
  • AOT maven, gradle 플러그인 제공
  • native 지원 기능 확대

Spring의 AOT란? (Ahead Of Time)

Spring AOT 엔진은 빌드 시 스프링 애플리케이션을 분석하고 최적화하는 도구입니다. 또한 AOT 엔진은 GraalVM Native Configuration이 필요로 하는 reflection configuration을 생성해줍니다. 이것은 Spring native 실행 파일로 컴파일 하는데 사용되고 이후에 애플리케이션의 시작 시간과 메모리 사용량을 줄일 수 있게 됩니다.

 

Spring Boot 3.0 AOT
Spring Boot 3.0 AOT 부분 확대

위 그림에서 보면 AOT가 Spring Boot 환경에서 하는 일들과 순서를 알 수 있습니다. 간단하게 얘기하자면 Bytecode를 분석하고 최적화해서 좀 더 실행하기에 빠르고 메모리적으로 효율적인 코드를 만듭니다.

(+ spring의 native-image는 JVM에서 실행되는 파일에 비해 빌드 시간은 길고 시작시간이 짧고 메모리는 적게 사용하게 된다.)

AOT 적용 효과

  • 런타임시 Spring 인프라를 적게 사용
  • 런타임 시 검증할 조건 수 감소
  • 리플렉션을 줄이고 프로그래밍적 Bean 등록 방식 사용

신규 Spring 버전의 AOT 부분

3.0에서는 AOT 플러그인 제공과 Native 지원에 관한 부분이 확대됩니다. Spring 6.0을 통해 AOT transformation engine도 조금 더 좋아진 버전의 엔진이 사용되는 것 같고 Native에 굉장히 힘을 쏟는 것이 위의 그림에서 보입니다.

정리

Spring 6.0과 Spring Boot 3.0에서 꽤나 많은 부분이 변경됩니다. Java 버전도 8에서 17로 어마어마한 버전 변경이 있고 AOT, Native 부분을 굉장히 힘주어 어필하고 있는 것이 Cloud 생태계에 알맞은 Spring으로 거듭나려는 모습으로 보입니다. Cloud 환경에서는 빌드 시간보다는 실행 과정에서의 부담을 줄여주는 것이 좋을 테니까요.

 

(아직까지 완벽하게 이해하지 못해서 정리가 어수선합니다. GA 버전 발표 이후에 다시 한번 추가 정리하겠습니다.)

반응형