티스토리 뷰

Spring

Springboot 3.0에 대해 알아보자

토마's 2023. 12. 14. 11:15

안녕하세요. 오랜만에 포스팅을 작성하는데, 이미 나온지는 조금 되었지만 Springboot 3.0 (Springframework 6.0 기반)이 출시와 어떤 내용들이 변경되었는지에 대해 정리하고자 하여 포스팅을 작성하게 되었습니다.

 

개요

스프링부트가 3.0이 정식 출시(2022/11/22)  따라 3.0(SpringFramework 6)에서의 변경 사항을 Document 기반으로 정리해보려고 합니다.

 

변경 사항 목록

 

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 지원
  • Spring framework 6.0 기반

  • HTTP API RFC 7087 스펙 지원
  • HTTP/RSocket Interface Client 제공
    • 서비스 인터페이스 선언만으로 HTTP 와 RSocket (Netflix 에서 개발한 Reactive Stream 프로토콜) 액세스 가능
    • RestClient 또는 WebClient 와 같은 클래스를 직접 구현하지 않아도 인터페이스 선언만 하면 API를 호출 가능

  • 모니터링을 위한 메트릭 지원 강화
  • @RequestMapping 자동 탐색 종료
    • 더 이상 자동 탐색을 하지 않음
    • 반드시 @Controller를 사용해야 한다.

  • AOT 엔진 도입
    • Spring AOT란 빌드 시 스프링 애플리케이션을 분석하고 최적화 하는 도구
    • GraalVM Native Congifutation 이 필요로 하는 Refletion Configuration 을 생성
    • 프로젝트 실행 전 바이트 코드를 해석하여 빠른 시작 속도를 제공
    • 컴파일 시 데드 코드를 제거하여 메모리 사용량 감소
    • 쉽게 말해서 애플리케이션의 시작 시간을 빠르게 하는 기술
    • 근데 AOT 기능을 적용하기 위해선 아직 고려해야 하는 요소가 많고 러닝커브가 높은 것 같아 운영환경에 적용하기 보단 앞으로 개선되는 것을 지켜봐야 할 기술

  • Trailing Slash Matching Configuration 기본 지원 종료
    • 보안 상의 이슈로 아래의 두개의 api 는 더 이상 일치하지 않습니다. 
      @GetMapping("/v1/api/example")
      @GetMapping("/v1/api/example/")

 

Springboot 3.0 마이그레이션 체크포인트

  1. JDK 17로 업그레이드

  2. Springboot 버전 마이그레이션 시 버전 별로 순서대로 진행
    ex) Springboot 2.4.x 
    need) Springboot 2.5 → 2.6 → 2.7 → 3.0

  3. 사용하지 않는 Deprecated 코드는 제거
    1. -Werror 컴파일러 옵션을 사용하여 Deprecated Warning 시 에러 발생하도록 설정 후 수정 권장

  4. yaml 파일, properties 파일 수정
    1. spring.config.user-legacy-process은 더이상 지원하지 않습니다. 따라서 spring.config.use-legacy-processing 제거 필요
    2. 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


  5. Java EE와 Jakarta EE API를 혼합하여 사용하지 못함.
    1. Hibernate, Thymeleaf, Tomcat, Jettey, Undertow 등은 이미 Jakarta EE로 전환 되었음
    2. 외부 라이브러리 혹은 타사 라이브러리를 사용하고 있으면 Jakarta.* 를 사용하고 있는지 체크, Spring Framework 6 호환 체크
    3. SecurityConfig 사용 시 아래와 같이 변경을 해야지만 에러 발생 방지
      authorizeRequests() -> authorizeHttpRequests()
      antMatchers() -> requestMatchers()
      regexMatchers() -> RegexRequestMatchers()
  6. Springboot의 마일스톤 확인
    1. https://repo.spring.io/ui/native/milestone
    2. 이슈가 있으면, https://github.com/spring-projects/spring-boot/issues 에 이슈 제기

  7. Springboot 지원 및 상업적 지원 내용 확인
    1. Springboot 2.7 의 대응은 2023년 11월이 마지막 Release 계획
    2. Springboot 2.7 에 대한 상업적 지원은 2025년 8월까지 지원
  1.