2022년 11월 Spring boot 3 가 릴리즈되었고, 현재는 spring boot 3.1.x 까지 릴리즈 되었습니다.
새로운 프로젝트를 시작하기에 앞서 spring boot의 변경사항에 알아보기 위해 포스팅을 하게되었습니다.
스프링 부트 3은 4.5년 전 2.0이 릴리즈 된 이후 선보인 개정판입니다.
새 릴리즈 버전의 주요 사항은 다음과 같습니다.
- Java17 기반
- Spring Native 프로젝트를 대체하는 GraalVM을 통한 네이티브 이미지 생성 지원
- Spring Framework 6.0 기반
- EE 9 기반의 Jakarta EE 10 지원
스프링 문서에 따르면 보안 업데이트, 버그 수정은 23년 말까지 지원합니다.
Java 17
spring boot 3은 Java 17을 기반으로 하기 때문에 Java 17의 달라진 점을 살펴보겠습니다.
1. Record
record는 데이터 캐리어 클래스로 단순히 데이터를 담고 모듈 간에 데이터를 전달하는 것이 목적인 클래스를 빠르게 생성하는 데 사용하기 위한 키워드입니다. 쉽게 불변 객체를 생성하고, toString, equals, hashCode, getter 메서드를 제공해 줍니다. record는 암시적으로 final이며 abstract 일 수 없습니다.
record를 사용하면 쉽게 불변 DTO 객체를 생성할 수 있습니다.
public record RequestDTO (Long id, String content) {}
2. Text Block
"""{문자열}""" 형식을 이용해 문자열을 보다 가독성있게 작성하도록 도와줍니다.
//이전
String json = "{"
+ "\"lessonName\":\"수학\","
+ " \"startTime\": \"12:00\","
+ " \"endTime\": \"13:00\","
+ " \"days\": [\"MONDAY\",\"TUESDAY\"],"
+ " \"bookIds\": [],"
+ " \"studentIds\":[]"
+ "}";
// text block 적용
String json = """
{
"lessonName":"수학",
"startTime":"12:00",
"endTime":"13:00",
"days":["MONDAY","TUESDAY"],
"bookIds":[],
"studentIds:[]
}
""";
3. Switch Expressions
향상된 스위치 표현식이 적용되었습니다.
- 람다식 지원
- Swtich문 반환
- yield 예약어를 이용한 값 반환
// 람다식
switch (day) {
case MONDAY -> "monday";
case TUESDAY -> "tuesday";
case WEDNESDAY -> "wednesday";
}
// switch 리턴
String dayString = switch (day) {
case MONDAY -> "monday";
case TUESDAY -> "tuesday";
case WEDNESDAY -> "wednesday";
default -> "none";
};
// yield
String dayString = switch (day) {
case MONDAY -> "monday";
case TUESDAY -> "tuesday";
case WEDNESDAY -> "wednesday";
default -> {
// some code;
yield "none";
}
};
switch문 반환시 default 문장이 반드시 있어야합니다. 위의 예제에서 yield는 case의 코드 블록에서 값을 리턴하기 위해 사용했지만 코드블럭의 여부와는 상관없이도 사용이 가능합니다.
4. Sealed class
sealed 키워드를 사용하여 클래스나 인터페이스의 상속, 구현을 제한할 수 있습니다.
sealed 클래스는 다음의 제약 사항이 있습니다.
- 상속/구현하는 클래스는 final, non-sealed, sealed 중 하나도 선언되어야 합니다.
- Permitted subclass는 동일한 모듈에 속해야하며, 이름이 지정되지 않은 모듈에 선언된 경우 동일한 패키지에 속해야 합니다.
- 허용된 모든 서브클래스는 봉인된 클래스를 직접 확장해야 합니다.
package com.example.geometry;
public abstract sealed class Shape
permits Circle, Rectangle, Square, WeirdShape { ... }
public final class Circle extends Shape { ... }
public sealed class Rectangle extends Shape
permits TransparentRectangle, FilledRectangle { ... }
public final class TransparentRectangle extends Rectangle { ... }
public final class FilledRectangle extends Rectangle { ... }
public final class Square extends Shape { ... }
public non-sealed class WeirdShape extends Shape { ... }
이외에 사항들은 https://openjdk.org/projects/jdk/17/ 문서에서 추가적으로 확인할 수 있습니다.
Spring boot 3, Spring Framework 6
1. Jakarta
스프링 프레임워크 6.0으로 업데이트되면서 JavaEE 가 Jakarta EE로 변경됨에 따라, Servlet, JPA 등의 네임스페이스가 javax에서 jakarta로 변경되었습니다. 그래서 기존 Spring boot 2.x 버전을 사용하는 경우 3으로 마이그레이션 하려면 다음과 같이 변경해줘야 합니다.
import javax.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequest;
2. 추가 의존성
Spring Framework 6 및 Spring boot 3에는 다음과 같은 최소버전이 필요합니다.
- Kotlin 1.7+
- lombok 1.18.22+
- Gradle 7.3+
3. Spring AOT 지원
AOT(Ahead-Of-Time)란 프로그램이 실행될 때 바이트코드를 컴파일하는 기존 JVM과 달리 GraalVM을 이용해 네이티브 이미지라는 것을 미리 만들어 미리 컴파일 하고 어플리케이션을 시작을 빠르게 하고 메모리 사용량을 줄여 경량화 어플리케이션을 구축하는데 도움을 주는 기술입니다.
4. Observability
Micrometer 및 Micrometer Tracing을 기반으로 하는 Spring Observability가 도입되었습니다. Micrometer를 이용하여 어플리케이션의 메트릭을 효율적으로 기록하고 관리할 수 있습니다.
5. 더 이상 "Get /some/id" "Get /some/id/" 가 일치하지 않습니다.
기존에는 기존 컨트롤러 url mapping 에서는 /some/id 과 /some/id/ 이 일치했지만 버전이 바뀌면서 더 이상 일치하지 않습니다.
그래서 @GetMapping("/some/greeting", "/some/greeting/")
과 같이 추가적인 경로를 선언하거나 다음과 같은 전역 구성으로 기본값을 변경할 수 있습니다.
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseTrailingSlashMatch(true);
}
}
7. HTTP API에 대한 문제 세부정보 RFC 7807 지원
HTTP API에 대한 문제 세부정보 RFC 7807 을 지원합니다.
주요 추상정보는 다음과 같습니다.
- ProblemDetail : RFC 7807 문제 세부 정보에 대한 표현으로, 사양에 정의된 표준 필드와 비표준 필드 모두를 위한 간단 컨테이너입니다.
- ErrorResponse : HTTP 상태, 응답헤더, 본문 등 HTTP 오류 응답 세부정보를 RFC 7807 형식으로 노출하는 컨트랙트로, 예외가 HTTP 응답에 매핑하는 방법에 대한 세부 정보를 캡슐화하여 노출할 수 있습니다. 모든 Spring MVC 예외는 이를 구현합니다.
- ErrorResponseException : 다른 사람들이 편리한 베이스 클래스로 사용할 수 있는 기본 ErroResponse 구현입니다.
- ResponseEntityExceptionHandler : 모든 Spring MVC 예외와 모든 ErrorResponseException을 처리하고 본문이 포함된 오류 응답을 렌더링하는 @ControllerAdvice의 베이스 클래스입니다.
Spring MVC 예외 및 모든 예외에 대해 RFC 7807 응답을 사용하려면, ResponseEntityExceptionHandler
를 확장하고, Spring 구성에서 @ControllerAdvice
로 선언해서 사용할 수 있습니다.
이외에 Messaging Applications, Spring WebFlux, Data Access, Transactions 변경 사항은 해당 링크에서 자세히 확인할 수 있습니다. https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x/
What's New in Spring Framework 6.x
Spring Framework. Contribute to spring-projects/spring-framework development by creating an account on GitHub.
github.com
참고
https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-6.x/
What's New in Spring Framework 6.x
Spring Framework. Contribute to spring-projects/spring-framework development by creating an account on GitHub.
github.com
Spring Boot 3.0.0 M4 Release Notes
Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.
github.com
https://openjdk.org/projects/jdk/17/
JDK 17
JDK 17 JDK 17 is the open-source reference implementation of version 17 of the Java SE Platform, as specified by by JSR 390 in the Java Community Process. JDK 17 reached General Availability on 14 September 2021. Production-ready binaries under the GPL
openjdk.org
https://post.dooray.io/we-dooray/tech-insight-ko/back-end/4173/
스프링 부트 3.0 으로 전환 - Dooray! POST
2022년 11월에 기존의 Spring framework 5 와 Spring Boot 2.X 버전을 대체하는 Spring framework 6와 Spring Boot 3 가 릴리즈되었습니다. 어떤 변화가 있고, 어떻게 설정해야 할지 알아봅니다
post.dooray.io
https://www.baeldung.com/spring-boot-3-spring-6-new
'spring' 카테고리의 다른 글
Spring Security CORS 이슈 해결 - Preflight 403 Invalid CORS request (1) | 2023.10.10 |
---|---|
Spring SQLIntegrityConstraintViolationException cannot add or update a child row 해결 (0) | 2023.08.20 |
Spring flyway 적용하기 (0) | 2023.08.19 |