본문 바로가기
스프링

스프링부트 2.7x 버전과 스프링 부트 3.xx 의 차이

by 진믈리 2024. 9. 7.
예약 도메인 프로젝트를 진행하면서 Spring Boot 2.7x 버전에서 Spring Boot 3.xx 버전으로 마이그레이션을 진행하려 한다. 버전의 선택이유는 현재 사용하고 있는 3.x 버전과 이전 버전인 2.7x 버전에서 어떤 차이가 있는지 확인해 보기 위함이다. 

 

프로젝트를 진행하려고 하는데 현재 버전을 낮추고 진행하고 있지만 평소에 3.x버전에서 사용하던데로 코드를 작성하고 있었다. 

 

 

JDK 8, 11, 16 지원 중단

Spring Boot 3.0은 Java 17 이상만을 지원한다. 이전 버전의 JDK(Java 8, 11 등)는 Spring Boot 3.0x에서 사용할 수 없다. 

Java EE -> Jakarta EE 전환

Spring Boot 2.7.x 까지는 Java EE(javax) 패키지를 사용했다. 그러나 Spring Boot 3.x 에서는 Jakarta EE 9로 전환 되었기 때문에 Javax 로 시작하는 모든 패키지가 jakarta 로 변경되었다.

따라서 Maven Repository 등 필요한 패키지의 의존성을 찾을때 주의가 필요하다. 

// Spring Boot 2.7
import javax.persistence.Entity;
import javax.validation.Valid;

// Spring Boot 3.x
import jakarta.persistence.Entity;
import jakarta.validation.Valid;

 

WebSecurityConfigurerAdapter 클래스 삭제

Spring Boot 3.x 버전부터 Spring Security 6.x를 지원하며 WebSecurityConfigurerAdapter 클래스는 완전히 제거 되었다. 이전에 SecurityConfig 를 작성할때 WebSecurityConfigurerAdapter 클래스를 상속받아 구현하였지만 이제는 새로운 SecurityFilterChain 방식으로 전환되었다.

 

또한 Spring Boot 2.7엣서는 antMatchers()를 사용하여 URL을 보호하거나 허용 할 수 있었지만 Spring Boot 3.x에서는 requestMatchers() 로 변경되어 보안 설정 방식이 달라졌다.

 

ProblemDetails 추가

ProvlemDetails 는 HTTP API의 에러 응답 표준화를 위해 추가된 기능이다. 이는 REST API에서 발생하는 에러를 일관된 방식으로 클라이언트에 전달할 수 있다.

@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity<ProblemDetail> handleNotFound(EntityNotFoundException ex) {
    ProblemDetail problem = ProblemDetail.forStatusAndDetail(HttpStatus.NOT_FOUND, ex.getMessage());
    return ResponseEntity.of(problem);
}

 

Hibernate 6.x 업그레이드

  • Spring Boot 3.0 에서는 Hibernate 6.x 가 기본 ORM 프레임 워크로 사용된다.
  • 스칼라 서브쿼리 지원
    • 기존의 JPA에서는 서브쿼리 자체를 사용할 수 있었지만 SELECT 절에서 사용하는 데 제한이 있었다. 하지만 이번 Hibernate 6.x 부터는 스칼라 서브쿼리를 지원한다. 
  • 향상된 캐시 관리 및 성능 최적화

Kotlin 1.7 + 호환성 및 기능 개선

Spring Boot 3.x sms Kotilin 1.7+ 를 공식적으로 지원하며 Kotilin을 사용하는 프로젝트에서 더 나은 성능과 최적화를 제공한다.

 

spring.data.rest.base-path(Spring Data REST) 제거

Spring Boot 2.7 에서는 Spring Data REST API 의 기본 경로를 설정할 수 있는 spring.data.rest.base-path 속성이 존재했다. 이 속성은 Spring Data REST API 가 제공하는 모든 엔드포인트 앞에 기본 경로를 설정할 수 있다. 그러나 Spring Boot 3.x부터는 더이사 제공되지 않는다.

 

 

 

Spring Boot 3 마이그레이션 계획

  • Java 17로 업그레이드
  • Spring Boot 2.7 -> Spring Boot 3.x 업그레이드
  • 사용중이 Deprecated 코드 제거
  • 스프링 시큐리티 antMatchers() -> requestMatchers() 변경
  • ProblemDetails 를 활용한 에러처리 진행
  • Select 문 스칼라 쿼리를 활용한 코드 리팩토링, 복잡한 로직은 간단하게 구현하고 가독성 향상

 

'스프링' 카테고리의 다른 글

인터셉터(Interceptor) 란?  (0) 2024.09.23
싱글톤 패턴  (0) 2024.07.27
ResponseEntity와 Rest Api에 대하여  (0) 2024.07.18
@NotNull, @NotEmpty, @NotBlank  (0) 2024.07.11
IOC/DI - 제어의 역전/의존성 주입  (0) 2024.07.07