본문 바로가기
Spring

Spring Boot 3 버전 주요 변경 사항

by yeonn108 2024. 7. 16.
  • Spring Boot 3.x.x 버전은 Java 17 버전 이상을 지원한다.
  • Spring Security 버전은 6.x.x을 지원한다.

Java EE를 jakarta EE로 대체한다.

javax 패키지를 jakarta로 변경해야한다.

  • javax.persistence.* → jakarta.persistence.*
  • javax.validation.* → jakarta.validation.*
  • 등등 …

참고: https://www.samsungsds.com/kr/insights/java_jakarta.html

Java의 record 키워드

  • java 14버전에 새로 생긴 키워드 record
  • 불변 데이터 객체를 쉽게 생성할 수 있는 클래스
  • lombok 대신에 record 클래스로 만들어서 사용하면 lombok과 비슷한 기능을 사용할 수 있다.
    • 모든 필드를 초기화하는 생성자가 자동으로 만들어진다.
    • 필드 명과 동일한 메서드가 getter와 같은 역할을 함

→ 하지만 인스턴스 변수 필드가 많은 경우에는 builder로 유연하게 객체를 초기화할 수 있기 때문에 record 키워드는 필드가 적은 클래스에 사용하는 것이 적합하다.

참고: https://www.baeldung.com/java-record-vs-lombok

이외에 Java 17버전에서 추가된 기능

https://techblog.gccompany.co.kr/우리팀이-jdk-17을-도입한-이유-ced2b754cd7

swagger openapi dependency 버전

Spring boot 3버전에서는 springdoc-openapi-starter-webmvc-ui 2.x.x 버전 을 지원한다. (swagger 3)

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.1.0'

참고: https://springdoc.org/v2/#Introduction

https://colabear754.tistory.com/130

Query DSL

  • javax.persistence가 jakarta.persistence로 변경되면서 querydsl 관련 build.gradle depency 설정 필요
  • Sprinb Boot 2.x 에서 사용하던 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" 플러그인을 Spring Boot 3.x에서는 사용하지 못 함
  • 아래와 같이 설정한다.
buildscript {
    ext {
        queryDslVersion = "5.0.0:jakarta"
    }
}

...

depenencies {
		...

		implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
    annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"

		...
}

참고: https://covenant.tistory.com/279#:~:text=javax.persistence.%EA%B0%80%20jakarta.persistence.%EB%A1%9C%20%EB%B3%80%EA%B2%BD%EB%90%98%EB%A9%B4%EC%84%9C%20Querydsl%20%EA%B4%80%EB%A0%A8%20build.gradle%20%EC%84%A4%EC%A0%95%20%EB%B3%80%EA%B2%BD%EC%9D%B4%20%ED%95%84%EC%9A%94%ED%95%A9%EB%8B%88%EB%8B%A4

 

Spring Security 설정

  • WebSecurityConfigurerAdapter에서 configure() 메서드를 오버라이딩 하는 방식은 이미 Spring Boot 2.7 버전 (Spring Security 5.7)에서 deprecated 되었다.
    • SecurityFilterChain 을 빈으로 등록하는 방식으로 변경 됨
  • Spring Boot 3 버전에서 바뀐 사항은 아래와 같다.

as is

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.csrf()
        .disable()
        .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
        .formLogin()
        .disable()
        .httpBasic()
        .disable();

    http.addFilterBefore(customAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

    http.authorizeHttpRequests()
        .antMatchers("/categories/**")
        .hasRole("ADMIN")
        .anyRequest()
        .permitAll();

    return http.build();
}

 

to be

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.csrf(csrfConfigurer -> csrfConfigurer.disable())
        .sessionManagement(sessionManagementConfigurer -> sessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
        .formLogin(formLoginConfigurer -> formLoginConfigurer.disable())
        .httpBasic(httpBasicConfigurer -> httpBasicConfigurer.disable());

    http.addFilterBefore(customAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

    http.authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests.requestMatchers("/categories/**")
                                     .hasRole("ADMIN")
                                     .anyRequest()
                                     .permitAll());
    return http.build();
}
  • 기존에 Configurer를 리턴해서 disable() 하던 방식에서 람다 형식으로 변경되었다.
  • (HttpSecurity 클래스에 deprecated 된 것과 새로운 방식에 대한 예시가 docs로 잘 설명되어 있음)

api 에러 응답 값 타입인 ProblemDetail 이 추가 됨

api 에러 응답 값에 대한 표준 스펙 RFC 7807이 적용된 ProblemDetail 클래스가 Spring Boot 3 버전에 추가 됨

  • @ExceptionHandler 메서드에서 리턴 타입을 ProblemDetail으로 지정한다.
    • 추가하고 싶은 프로퍼티가 있으면 setProperty()를 사용
@ExceptionHandler(BaseException.class)
public ProblemDetail handleBaseException(BaseException e) {
    ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(HttpStatus.BAD_REQUEST, e.getErrorMessage());
    problemDetail.setProperty("errorCode", e.getErrorCode());
    return problemDetail;
} 

→ 에러용 response dto를 따로 만들지 않아도 됨

참고: https://docs.spring.io/spring-framework/docs/6.0.0-RC1/reference/html/web.html#mvc-ann-rest-exceptions:~:text=1.8.-,Error%20Responses,-WebFlux

'Spring' 카테고리의 다른 글

@Transactional 어노테이션과 AOP  (0) 2022.06.20