1 of 81

스프링 부트 3 살펴보기

Spring Boot = P.L + Build Tool + Spring Framework

2 of 81

I’m honeymon.

public class Honeymon {

private static final String NAME = "Honeymon(김지헌)";

private static final String EMAIL = "ihoneymon@gmail.com";

private static final String COMPANY = "Kurly";

private static final String DESCRIPTION = """

Spring Boot 3.0 출시에 맞춰

- Java

- 스프링 프레임워크 6

- 스프링 부트 3

- 정리

의 순서로 설명을 진행하겠습니다.

""";

}

3 of 81

Spring Boot 3.0 요구사항

  • Java 17(Java 19 까지 호환)
  • Jakarta EE 10
  • Spring Framework 6.0 이상
  • 빌드도구
    • Gradle 7.X(7.5 이상)
    • Maven3(3.5+)

4 of 81

Java

5 of 81

Java 10 - Local Variable Type Inference

변수명은 유용하게(의미있게)

6 of 81

Java 17

Version

기능

10

Local Variable Type Inference: var

14

15

Text Block

16

17

7 of 81

Java 10 - Local Variable Type Inference

지역변수 범위는 최소화(Effective Java 3th: Item 57)

8 of 81

Java 10 - Local Variable Type Inference

지역변수 범위는 최소화(Effective Java 3th: Item 57)

9 of 81

Java 10 - Local Variable Type Inference

초기화에서 충분한 정보를 제공하는 경우!

10 of 81

Java 10 - Local Variable Type Inference

연속되거나 내재화된 표현을 분리할 때

문자열 목록에서 문자별로 묶고 갯수 확인

갯수를 확인한 문자열 중에 가장 갯수가 많은 키값 확인

11 of 81

Java 10 - Local Variable Type Inference

12 of 81

Java 10 - Local Variable Type Inference

인터페이스 프로그래밍에 대한 걱정은 하지마세요.

13 of 81

Java 10 - Local Variable Type Inference

다이아몬드 연산 혹은 제네릭 메서드 사용은 조심!

14 of 81

Java 10 - Local Variable Type Inference

다이아몬드 연산 혹은 제네릭 메서드 사용은 조심!

15 of 81

Java 14 - Switch Expression

16 of 81

Java 14 - Switch Expression

“Case L:” 레이블

17 of 81

Java 14 - Switch Expression

“Case L -> ” Label

18 of 81

Java 14 - Switch Expression

“Case L” & `yield`

19 of 81

Java 14 - Switch Expression

“Case L” & `yield`

20 of 81

Java 14 - Switch Expression

21 of 81

Java 14 - Switch Expression

22 of 81

Java 15 - Text Block

23 of 81

Java 15 - Text Block

24 of 81

Java 15 - Text Block

25 of 81

Java 15 - Text Block

26 of 81

Java 15 - Text Block

마지막 텍스트 블록 닫는 위치에 따라서 줄바꿈(\n) 추가가 결정됨

27 of 81

Java 16 - Records

레코드(record) 선언시

  • 접근자
  • 생성자
  • equals
  • hashCode
  • toString

순수한 데이터 이송(Data carrier) 역할 의도

final 필드

28 of 81

Java 16 - Records

레코드 클래스 정식 생성자(Canonical Constructor)

: 필드 초기화 필요함

29 of 81

Java 16 - Records

레코드 클래스 압축 생성자(compact Constructor)

: 필드 초기화 필요없음

압축 생성자가 종결되는 시점에서 필드할당

30 of 81

Java 16 - Records

레코드 클래스 압축 생성자(compact Constructor)

: 필드 초기화 필요없음

압축 생성자가 종결되는 시점에서 필드할당

31 of 81

Java 16 - Records

정적(static) 필드, 정적 초기화, 정적 메서드 사용가능

32 of 81

Java 16 - Records

인스턴스 초기화는 허용되지 않음

33 of 81

Java 16 - Records

Jackson 직렬화(Serialization)는 2.12.3 자동지원, 이전에는…

34 of 81

Java 16 - Pattern Matching for instanceof

