1. 개요

Spring Boot 3 출시 까지 얼마 남지 않은 지금이 새로운 기능을 확인하기에 좋은 시기인 것 같습니다.

2. 자바 17

이전에는 이미 Java 17에 대한 지원이 있었지만 이제 이 LTS 버전이 기준이 됩니다.

LTS 버전 11에서 마이그레이션할 때 Java 개발자는 새로운 언어 기능을 활용할 수 있습니다. Java 자체는 이 기사의 주제가 아니므로 Spring Boot 개발자를 위한 가장 중요한 새 기능의 이름만 지정하겠습니다. Java 17 , 16 , 15 , 14 , 1312 에 대한 별도의 문서에서 추가 세부 정보를 찾을 수 있습니다 .

2.1. 기록

Java 레코드( JEP 395 , Java 14 레코드 키워드 참조 )는 데이터 캐리어 클래스, 즉 단순히 데이터를 포함하고 POJO(Plain Old)라고도 하는 모듈 간에 데이터를 전달하는 것이 목적인 클래스를 만드는 빠른 방법으로 사용하기 위한 것입니다 Java 개체) 및 DTO(데이터 전송 개체).

변경 불가능한 DTO를 쉽게 만들 수 있습니다.

public record Person (String name, String address) {}

현재 인스턴스가 JSON deserialization(Jackson)에서 생성되고 컨트롤러의 메서드에 매개 변수로 입력되는 경우와 같이 생성자 인수에서 유효성 검사 제약 조건이 지원되지 않기 때문에 Bean 유효성 검사 와 결합할 때 주의해야 합니다 .

2.2. 텍스트 블록

JEP 378을 사용하면 이제 줄 바꿈에서 문자열을 연결할 필요 없이 여러 줄 텍스트 블록을 만들 수 있습니다.

String textBlock = """
Hello, this is a
multi-line
text block.
""";

2.3. 표현식 전환

Java 12 는 (모든 표현식과 마찬가지로) 단일 값을 평가하고 명령문에서 사용할 수 있는 스위치 표현식( JEP 361 )을 도입했습니다. 중첩된 ifelse 연산자( ?: )를 결합하는 대신 이제 스위치case -construct를 사용할 수 있습니다 .

DayOfWeek day = DayOfWeek.FRIDAY;
int numOfLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

2.4. 패턴 매칭

패턴 일치는 Project Amber 에서 정교해졌으며 Java 언어로 가는 길을 찾았습니다. Java 언어에서는 instanceof 평가를 위한 코드를 단순화하는 데 도움이 될 수 있습니다.

instanceof 와 함께 직접 사용할 수 있습니다 .

if (obj instanceof String s) {
    System.out.println(s.toLowerCase());
}

switchcase 문 내에서도 사용할 수 있습니다 .

static double getDoubleUsingSwitch(Object o) {
    return switch (o) {
        case Integer i -> i.doubleValue();
        case Float f -> f.doubleValue();
        case String s -> Double.parseDouble(s);
        default -> 0d;
    };
}

2.5. 봉인된 클래스 및 인터페이스

봉인된 클래스는 허용된 하위 클래스를 지정하여 상속을 제한할 수 있습니다.

public abstract sealed class Pet permits Dog, Cat {}

Sealed Classes and Interfaces in Java 에서 자세한 내용을 확인할 수 있습니다 .

3. 자카르타 EE 9

가장 중요한 변경 사항은 패키지 네임스페이스가 javax.* 에서 jakarta.*변경된 Java EE에서 Jakarta EE9로의 점프일 수 있습니다 . 결과적으로 Java EE의 클래스를 직접 사용할 때마다 코드의 모든 가져오기를 조정해야 합니다.

예를 들어 Spring MVC 컨트롤러 내에서 HttpServletRequest 개체에 액세스할 때 다음을 교체해야 합니다.

import javax.servlet.http.HttpServletRequest;

와 함께:

import jakarta.servlet.http.HttpServletRequest;

물론 Servlet API의 유형을 자주 사용할 필요는 없지만 Bean 유효성 검사 및 JPA를 사용하는 경우에는 불가피합니다.

우리는 또한 Java/Jakarta EE에 의존하는 외부 라이브러리를 사용할 때 이를 알고 있어야 합니다(예: Hibernate Validator 7+, Tomcat 10+ 및 Jetty 11+를 사용해야 함).

