Spring Boot 버전별 특징 정리

패스트캠퍼스 Spring Boot 강의 정리

Spring Boot 1 vs. 2

  • Java 8 & 9, Spring Framework 5
    • Java 8이 최소 사양
    • Java 9 공식 최초 지원 (1.x는 미지원)
  • 서드 파티 라이브러리 업그레이드
    • Tomcat 8.5
    • Flyway 5
    • Hibernate 5.2
    • Thymeleaf 3
    • Elasticsearch 5.6
    • Gradle 4
    • Jetty 9.4
    • Mockito 2.x
  • Reactive Spring
    • 한정된 thread pool로 비동기 non-blocking 알고리즘 이용
    • 다수의 요청을 빠르고 예측 가능한 응답 성능 실현
    • Spring WebFlux
    • Reactive Spring Data
    • Reactive Spring Security
    • Embedded Netty Server
  • Functional APIs
    • WebFlux.fn
    • WebMvc.fn (Spring Framework 5.2)
    • 기존 스프링 웹 애플리케이션을 함수형으로 작성 가능
    • 스프링 기술과 애노테이션에서 분리된 코드
      • 자바 코드 레벨에서 분석 가능
      • 독립적인 유닛 테스트 가능
      • 스프링 컨테이너에서 독립
RouterFunction<ServerResponse> route = RouterFunctions.route()
    .GET("/hello-world", accept(MediaType.TEXT_PLAIN),
        request -> ServerResponse.ok().bodyValue("Hello World")).build();
  • Kotlin 지원
  • Configuration properties
    • Relaxed binding 계속 지원
    • 양식 통일
      • 엘리먼트 구분: .
      • 영어 소문자 + 숫자
      • 단어 구분자로 - 사용 가능
    • 환경변수에서 컬렉션 데이터의 인덱스 표현 가능
      • MY_VAR_1 = a -> my.var[1] = "a"
      • MY_VAR_1_2 = b -> my.var[1][2] = "b"
    • 더 편리한 자료형 인식
      • java.time.Duration -> “1s”, “2m”, “5d”
    • Origin 지원하여 스프링 부트가 읽은 프로퍼티의 위치를 기억하고 에러가 나면 알려줌
  • Gradle 플러그인
    • 최소 버전 4.x
    • boogRepackage -> bootJar & bootWar
    • dependency-management 사용하기 위해서 버전 명시해야 함
  • Actuator 변경점
    • 보안이 강화되어 1.5에서 기본으로 보여주던 endpoint를 보여주지 않음
    • @Endpoints: 커스텀 endpoint를 환경(MVC, JMX, Jersey)에 상관없이 구현 가능
    • 이름 변화
      • /autoconfig -> /conditions
      • /trace -> /httptrace
  • Spring Security
    • OAuth 2.0으로 통합
    • 커스텀 설정 용이
    • WebSecurityConfigurerAdapter 순서 문제 해결
      • 기본 설정 하나로 통합
      • WebSecurityConfigurerAdapter 추가하면 기본 설정 꺼짐
    • 보안이 중요한 기능은 명시적으로 작성하도록 변경
  • Spring Boot Properties 변경 사항
    • 이름, 구성 변화
    • spring-boot-properties-migrator
    • JdbcTemplate 제어 옵션 추가(spring.jdbc.template.*)
    • Redis 제어 옵션 추가(spring.cache.redis.*)
  • Jackson 시간 표시 기본값
  • MySQL auto_increment
    • Spring Data JPA, @GeneratedValue strategy 기본 동작 변경
    • 기본값: GenerationType.AUTO
      • Spring Boot 1.5: MySQL AUTO -> IDENTITY
      • Spring Boot 2.0: MySQL AUTO -> TABLE
  • HikariCP
    • Database 커넥션 풀 관리 프레임워크
    • Tomcat Pool에서 HikariCP로 변경
  • JOOQ(Java Object Oriented Querying)
    • Datasource에 맞게 JOOQ dialect 자동 설정
    • @JooqTest 지원
  • GIF banner
    • 스프링 서버 띄울 때 나오는 배너를 gif도 사용 가능

