회사에서 개발 중인 프로젝트가 기존의 Spring Boot 2.7 을 사용하다가 Spring Boot 3.x 버전으로 업그레이드 하였다. 하지만 둘 간의 어떤 차이점이 있는지 몰라 내가 Spring Boot 를 잘 사용하고 있는지 모르겠어 공부해보기로 했다.
javax.* 에서 jakarta.* 로 변경
Java EE 네임스페이스에서 jakarta로 변경
GraalVM 탄생배경 - C++로 만들어진 OpenJDK JIT Compiler는 러닝 커브가 높아 인력을 구하기도 힘들고, 수정하기도 어려워 Java 로 만든 JIT Compiler
AOT (Ahead of Time) 컴파일 지원 - 기존의 JIT (Just in Time) 컴파일러는 런타임에 바이트 코드를 기계어로 변환하지만, AOT는 빌드타임에 바이트 코드를 기계어로 정적 컴파일링 함
어플리케이션 시작 시간과 메모리 사용량 감소
OS에 맞는 기계어를 빌드타임에 컴파일하기 때문에 독립 실행 파일로 배포/실행가능 (JVM이 필요하지 않음)
근데 AOT 기능을 적용하기 위해선 아직 고려해야 하는 요소가 많고 러닝커브가 높은 것 같아 운영환경에 적용하기 보단 앞으로 개선되는 것을 지켜봐야 할 기술
서비스 인터페이스 선언만으로 Http 와 RSocket (Netflix 에서 개발한 Reactive Stream 프로토콜) 액세스 가능
RestClient 또는 WebClient 같은 클래스를 직접 구현하지 않아도, 인터페이스만 선언하면 API 호출 가능
모니터링을 위한 메트릭 지원 강화
Micrometer Observation API 자동 구성, Observability 공식 지원
Micrometer 로 애플리케이션 메트릭을 효율적으로 기록하고, OpenZipkin 및 OpenTelemetry 와 같은 공급자를 통해 추적을 구현
RFC 7807 - API 에러 응답값에 대한 표준 스펙
e.g. 403 권한 에러 일 때 응답은 content-type: application/problem+json 이고, 발생 path, 에러 정보, 에러 상세 정보, 관련 문서 링크, 그 외 참고 데이터 전달하도록 규정
ProblemDetail 클래스 추가하여 이러한 데이터를 전달할 수 있도록 지원
Java 17 로 업그레이드
Spring Boot 2.5.* 를 사용한다면 순차적으로 (2.5 → 2.6 → 2.7) 업그레이드 권장
사용 중인 Deprecated 코드 제거
spring.config.use-legacy-processing=true 여부 확인 및 제거
Spring Boot 2.4 에서 application.properties 와 application.yaml 이 로드되는 방식이 변경되었는데, 이 변경된 점을 기존 방식으로 하기 위한 설정
이런 설정 방식이 Spring Boot 3.0 에서는 더 이상 지원되지 않으므로 제거 필요
외부 라이브러리 혹은 사용 중인 타사 프로젝트에서 Jakarta EE 9 및 Spring Framework 6 호환 릴리즈 확인
(필수 X) AntPathMatcher 를 성능이 더 좋은 PathPatternParser 로 변경
https://revf.tistory.com/260
https://meetup.nhncloud.com/posts/273
Spring - Preparing for Spring Boot 3.0