본문 바로가기
개발/SpringBoot

Spring Boot 2.4 -> 2.5 변경 사항

by Mingvel 2023. 6. 12.

SpringBoot 2.5 Release Node


SQL Script DataSource Initialization

  • spring.sql.init.* properties를 통해 schema.sql , data.sql 로 SQL Initialization이 가능해졌다
    • embedded in-memory database에 한해서 지원한다 (JDBC, R2DBC를 지원한다)
      • enable : spring.sql.init.mode=always
      • disable : spring.sql.init.mode=never
  • script-based SQL Database initialization은 Schema에 대한 분리 된 credentials을 제공하지 않는다.
    • 이를 사용하고자 한다면 org.springframework.jdbc.datasource.init.DataSourceInitializer Bean 에 정의하여 사용하도록 한다
  • 기본적으로 Hibernate가 initializae 되기 전에 data.sql 스크립트가 실행된다
    • 기본 스크립트 기반 초기화의 동작이 Flyway , Liquibase의 동작과 일치하게 된다
  • Hibernate에서 생성 된 Schema를 사용하려면 spring.jpa.defer-datasource-initialization 옵션을 true 로 설정한다
  • JdbcOperations 와 같은 특정 유형의 Bean은 데이터베이스가 초기화 된 이후 초기화 되도록 정렬 된다
  • DataSource와 함께 동작하는 Bean이 있는 경우 @DependsOnDatabaseInitialization 어노테이션을 명시하여, 데이터베이스가 초기화 된 이후에 해당 Bean이 초기화 될 수 있도록 한다

Flyway and Liquibase JDBC URLs

  • spring.flyway.urlspring.liquibase.url 을 사용하는 경우, 추가적으로 usernamepassword 를 명시해야한다
    • 이전 버전의 Springboot 에서는 spring.datasource 설정을 그대로 사용하였지만, 문제가 있다고 판단한 듯 하다

Spring Data JPA

  • getById 메서드가 추가 된다 (getOne 메서드를 대체한다)
  • SpringBoot 2.5 이후부터는 getOne 메서드 사용 시 LazyLoadingException 를 던진다

Spring Data Solr

  • Spring Data Solr를 위한 auto-configuration이 제거 된다 (Spring Data 2021.0.0 에서 제거)

Secure Info Endpoint

  • /info actuator 엔드포인트가 더이상 기본적으로 web으로 노출되지 않는다
  • Spring Security가 classpath에 있고, application 사용자 정의 보안 구성이 없는 경우에도, 엔드포인트는 기본적으로 인증 된 접근을 요구한다

Task Scheduling Harmonization with Spring Integration

  • Spring Integration은 TaskScheduler 를 재사용한다.
    • 이는 task scheduler의 pool size를 1로 사용한다는 것과 같은 의미이며
    • 기존 10 threads pool size를 사용하려면 spring.task.scheduling.pool.size property를 사용할 것

Default Expression Language (EL) Implementation

  • SpringBoot Web , SpringBoot validation starter의 EL 구현이 변경되었다

Messages in the Default Error View

  • 기본 error view 에서 message 속성이 표시되지 않을 때, 비워지지 않고 제거 된다

Logging Shutdown Hooks

  • jar 기반 application에서 logging 종료 hook을 통해 JVM이 종료될 때, logging 리소스를 반환하게 된다
  • logging.register-shutdown-hook property로 제어가 가능하다

Gradle Default jar and war Tasks

  • Spring Boot Gradle 플러그인은 더 이상 표준 Gradle jar 및 war 작업을 자동으로 비활성화하지 않는다

Cassandra Throttling Properties

  • 더 이상 spring.data.cassandra.request.throttler property를 제공하지 않는다

Customizing jOOQ’s DefaultConfiguration

  • jOOQ의 DefaultConfiguration 커스터마이징을 간소화하기 위해 DefaultConfigurationCustomizer를 구현하는 빈을 정의할 수 있다

Groovy 3

  • default Groovy 버전이 3.x로 업그레이드 되었다

Minimum Requirements Changes

  • Gradle은 최소 6.8 이상 지원한다

