Spring Boot 버전별 특징 정리
07 Aug 2022패스트캠퍼스 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 레포지토리 빈을 다 로드하지 않고 사용 전까지 초기화를 늦추는 설정
- 이 설정으로 인해 빨라짐
- lazy initialization 추가
- 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
- setConnectTimeout(int), setReadTimeout(int)
- 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
애노테이션에 내재화
- JUnit 5 사용 가능
- 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
- Spring Data Neumann
- 도커 지원
- Cloud Native Buildpacks
- Maven:
spring-boot:build-image
- Gradle:
bootBuildImage
- Default Java buildpack: Paketo
- Maven:
- layered jars
- jars 내용을 나눠서 업데이트가 있는 이미지만 빌드
- 도커 이미지를 더 효율적으로 작성 가능
- Cloud Native Buildpacks
- 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 자동 포함
- 비어있는 starter 의존성이 jar 패키징할 때 자동으로 제외됨
- 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()
새로 생김
- CrudRepository, ReactiveCrudRepository:
- 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
- Spring Data 2021.0
- 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가 추가 디펜던시를 불러올 수 있음
- 임베디드 웹 컨테이너의 HTTP/2 over TCP 지원(수동 설정 필요없음)
- 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 이벤트 버퍼가 사라지지 않고 메모리에 남게 됨