- 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"
...
}
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를 따로 만들지 않아도 됨
'Spring' 카테고리의 다른 글
@Transactional 어노테이션과 AOP (0) | 2022.06.20 |
---|