Hibernate Validator 6.2

  • Hibernate Validator의 기본 버전이 6.2.x 로 업그레이드 되었다

Deprecations from Spring Boot 2.3 and 2.4

  • SpringBoot 2.3 버전에서 Deprecated 된 Code들이 모두 제거되었다
  • SpringBoot 2.4 버전에서 Deprecated 된 Code들은 SpringBoot 2.6 Release에서 제거 될 예정이다

Environment Variable Prefixes

  • 다중 SpringBoot Application에서 stytem environment variable의 prefix를 설정할 수 있다

HTTP/2 over TCP (h2c)

  • embedded web container의 TCP 통신에 추가적인 커스텀 작업 없이 HTTP/2 통신을 지원한다
    • server.http2.enabled property 를 true 로 주어 사용이 가능하다
      • default = false
  • 기존 h2 지원과 마찬가지로, 사용 중인 임베디드 웹 서버에 따라 h2c를 사용하려면 추가 종속성이 필요할 수 있다

Generic DataSource Initialization

  • DataSource를 초기화 하는 코드를 작성하는 경우, 새로운 매커니즘을 사용할 수 있다
    • 해당 매커니즘은 내부적으로 Flyway, Liquibase 및 Script 기반 초기화에 대한 올바른 빈 종속성을 설정하는 데 사용 된다

Database Initialization with R2DBC

  • R2DBC를 통해 접근하는 SQL 기반 DB에 대한 script 기반 초기화가 지원된다
    • spring.sql.init.* 프로퍼티로 커스터마이징이 가능하다

Liquibase DataSource

  • Liquibase를 사용하는 커스텀 DataSource를 정의할 때, SimpleDriverDataSource 로 설정을 제어할 수 있다

Layered WARs

  • Maven 및 Gradle 플러그인을 사용하여 Docker 이미지와 함께 사용할 계층화된 WAR을 생성할 수 있다

Docker Image Building Support

  • buildpacks 프로퍼티를 이용하여 custom Buildpacks의 사용을 지원한다
  • Maven 및 Gradle 플러그인은 모두 buildpack 빌더에 전달할 수 있는 볼륨 바인딩을 지원한다
    • buildpack이 사용할 로컬 경로 또는 볼륨을 바인딩할 수 있다
  • Maven 및 Gradle 플러그인이 실행 가능한 war 파일을 Docker 이미지로 패키징할 수 있다

OpenMetrics for Prometheus

  • /actuator/prometheus 엔드포인트는 표준 Prometheus 응답과, OpenMetrics 응답을 둘 다 지원한다
    • accept 헤더에 따라 응답 유형이 달라진다

Metrics for Spring Data Repositories

  • @Timed 어노테이션을 사용하여 WebFlux Controller 및 functional handler가 처리하는 요청의 타이밍을 수동으로 설정할 수 있다
  • management.metrics.web.server.request.autotime.enabled 프로퍼티를 false 로 설정해야 사용이 가능하다

MongoDB Metrics

  • Actuator 사용 시, MongoDB의 connection pool과 client가 보낸 명령에 대한 metric이 자동으로 생성 된다

Actuator Endpoint for Quartz

  • /quartz 엔드포인트가 추가 되었다
  • 해당 엔드포인트는 Quartz jobs와 triggers에 대한 세부 정보를 제공한다

GET requests to actuator/startup

  • actuator의 startup 엔드포인트가 GET 요청을 지원합니다
  • POST 와는 달리 GET 요청 시, 이벤트 buffer를 소진하지 않으며, 이벤트는 메모리에 유지 된다

Abstract Routing DataSource Health

  • actuator의 health 엔드포인트에 AbstractRoutingDataSource 의 상태가 표시된다
  • DataSource 는 라우팅 키를 이용하여 이름이 지정 된다
  • management.health.db.ignore-routing-data-sources 프로퍼티로 해당 기능을 제어할 수 있다

Java 16 Support

  • Java 16을 지원한다
  • Java 8 또한 여전히 지원한다

Gradle 7 Support

  • Gradle 7.0.x 버전을 지원한다