class casting 을 줄일 수 있게 되었음

35 of 81

Java 16 - Pattern Matching for instanceof

패턴 변수 범위는 instanceof 가 true 인 경우 적용

36 of 81

Java 16 - Pattern Matching for instanceof

패턴 변수 범위는 instanceof 가 true 인 경우 적용

37 of 81

Java 17 - Sealed Class

이름 그대로 ‘봉인된(Sealed) 클래스': 사용할 수 있는(같은 모듈 혹은 패키지에 있는) 클래스를 지정한다.

38 of 81

Java 17 - Sealed Class

39 of 81

Spring Framework 6

40 of 81

Spring Framework 6.0

  • Baseline
    • Java 17
    • Jakarta EE 10(Jakarta EE 9 지원: 네임스페이스 변경(javax -> jakarta)
  • General Core
  • Data Accessing and Transaction
    • JPA support for Hibernate ORM 6.1
    • Upgrade to R2DBC 1.0(R2DBC 트랜잭션 정의 포함)

41 of 81

Spring Framework 6.0

  • Spring Messaging
    • RSocket interface client - @RSocketExchange 서비스 인터페이스
    • Netty 5 기반 Reactor Netty 2 지원
    • Jakarta WebSocket 2.1 및 표준 WebSocket 프로토콜 업그레이드 기작 지원
  • General Web
    • HTTP interface client (@HttpExchange) 서비스 인터페이스
    • RFC 7807 - Problem Detail
    • HTTP status code 제어
    • Jackson 2.14 Support
    • Servlet 6.0 맞춤
  • Spring MVC
    • PathPatternParser 기본 사용
    • Tiles 와 FreeMarker JSP 지원 제거

42 of 81

Spring Framework 6.0

  • Spring WebFlux
    • PartEvent - Stream multipart form upload
    • ResponseEntityExceptionHandler - WebFlux exception
    • Flux - non-streaming media types 반환
    • Netty 5 기반 Reactor Netty 2 지원
    • JDK HttpClient 를 통합한 WebClient
  • Observability
    • Micrometer Observation 를 이용한 직접 관측 연결
  • Testing
    • JVM 혹은 GraalVM 상에서 AOT 처리된 애플리케이션 컨텍스트 테스트 지원
    • HtmlUnit 2.64 요청 파라미터 제어 통합
    • Servlet API 6.0 을 기반한 서블릿 Mock(MockHttpServletRequest, MockHttpSession) 지원

43 of 81

Spring Framework 6.0 - Baseline

Jakarta EE 9 Release plan!

  • 네임스페이스 변경: javax -> jakarta
    • 런타임 공급업체가 새로운 네임스페이스에 맞춰 개발을 진행
    • 오래된 Java EE 8 API 제거
    • 새로운 밴더가 Jakarta EE 생태계에 진입할 수 있도록 지원
  • Jakarta EE 9 에 맞춰 사양문서(Specification Documentation) 갱신
  • Java EE 8 에 대한 하위호환성 보장안됨
    • 대신 이전(migration)할 수 있는 도구 지원
  • Java SE 8 소스 컴파일 지원

44 of 81

Spring Framework 6.0 - Baseline

Jakarta EE 10(Tomcat 10.0.X 지원종료로 Jakarta EE 9 에서 변경, Java 11 최소)

45 of 81

Spring Framework 6.0 - Baseline

조금 더 자세하고 이해하기 쉬운 글을 찾으신다면!!

https://www.samsungsds.com/kr/insights/java_jakarta.html

46 of 81

Spring Framework 6.0 - Baseline

Jakarta EE: namespace 변경대응 IntelliJ 지원

Refactor > Migrate Packages and Classes > Java EE to Jakarta EE

47 of 81

Spring Framework 6.0 - General Core

스프링 애플리케이션을 심층분석하여

GraalVM에 맞춰 애플리케이션을 변환하고 최적화(Spring Native)

48 of 81

Spring Framework 6.0 - General Core

애플리케이션 바이트 코드, 클래스패스, spring.factories, 애플리케이션 속성 을 분석하여 최적화된 Native 구성을 추론한다(그레이들, 메이븐 플러그인 제공).

49 of 81

Spring Framework 6.0 - General Core

AOT 를 통해 새롭게 Spring Native 도입하면…

  • JVM 설치없이 실행이 가능하고
  • 실행시 인프라 소모가 줄어들고
  • 구동시간을 줄일 수 있고
  • 빈 등록과정을 프로그래밍하여 리플렉션을 줄일 수 있다.

… 하지만 뭔가 해야할 게 많은 것 같다…

50 of 81

Spring Framework 6.0 - Data Access and Transactions

Jakarta Persistence 3.0.0

51 of 81

Spring Framework 6.0 - Data Access and Transactions

Jakarta Persistence 3.1.0

52 of 81

Spring Framework 6.0 - Data Access and Transactions

  • Hibernate ORM 6.0 (EOL) -> 6.1
    • JPA 2.x -> 3.0 (JPA -> Jakarta Persistence)
    • Jakarta EE 9 지원: javax.persistence -> jakarta.persistence

53 of 81

Spring Framework 6.0 - Data Access and Transactions

  • Hibernate ORM 6.0 (EOL) -> 6.1
    • JPA 2.2(끝!) -> Jakarta Persistence 3.0 -> Jakarta Persistence 3.1
    • Jakarta EE 9 지원: javax.persistence -> jakarta.persistence

54 of 81

Spring Framework 6.0 - General Web

HTTP interface(feign과 유사) - 프록시 생성해서 사용가능…!! ㅡ0-)!

