자바 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 등이 추가되었다.