자바 17, 스프링 6.0, 스프링 부트 3.1
팀 프로젝트를 진행하면서 스프링 부트 3.1을 사용하게 되었다.
2.7 버전을 사용할 수도 있었지만 LTS 기간과 취약점 패치로 인한 버전업 등을 고려했을 때 3.1과 자바 17을 사용하는 것이 더 효율적이라고 판단했다.
자바 변경 사항
우아한테크코스 레벨 2까지는 자바 11을 사용했었다.
따라서 자바 11부터 자바 17까지의 변경사항을 정식 릴리즈 기준으로 정리해보려고 한다.
Switch Expressions(Java 14)
Java 14에서는 기존의 Switch 문을 간결하게 작성할 수 있는 Switch 식이 추가되었다.
enum RESULT {
WIN, LOSE, DRAW
}
RESULT result = RESULT.WIN;
int prize = switch (result) {
case WIN -> 10_000_000;
case LOSE, DRAW -> 5_000_000;
default -> 0;
};
주요 특징은 다음과 같다.
->
연산자를 이용하여 각 case에 대한 결과를 바로 반환할 수 있다.- case를 콤마(
,
)로 연결하여 하나의 case에 여러 값을 지정할 수 있다. - break 문이 필요 없다.
- default 블록을 통해 기본 값을 지정할 수 있다.
Text Block(Java 15)
Java 15에는 새로운 문자열 표현방식이 추가되었다.
긴 문자열을 + 연산자의 도움 없이 가독성있게 작성할 수 있다.
@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
@Query("""
SELECT p FROM Post p
WHERE p.title LIKE %:keyword%
OR p.content LIKE %:keyword%
""")
List<Post> findPostsByTitleOrContentContainingKeyword(String keyword);
}
NPE 메시지(Java 15)
String name = null;
name.chars();
/**
# before
java.lang.NullPointerException
at com.example.DiscountPolicyTest.test(NullPointerExceptionTest.java:61)
# after
Cannot invoke "String.chars()" because "name" is null
java.lang.NullPointerException: Cannot invoke "String.chars()" because "name" is null
*/
Record(Java 16)
Lombok의 @Data
, kotlin의 data 클래스와 유사한 기능을 제공한다.
Record를 선언하는 경우 접근자, 생성자, equals & hashcode, toString이 제공된다.
데이터 전송 용도로 적합해 보인다.
public record PostDto(String title, String content) {
}
추가적인 변경사항
이외에도 stream의 toList, 인스턴스의 타입을 간편하게 체크하는 Pattern Matching Instanceof, Sealed class 등이 추가되었다.
스프링, 스프링 부트 변경 사항
스프링과 스프링 부트에도 많은 변경 사항이 있었다.
따라서 필요해보이는 몇개 정도만 정리했다.
스프링 요구사항
Java 17, Jakarta EE 9 이상이어야 한다.
네임스페이스 변경
Jakarta EE 9가 적용되면서 네임스페이스도 전반적으로 javax -> jakarta로 변경되었다.
PathPatternParser - trailing slash 허용하지 않음
6.0 이전의 경우 기본 설정 기준으로 @GetMapping("/hello")
와 @GetMapping("/hello/")
가 동일했다.
6.0 이후의 PathPatternParser가 기본으로 사용되고, /hello
와 /hello/
는 서로 다른 URL로 매칭된다.
PathPatternParser used by default (with the ability to opt into PathMatcher).
HTTP interface client
자바 인터페이스와 어노테이션을 이용하여 HTTP 요청을 위한 서비스를 정의할 수 있는 방법이 추가되었다.
자세한 내용은 토비님의 강의를 참고하면 좋을 것 같다.
스프링 부트 최소 요구사항
Gradle 7.3, Java 17, Kotlin 1.6, Jakarta EE 9, Spring Framework 6
이외에도 서드파티들의 최신 릴리즈 버전을 사용함으로, 문제가 발생하는 경우 해당 버전에 맞는 릴리즈 노트를 참고할 수 있을 것 같다.
참고 자료
어느 월급쟁이개발자 의 스프링 부트 따라잡기
자바 9-16 주요 특징 복습하기
Java EE에서 Jakarta EE로의 전환
Spring 6의 새로운 HTTP Interface와 3 가지 REST Clients 라이브 코딩
What's New in Spring Framework 6.x
Spring Boot 3.0 Release Notes
Spring Boot 3.1 Release Notes