55 of 81

Spring Framework 6.0 - General Web

@HttpExchange 를 타입레벨(type level) 이용해서 모든 메서드 제공

56 of 81

Spring Framework 6.0 - General Web

RFC 7807 - “Problem Details for HTTP APIs”

57 of 81

Spring Framework 6.0 - General Web

Jackson 2.14.1

Jakarta Servlet 6.0

58 of 81

Spring Framework 6.0 - Spring MVC

PathPatternParser - 후행 슬래시(trailing slash, URL 마지막 /) 허용하지 않음

GET /some/greeting/ != GET /some/greeting

임시로 이렇게 사용

59 of 81

Spring Framework 6.0 - Spring WebFlux

  • PartEvent - Stream multipart form upload
  • ResponseEntityExceptionHandler - WebFlux exception
  • Flux - non-streaming media types 반환
  • Netty 5 기반 Reactor Netty 2 지원
  • JDK HttpClient 를 통합한 WebClient

60 of 81

Spring Framework 6.0 - Observability

Spring Framework 여러 부분에서 Micrometer Observation 사용한 직접계측

  • spring-webio.micrometer:micrometer-observation 의존성 가짐

61 of 81

Spring Framework 6.0 - Testing

  • JVM 혹은 GraalVM 상에서 AOT 처리된 애플리케이션 컨텍스트 테스트 지원
  • HtmlUnit 2.64 요청 파라미터 제어 통합
  • Servlet API 6.0 을 기반한 서블릿 Mock(MockHttpServletRequest, MockHttpSession) 지원

62 of 81

Spring Framework 6.0 - Upgrade

Jakarta EE 9 적용되면서 변경되는 네임스페이스 변경 신경쓰기

  • javax.inject -> jakarta.inject
  • javax.annotation -> jakarta.annotation
  • javax.persistence - > jakarta.persistence
  • javax.servlet -> jakarta.servlet

https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x

63 of 81

Spring Boot 3

64 of 81

Spring Boot 3.0

  • 최소 요구사양 변경

65 of 81

Spring Boot 3.0 - First-class Native Support

66 of 81

Spring Boot 3.0.0-M1(2022-01-21)

  • Jakarta EE 9 적용
  • Jakarta EE 9 미지원 라이브러리 중단 및 제거
    • Apache ActiveMQ
    • Atomikos
    • EhCache 2
    • Hazelcast 3
  • CommonsMultipartResolver 지원 중단 및 제거
    • StandardMultipartResolver 기본

67 of 81