Spring Boot 2.1

  • 성능 향상
    • 더 적은 heap 사용
    • GC 속도가 향상되어 더 빠르게 시작
  • Spring Data JPA: bootstrap-mode
    • lazy initialization 추가
      • 레포지토리 빈을 사용할 때까지 빈 초기화를 늦추는 기능
    • spring.data.jpa.repositories.bootstrap-mode=deferred(or lazy)
      • 스프링 애플리케이션 컨텍스트가 로드될 때 빈을 다 로드하는 과정에서 JPA 레포지토리 빈을 다 로드하지 않고 사용 전까지 초기화를 늦추는 설정
      • 이 설정으로 인해 빨라짐
  • JDK 11 & Spring Framework 5.1
  • 주요 버전 업그레이드
    • Tomcat 9
    • Undertow 2
    • Hibernate 5.3
    • JUnit 5.2
    • Micrometer 1.1
  • deprecations from 2.0
    • setConnectTimeout(int), setReadTimeout(int)
      • data size를 int 인자로 받던 메소드는 Datasize로 변경 & 기존 메소드 deprecated
    • management.endpoints.jmx.unique-names -> spring.jmx.unique-names
    • @AutoConfigureMcokMvc의 secure 속성 -> @WithMockUser
    • RestTemplateBuilder.basicAuthorization -> basicAuthentication
    • AbstractFilterRegistrationBean, FilterRegistrationBean
      • REQUEST_WRAPPER_FILTER_MAX_ORDER -> OrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER
  • New Spring Actuator Endpoints
    • /actuator/caches 추가
    • /actuator/integrationgraph 추가
    • /actuator/health 업데이트
      • HealthIndicator를 런타임에 추가 또는 삭제 가능
      • 특정 indicatoraks 관찰 가능
  • Logging Refinements
    • logging.level.web=debug, spring.http.log-request-details=true
    • Web MVC의 요청값에 대한 정보를 위의 설정을 해야만 볼 수 있음
  • JUnit
    • JUnit 5 사용 가능
      • spring-boot-test(5.3.1)
    • 기본 설정은 JUnit4여서 빌드 설정에 JUnit5 명시해야 함
    • @ExtendWith(SpringExtension.class)를 모든 spirng boot @-Test 애노테이션에 내재화
  • Bean Overriding
    • 사용자가 모르게 빈이 오버라이드 되지 않도록 기본 동작 false
    • 오버라이드 감지되면 BeanDefinitionOverrideException 발생
    • spring.main.allow-bean-definition-overriding=true
      • 오버라이드 설정

Spring Boot 2.2

  • 성능 향상
    • 시작 시간 & 메모리 사용 감소
    • 새로운 속성 추가(proxyBeanMethods=false)
      • 사용할 수 있는 애노테이션: @Configuration, @SpringBootApplication, @SpringBootConfiguration
      • 프록시 빈을 만들지 않고 팩토리 메서드를 이용해 만드는 방법을 사용하게 됨
    • spring-boot: run(maven), bootRun(gradle) -> -Xverify:none -XX:TieredSTopAtLevel=1
      • JDK 13 쓸 경우 -Xverify:none이 deprecated
    • spring.main.lazy-initialization
      • 빈 레이지 로딩
      • http request 핸들링 속도가 조금 더 길어짐
      • 시작할 때 문제가 있으면 보여주던 실패를 보여주지 않음
  • Java 13 & Spring Framework 5.2
  • 주요 버전 업그레이드
    • Spring HATEOAS 1.0
    • Spring Kafka 2.3
    • Spring Security 5.2
    • Hamcrest 2.1
    • Mockito 3.1
    • AssertJ 3.12
    • Elasticsearch 6.7
    • Git Commit ID Plugin 3.0
    • Hazelcast 3.12
    • Jackson 2.10
    • Jedis 3.1
    • Lettuce 5.2
  • Deprecations from 2.1
  • Jakarta EE
    • javax. group ID가 jakarta.로 이동
    • com.sun.mail:javax.mail -> com.sun.mail:jakarta.mail
  • JUnit 5
    • 기본 제공
  • Gradle 4.10
    • 버전 최소 버전