Jetty 10 Support

  • SpringBoot 2.5의 embedded web server 에서 Jetty 10을 사용할 수 있다
  • 하지만 Jetty 10 에선 Java 11을 요구하기에, SpringBoot 2.5 에선 Jetty 9를 기본값으로 제공하고 있다 (Java 8을 아직 서포트하기에..)
  • Jetty 10을 사용하고자 한다면 jetty.version 프로퍼티를 이용한다

그 외 자잘한 사항들

  • Actuator 엔트포인트 허용 패턴을 명시하기 위해 management.endpoints.web.cors.allowed-origin-patterns 프로퍼티를 사용할 수 있다
  • HttpSessionIdListener bean이 자동으로 servlet context에 등록 된다
  • Couchbase 가 auto-configured 된 ObjectMapper 를 기본값으로 사용한다
  • Elasticsearch의 Sniffer 가 auto-configured 된다 (classpath에 elasticsearch-rest-client-sniffer 모듈이 존재할 때만)
  • spring.data.cassandra.controlconnection.timeout 프로퍼티로 로 Cassandra의 connection timeout설정이 가능하다
  • spring.kafka.listener.only-log-record-metadata 프로퍼티로 retry시 logging 할 내용을 구성할 수 있다
  • Apache Phoenix 가 jdbc:phoenix JDBC URL 을 감지할 수 있도록 지원한다
  • RabbitMQ의 키 저장소 및 신뢰 저장소 알고리즘에 대한 구성 속성
  • /actuator discovery page를 management.endpoints.web.discovery.enabled 속성으로 disabled 할 수 있다
  • /actuator/configpropsactuator/env 앤드포인트가 additional-keys-to-sanitize 프로퍼티를 사용할 수 있다
  • JMX actuator endpoint를 커스터마이즈 하고 싶다면, EndpointObjectNameFactory 를 사용할 수 있다
  • 새로운 DataSource 를 생성하고자 한다면, DataSourceBuilder.derivedFrom(…) 메서드를 사용할 수 있다
  • Spring Security가 classpath에 있는 경우, 구성 속성을 RSAPublicKeyRSAPrivateKey 에 바인딩할 수 있다
  • RabbitMQ ConnectionFactoryConnectionFactoryCustomizer bean으로 커스터마이징이 가능하다
  • spring.datasource.embedded-database-connection 프로퍼티로 embedded database를 컨트롤 할 수 있다
  • CloudPlatform 이 Azure App Service를 자동으로 감지한다
  • server.tomcat.keep-alive-timeout 프로퍼티로 tomcat이 keep-alive-connection을 close 하기까지 요청을 어느정도 기다릴 것인지 설정이 가능하다
  • server.tomcat.max-keep-alive-requests 프로퍼티로 tomcat이 keep-alive-connection을 종료하기 전에 얼마나 많은 요청을 수용할 것인지 설정이 가능하다
  • spring.webflux.session.cookie.same-site 프로퍼티허 Webflux의 SameSite cookie 정책을 사용할 수 있다
  • Apache HttpClient 5 가 WebClient에 auto-configured 된다
  • 새로운 ApplicationEnvironment 클래스가 추가되었다 (약간의 성능 향상이 있었다)
  • spring.netty.leak-detection 프로퍼티로 Netty 메모리 관련 설정이 가능하다

Dependency Upgrades


Deprecations

  • ActuatorMediaTypeApiVersionorg.springframework.boot.actuate.endpoint 프로퍼티로 대체 된다
  • jOOQ 의 *Provider 콜백 인터페이스나 Settings 에 대한 서포트가 종료된다. 대신 DefaultConfigurationCustomizer 가 해당 기능을 대체한다
  • EntityManagerFactoryDependsOnPostProcessor 의 위치가 org.springframework.boot.autoconfigure.data.jpa 에서 org.springframework.boot.autoconfigure.orm.jpa 로 변경 된다
  • [spring.artemis.host](http://spring.artemis.host)spring.artemis.port 가 제거된다. 대신 spring.artemis.broker-url 를 사용할 수 있다

반응형

댓글