Spring Boot 3.0.0-M2(2022-03-25)

  • Groovy 4.0
  • RxJava 1.x 와 RxJava 2.x 의존성관리 제거 및 RxJava 3 대체
  • 이미지 배너 지원 제거(텍스트 배너만 지원)
  • Micrometer Observability 지원
  • Jakarta EE 9 지원 복귀
    • EhCache 3
    • H2Console
  • @ConstructorBinding 기능 향상: 생성자가 2개이상인 경우 선언필요

68 of 81

Spring Boot 3.0.0-M3(2022-05-20)

  • Actuator 계측노출 속성 변경
    • old: management.metrics.export.<product> - deprecated
    • new: management.<product>.metrics.export
    • spring-boot-properties-migrator 사용시 알림
  • 메인클래스명 탐색 간결화 - Gradle
    • bootJar, bootRun, bootWar 에서 메인 클래스 지정시 발생할 오류 대체
    • springBoot DSL 추가하여 메인클래스 정의
  • Spring Security - SAML2 Relying Part 구성 변경
  • 내장형 MongoDB 지원 제거됨
  • 로깅 일자 형식 변경(ISO-8601) yyyy-MM-dd’T’HH:mm:ss.SSSXXX

69 of 81

Spring Boot 3.0.0-M3(2022-05-20)

  • Apache Solr 지원 제거
  • Micrometer’s JvmInfoMetrics 자동구성
  • Jakarta EE 9 지원에 따라 복귀
    • REST Assured(5.0)
    • Pooled JMS(Apache Artemis)
  • Micrometer Observability
    • Micrometer Observation API 자동구성
    • Micrometer Tracing 자동구성
    • Micrometer OtlpMeterRegistory
  • Apache Kafaka 비동기 Acks 활성화
    • spring.kafka.listener.async-acks: true
    • spring.kafka.listener.async-mode: manual | immediate

70 of 81

Spring Boot 3.0.0-M4(2022-07-21)

  • 후행 슬래시(trailing slash) 매칭 구성 비활성화
    • GET /some/greeting != GET /some/greeting/
  • Hibernate ORM 6.1
    • spring-boot-starter-data-jpa 내에 Hibernate Group ID Change
    • org.hibernate:hibernate-core -> org.hibernate.orm:hibernate-core
  • Flyway 9.0 지원
  • R2DBC 1.0 지원
  • Elasticsearch Clients Templates
  • Reactor Netty 가 없으면 JdkClientHttpConnector 가 자동구성되어 WebClient 이 사용함

71 of 81

Spring Boot 3.0.0-M5(2022-09-23)

  • spring.data 접두사 - Spring Data 전용 확정
    • Cassandra: spring.data.cassandra.* -> spring.cassandra.*
    • Redis: spring.redis.* -> spring.data.redis.*
  • JMX 종단점(Endpoint) 노출: health 만 노출
  • 액츄에이터 종단점 민감데이터 기본 마스킹 처리 및 속성 설정
  • Flyway 구성 사용자정의 지원
  • @EnableBatchProcessing 필요없음 자동인식됨
  • MongoDB Health Check 제공
  • spring.factories 를 이용한 자동구성 등록지원 기능 제거
  • Spring Native 지원
  • @SpringBootTest 에서 메인메서드 사용여부 결정 가능

72 of 81

Spring Boot 3.0.0-RC1(2022-10-21)

  • server.max-http-header-size: 웹컨테이너 일괄적용
  • Graceful Shutdown 에 사용되는 SmartLifeCycle 페이즈 변경
  • 스프링 부트 태스크 Properties 이용해서 정의 가능
  • build-info.properties 항목 중 속성 제외가능
  • Spring Native -> GraalVM Native
  • Spring Data JDBC 자동구성 지원

73 of 81

Spring Boot 3.0.0-RC2(2022-11-11)

  • Jakarta EE 10 지원
  • Jetty 사용 시 Servlet 지원여부 확인하여 조정
  • httptrace 종단명 변경: httpexchange
  • 액츄에이터 종단점 별로 ObjectMapper 사용 가능
  • Spring Native 사용시 Graal 22.3 혹은 최신

74 of 81