Spring Boot 2.3

  • 새 버전의 배포 주기 계획 발표
    • 새 버전은 6개월 주기로 배포
    • 배포 예상 가능 & 업그레이드 주기 계획 가능
    • Spring Framework는 feature-based 배포 전략 유지
  • Java 14, Gradle 6.3, developmentOnly
    • Java 14 지원 (8, 11도 지원)
    • Gradle 6.3 필요 (5.6.x는 지원하지만 deprecated)
    • developmentOnly가 스프링 부트 플러그인에 의해 자동 생성
      • developmentOnly에 추가 설정을 수동으로 구성한 코드는 삭제해야 함
  • 주요 버전 업그레이드
    • Spring Data Neumann
      • R2DBC 지원
      • R2DBC ConnectionFactory 자동 설정
      • heath indicator, metrics, @DataR2dbcTest
    • Spring HATEOAS 1.1
    • Spring Integration 5.3
    • Spring Kafka 2.5
    • Spring Security 5.3
    • AssertJ 3.16, JUnit Jupiter 5.6, Mockito 3.3
    • Elasticsearch 7.6
    • Hibernate Validator 6.1
    • Jackson 2.11
    • QueryDSL 4.3
    • MongoDB 4.0
  • 도커 지원
    • Cloud Native Buildpacks
      • Maven: spring-boot:build-image
      • Gradle: bootBuildImage
      • Default Java buildpack: Paketo
    • layered jars
      • jars 내용을 나눠서 업데이트가 있는 이미지만 빌드
      • 도커 이미지를 더 효율적으로 작성 가능
  • Validation Starter를 Web starter에서 제외
    • 검증 기능이 모든 서비스에서 필요하지는 않은데 부피를 차지하게 됨
    • javax.validation.*이 기본 포함되지 않음
    • implementaion 'org.springframework.boot:spring-boot-starter-validation'
  • Graceful shutdown
    • 4가지 임베디드 웹 서버에 제공(Jetty, Reactor Netty, tomcat, Undertow)
    • server.shutdown=graceful
    • shutdown 실행되면 바로 죽지 않고 모든 새로운 요청을 거부하고 남은 요청이 처리되기를 기다림
    • spring.lifecycle.timeout-per-shutdown-phase grace period 설정
      • 남은 요청이 처리되기를 기다리는 시간 (default: 30s)
  • Jackson 2.11
    • java.util.Date, java.util.Calendar 기본 포맷팅 변화
    • 정확한 ISO-8601 확장 규격 준수
  • Actuator 향상점
    • /actuator/configpros 가 end-to-end 정보를 추적하여 제공
    • /actuator/metrics 이름 알파벳 순 정렬
  • 기본 에러 페이지 내용 변화
    • 에러 메세지, 바인딩 에러 노출되지 않음
    • 클라이언트 정보 유출 방지
    • server.error.include-message, server.error.include-binding-errors 설정 가능
  • @ActiveProfiles에 여러 프로파일 설정
    • @ActiveProfiles({"p1", "p2"})

