본문으로 건너뛰기

· 약 5분

자바 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