Spring Boot 3.0.0 GA(2022-11-24)

  • 스프링 부트 2.0 출시 후 4.5년!
  • Spring Framework 6 과 GraalVM 지원(정식버전은…)

75 of 81

정리

Java

  • Java 11을 넘어서 17까지!
  • 점점 제공되는 기능이 풍부해지고 있음
  • 코틀린…? 굳이 자바에서 코틀린으로 옮겨갈 필요성이 줄어들고 있음

76 of 81

정리

Spring Framework 6.0

  • Java EE 8 -> Jakarta EE 9 변경
  • 네임스페이스(namespace) 변경: javax.* -> jakarta.*
  • AOT(Ahead-Of-Time) 엔진 도입
    • Spring Native 이미지(Graal VM image) 빌드
    • 빌드 단계에서 정적분석을 통해서 최적화 작업 수행
  • Micrometer 관측 지원 강화
  • 실험실에서 연구되던 기능들 반영
    • Spring Native(GraalVM)

77 of 81

정리

Spring Boot 3.0

  • Java 17과 Kotlin 1.6 이상 지원
  • Spring Framework 6.0 적용
    • Jakarta EE 9 최적화
  • 그레이들 7.X(7.5 이상)
  • 미사용 라이브러리 및 지원 중단

78 of 81

2.2.X

2.3.X

2.4.X

2.5.X

2.6.X

2.7.X

3.0.X

2.2.0.RELEASE

2.3.0.RELEASE

2.4.0

2.5.0

2.6.0

2.7.0

3.0.0

2.2.13.RELEASE

2.3.12.RELEASE

2.4.13

2.5.14

2.6.14

2.7.6

Latest

Java 17

Java 11

Java 17(&& Jakarta EE namespace 변경)

. Jakarta EE namespace 변경(javax -> jakarta)

Gradle 7.5 이상

. 7.5.1 - 암시적 의존성(implict dependency) 발생

Maven 3.5 이상

Spring Boot 2.4.1

. Application Config Data Migration 대응

. spring.profiles Deprecated 대응

JEP 374 - Deprecate and Disable Biased Locking(JDK 15) 관련 확인

Spring Boot 3.0 Migration Guide

Jackson 2.14.0 메모리 누수(2.14.1 업글)

MariaDB JDBC Connector 3.X - AWS aurora 옵션 제거

기본 업데이트 전략

0단계: Spring Boot Dependencies 활용

1단계: minor 버전 기준 최신 패치버전으로 변경

2단계: minor 버전을 1 올리고 해당 minor 버전 기준 최신 패치버전으로 변경

. Common application properties 변경 확인

. 라이브러리 변경사항 확인

. 정상 작동 확인

예: 2.2.3.RELEASE -> 2.2.13.RELEASE -> 2.3.12.RELEASE -> 2.4.0(application.yml spring.profiles) -> 2.4.1(정상작동 확인) -> 2.4.13 -> 2.5.14 -> 2.6.14 -> 2.7.6 -> Java 17 변경 후 확인 -> 3.0.X(namespace 변경: javax -> jakarta)

spring-boot-starter-validation 분리

JUnit 4(vintage) -> JUnit 5(jupiter)

Gradle requirement minimum 4.10+

. Querydsl 플러그인 이슈 발생가능

Spring Boot 2.7.X 까지는 Java 11 기준으로 개발

Spring Boot 3.X 진입을 준비하는 시점에 Java 17로 변경하여 정상작동 확인

Spring Boot 3.X 진입하며 JakartaEE namespace 변경 대응 및 ‘Biased Locking’ 등 확인

2022년 11월 - 2.6.X EOL(End Of Life, 지원중단)

2023년부터는 2.7 이상으로 갑시다!

2.4.1

79 of 81

참고

Java

Jakarta

Jakarta Persistence & Hibernate

https://newsroom.eclipse.org/eclipse-newsletter/2022/march/what%E2%80%99s-new-jakarta-persistence-31

80 of 81

참고

81 of 81

끗! See you again!

궁금하신 것은 ihoneymon@gmail.com 으로 문의주세요.