Spring Boot 2.4

  • 버전 네이밍 변화
    • RELEASE 제거
  • Java 15, Startup Logging
    • Java 15 공식 지원
    • JVM 버전이 애플리케이션 시작 로그에 추가됨
  • jar Optimizations
    • 비어있는 starter 의존성이 jar 패키징할 때 자동으로 제외됨
      • transitive dependency
    • annotation processor도 자동 제외
      • spring-boot-autoconfigure-processor
      • spring-boot-configuration-processor
    • Layered jar 기본 동작, layertools 자동 포함
  • jUnit Vintage Engine
    • spring-boot-starter-test에서 빠짐
    • JUnit4를 사용하고 싶을 때는 직접 넣어야 함
  • 설정 파일 처리 기능
    • properties 파일에서 yaml처럼 document 구분 가능(#—)
    • 일관된 우선 순위를 가지며 나중에 읽힌 document가 더 우선순위가 높음
    • spring.config.import 이용해 다른 프로퍼티 파일 삽입 가능
      • optional: 파일이 없을 경우 넘어가도록 설정
      • application[.properties]
    • config tree
  • Logback 설정, Property Migrator
    • logback 설정 방식이 바뀌었는데 property migrator 이용하면 바뀐 설정을 알려줌
    • property migrator는 속도에 영향을 주므로 마이그레이션 작업 후에는 삭제
  • @ConstructorBinding
    • 2.2에서 처음 지원: @ConstructorBinding, @DefaultValue
    • 2.4에서 발전된 기능: @DurationUnit, @DataSizeUnit, @PeriodUnit, @Name
  • Origin chains
  • Docker, buildpack
    • 생성된 이미지를 도커 레지스트리에 업로드
    • 인증
      • private docker registry
      • username&password qkdtlr, token 기반 인증 지원
    • 최신 paketo images 기본 사용
    • Buildpack Support
      • 모든 project module 의존성을 application layer에 포함
      • multiple project module로 구성할 경우 모두 같은 layer에 담김
      • maven: spring-boot:build-image
      • gradle: bootBuildImage

Spring Boog 2.5

  • Java 16, Gradle 7, Jetty 10, Kotlin 1.5, Groovy 3
  • 의존성 업그레이드
    • Spring Data 2021.0
      • CrudRepository, ReactiveCrudRepository: deleteAllById() 새로 생김
    • Spring HATEOAS 1.3
    • Spring Integration 5.5
    • Spring Kafka 2.7
    • Spring Retry 1.3
    • Spring Security 5.5
    • Spring Session 2021.0
    • Jackson 2.12
    • Mockito 3.7
    • JUnit Jupiter 5.7
    • Elasticsearch 7.12
  • Deprecations from 2.3, 2.4, 2.5
    • release 호환성 정책: deprecated 내용은 최소 2개 minor release 동안 유지
    • 2.3에서 deprecated된 것들은 삭제
    • 2.4에서 deprecated 된 내용은 2.6에서 삭제 예정
    • 2.5에서 deprecated
      • ActuatorMediaType, ApiVersion
      • jOOQ *Provider, Settings
      • EntityManagerFactoryDependsOnPostProcessor
  • SQL Script DataSource Initialization
    • spring.datasource.* -> spring.sql.init.*
    • R2DBC 설정 가능
    • sql 기반 초기화 설정이 embedded JDBC & R2DBC datasource 지원
    • sql 기반 DB 초기화: 인메모리 인베디드 DB 쓸 때만(기본값)
      • 제어: spring.sql.init.mode
    • data.sql은 하이버네이트 초기화하기 전에 실행됨
      • Flyway, Liquibase의 스크립트 방식 초기화 작업의 기본 동작과 맞추기 위함
  • 기본 에러 뷰 메세지
    • message 어튜리뷰트가 기존 빈칸 처리에서 사라짐
    • server.error.include-message
  • Logging Shutdown Hooks
    • JVM 종료시 로깅 리소스가 잘 반환되도록 shutdown hook 등록하는 동작 기본값이 true가 됨
    • logging.register-shutdown-hook
  • HTTP/2 over TCP (h2c)
    • 임베디드 웹 컨테이너의 HTTP/2 over TCP 지원(수동 설정 필요없음)
      • Tomcat, Jetty, Reactor Netty, Undertow
    • H2C 활성화
      • server.http2.enabled=true (default: false)
      • server.ssl.enabled=false (default: true)
    • 사용하는 임베디드 서버에 따라 H2C가 추가 디펜던시를 불러올 수 있음
  • R2DBC DB 초기화
    • 스크립트 기반으로 초기화 가능
    • schema.sql, data.sql 자동 적용
  • Layered WARs, Docker Image Building Support
    • Layered JARs와 유사하며 도커 빌드에 효과적
    • Docker Image Building Support
      • 커스텀 빌드팩 사용 지원
      • volume binding 지원
      • war 지원
  • GET requests to actuator/startup
    • /actuator/startup을 GET 요청으로 조회 가능
    • startup 이벤트 버퍼가 사라지지 않고 메모리에 남게 됨