4. 추가 의존성

Spring Framework 6 및 Spring Boot 3에는 다음과 같은 최소 버전이 필요합니다.

  • 코틀린 1.7+
  • 롬복 1.18.22+( JDK17 지원 )
  • 그레이들 7.3+

5. 큰 포인트

두 가지 가장 중요한 주제인 Native ExecutablesObservability가 특별한 관심을 받았습니다 . 포괄적인 의미는 다음과 같습니다.

  • Spring Framework는 핵심 추상화를 도입합니다.
  • 포트폴리오 프로젝트가 일관되게 통합됩니다.
  • Spring Boot는 자동 구성을 제공합니다.

5.1. 네이티브 실행 파일

기본 실행 파일을 빌드하고 GraalVM에 배포하는 것이 더 높은 우선 순위를 갖습니다. 따라서 Spring Native 이니셔티브는 적절한 Spring으로 이동하고 있습니다 .

AOT 생성을 위해 별도의 플러그인을 포함할 필요가 없으며 spring-boot-maven-plugin새로운 목표를 사용할 수 있습니다 .

mvn spring-boot:aot-generate

기본 힌트 도 Spring 코어의 일부가 됩니다. 이를 위한 테스트 인프라는 Milestone 5(v6.0.0-M5)에서 사용할 수 있습니다 .

5.2. 관찰 가능성

Spring 6에는 새로운 Micrometer Observation API와 이전 Spring Cloud Sleuth 프로젝트가 Micrometer Tracing 으로 마이그레이션된 Observability 이니셔티브가 있었습니다 . 이는 Micrometer로 애플리케이션 메트릭을 효율적으로 기록하고 OpenZipkin  또는  OpenTelemetry 와 같은 Provider를 통해 추적을 구현하기 위한 것입니다 .

Spring Boot 3에는 이들 모두에 대한 자동 구성이 있으며 Spring 프로젝트는 Observation API를 사용하여 자체적으로 계측 작업을 수행하고 있습니다.

6. Spring Web MVC의 작은 변화

가장 중요한 새 기능 중 하나는 RFC7807 (Problem Details Standard)에 대한 지원입니다. 이제 Zalando Problem 과 같은 별도의 라이브러리를 포함할 필요가 없습니다 .

또 다른 작은 변화는 HttpMethod가 더 이상 Enum이 아니라 확장된 HTTP 메서드(예: WebDAV에 의해 정의된 메서드)에 대한 인스턴스를 만들 수 있는 클래스라는 것입니다.

HttpMethod lock = HttpMethod.valueOf("LOCK");

Commons FileUpload(멀티파트 파일 업로드에는 StandardServletMultipartResolver를  사용해야 함 ), Tiles 및 FreeMarker JSP 지원(대신 FreeMarker 템플릿 보기를 사용해야 함 )과 같은 일부 오래된 서블릿 기반 통합이 삭제되었습니다.

7. 프로젝트 마이그레이션

우리가 알아야 할 프로젝트 마이그레이션에 대한 몇 가지 힌트가 있습니다. 권장되는 단계는 다음과 같습니다.

  1. Spring Boot 2.7 로 마이그레이션 (Spring Boot 3 출시 시 Spring Boot 2.7 기반 마이그레이션 사용방법(예제) 제공 예정)
  2. 더 이상 사용되지 않는 코드 사용 및 레거시 구성 파일 처리를 확인합니다 . 새로운 주요 릴리스와 함께 제거됩니다.
  3. 자바 17로 마이그레이션
  4. Jakarta EE 9 호환 릴리스가 있는지 타사 프로젝트 확인
  5. Spring Boot 3가 아직 출시되지 않았기 때문에 현재 이정표를 시도하여 마이그레이션을 테스트 할 수 있습니다.

8. 결론

우리가 배운 것처럼 Spring Boot 3 및 Spring 6으로의 마이그레이션은 Java 17 및 Jakarta EE 9로의 마이그레이션이기도 합니다. 관찰 가능성과 네이티브 실행 파일을 매우 중요하게 생각한다면 다가오는 주요 릴리스에서 가장 많은 이점을 얻을 수 있습니다.

항상 그렇듯이 모든 코드는  GitHub에서 사용할 수 있습니다 .

Generic footer banner