[리팩토링]Spring Boot 2.4.5 vs Spring Boot 3.1.xx

현재 버전

  • Java 1.8
  • Spring Boot 2.4.5

현재

스프링 부트 2.4.x 의 특징

  1. 구성 파일 처리의 개선점
    1. 프로필 정의 방식의 변경
      1. 2.4 이전
        • application-{profile}.yml 형식의 파일을 작성하고
        • spring.profiles.include 를 이용하여 해당 프로파일을 호출 하였음.
        //application-honeymon.yml
        honeymon:
          root-uri: http://honeymon.io
          github: https://github.com/ihoneymon
        
        //application.yml
        spring.profiles:
          include:
            - honeymon
      1. 2.4 이후
        • 직접 원하는 구성 파일을 명시저긍로 불러올 수 있게 됨.
        //honeymon.yml
        honeymon:
          root-uri: http://honeymon.io
          github: https://github.com/ihoneymon
        
        //application.yml
        spring.config:
          location: classpath:honeymon.yml
  1. 버전 네이밍 변경
    • 2.3.4.RELEASE 에서 2.4.0 같은 간소화된 네이밍 사용
  1. JUnit5 Vintage Engine 의 제거
    • spring-boot-starter-test 에서 JUnit 의 VE 가 제거됨.
    • JUnit4 로 작성된 테스트를 JUnit5 에서 실행시 별도 의존성이 추가되어야함.
  1. 설정파일의 변경점
    1. 스프링 2.4 이전
      1. 기본 구조
        spring:
          profiles: dev
          profiles.include:
            - common
        • application.yml 파일에서 spring .profiles 를 사용하여 활성 프로필을 설정
        • spring.profiles.include 를 사용하여 추가 프로필을 활성화
    1. 스프링 2.4 이후
      1. 프로필 그룹의 생성
        spring:
          profiles:
            group:
              "local": "local, common"
              "dev": "dev, common"
              "prod": "prod, common"
        • 하나 이상의 프로필을 묶어서 하나의 이름으로 관리가능
        • 만약 dev 설정에서는 dbcache 설정이 필요하다고 한다면,
          spring:
            profiles:
              group:
          
                "dev": "db, cache"
          
          • 이런식으로 각 프로필이 필요한 설정을 조립식으로 사용할 수 있게 되는 것입니다.
      1. 활성 프로필 설정(기존방식)(기존방식 사용가능 - 물론 deprecated 예정)
        spring:
          profiles:
            active: dev
        • spring.profiles.active 사용으로 생성한 그룹 프로필 활성화 가능
        • 원래 있던 기능이였음
      1. 개별 프로필 설정(new)
        spring:
          config:
            activate:
              on-profile: "local"
        • 각 프로필에 대한 설정은 위 방식으로 가능
        • 파일이 여러개라면
        • application.yml
          server:
            port: 8080
            tomcat:
              uri-encoding: UTF-8
          spring:
            profiles:
              active: test # 활성화시킬 프로필
              group: # 포함시킬 하위 프로필명
                test: test,oauth 
                develop: develop,oauth,devdb
                production: production,oauth,proddb
        • application-test.yml
          spring:
            config:
              activate:
                on-profile: test
            #생략..
        • application-dev.yml
          spring:
            config:
              activate:
                on-profile: develop
            #생략..
        • 위와 같은 식으로 application-oauth .. devdb 등의 설정 파일도 만들어놓고 조합하는 식

      솔직히 이게 뭐가 바꼈다는 건지 잘 모르겠음. 어쩃든 이전버전도 그룹핑이 가능한것 아닌가?

… 등등이 있음. 나머지 생략

스프링 부트 2.4 to3.1.xx 에서의 마이그레이션 가이드

마이그레이션 순서

2.4 → 2.5 → 2.6 → 2.7 → 3.1 을 추천

JDK 17 필수 사용

  • Spring boot 3.0 에서는 JDK 17 을 최소 요구사항으로 갖는다.

제거된 API

  • JAXB 는 JDK 17 에서 제거되었기에, 메이븐이나 그래들로 해당 라이브러리를 추가해야함

API 교체

  • `ParameterizedTypeImpl 클래스가 JDK 17+ 에서 제거되었습니다.

라이브러리

  • sun.misc.Unsafe 같은 레거시 API 는 업데이트해야함

Spring Cloud 관련 변화

  • 사용 X 별도 정리 X

네임스페이스의 변경

  • javax 에서 jakarta 로 네임스페이스가 변경되었습니다.
  • 다만!
    • javax.sql.*javax.crypto.* 같은 일부 패키지는 Java17 의 일부이기에 변경되지 않습니다.

이미지 배너 지원 중단

  • 이전 banner.gif , banner.jpg , banner.png 등의 이미지 파일을 사용해 배너를 표시할 수 있었음
  • 하지만 이제는 텍스트 기반 banner.txt 지원
  • 애플리케이션 시작시 나오는 텍스트 기반 배너 임.

로깅 날짜 형식의 변경

  • Logback 혹은 Log4j2 라이브러리에서 로그 메시지 날짜 와 시간 부분의 기본 형식이 변경됨.
  • 이전 형식
    • yyyy-MM-dd HH:mm:ss.SSS
  • 새로운 형식
    • yyyy-MM-dd'T'HH:mm:ss.SSSXXX
  • 변경 이휴
    • 표준화때문 ISO-8601 국제 표준 날짜와 시간 표기법으로 일관된 날짜 시간 정보 제공가능
  • 기존 형식으로 되돌리기
    • LOG_DATEFORMAT_PATTERN 환경 변수 혹은
    • logging.pattern.dateformat 프로퍼티를 사용하여 이전의 기본값 yyyy-MM-dd HH:mm:ss.SSS 으로 되돌릴 수 있음

Spring MVC 및 WebFlux URL 매칭 변경

  • Spring F/W 6버전 부터 URL 매칭에서 끝에 슬래시(/) 를 사용하는 옵션을 지원하지 않음.
  • 이전에는 cities/aitportscities/airports/ 둘다에 매칭되던 컨트롤러가 이제는 후자와 매칭되지 않고 HTTP 404 에러 발생시킴
  • 이전 버전을 유지하려면..
    • Spring MVC
      @Configuration
      @EnableCaching
      public class MvcConfig implements WebMvcConfigurer {
          @Override
          public void configurePathMatch(PathMatchConfigurer configurer) {
              configurer.setUseTrailingSlashMatch(true);
          }
      }
    • WebFlux
      @Configuration
      @EnableCaching
      public class MvcConfig implements WebFluxConfigurer {
          @Override
          public void configurePathMatch(PathMatchConfigurer configurer) {
              configurer.setUseTrailingSlashMatch(true);
          }
      }
    • setUseTrailingSlashMatch 는 더 이상 지원되지 않을 예정이기에, 가능한 빨리 설정을 제거해야함

최신 WAS와 호환

  • Tomcat 10.1 , Jetty11 등과 같은 최신 was 지원

GraalVM 기반 Spring Native 의 공식 지원

  • graalvm?
    • 고성능의 JDK
    • JVM 언어로 작성된 어플의 실행 가속화
  • graalvm Native Image
    • Spring 은 JIT(Just-In-Time) 와 AOT(Ahead-of-Time) 컴파일러 모두를 지원함
    • Spring boot 3.0 부터 GraalVM의 Native Image 를 활용한 AOT 컴파일러에 대한 공식 지원을 시작함
      • 더 빠른 실행 시간과 더 적은 메모리 사용량 기대가능

Uploaded by N2T