저번주에 Spring boot 2.0 M2 가 나왔다. 그래서 오늘은 Spring boot 2.0 Milestone 1,2의 변경사항을 살펴보도록 하자. 아직 Milestone 버전이기에 바뀔 가능성이 크지만 그래도 한번 살펴보는 시간을 갖도록 하자.

Milestone 1

일단 Milestone 1 부터 바뀐 부분 혹은 삭제된 부분 부터 살펴보자.

Deprecations from Spring Boot 1.5

Spring 1.5에 Deprecated 메서드 클래스들은 삭제 되었다. 만약 2.0으로 업그레이드 하기전에 Deprecated 된 부분들은 더 이상 호출하지 않도록 주의하도록 하자.

Java 8 baseline

기본적으로 Spring boot 2.0 은 java8+ 이상부터 지원한다. 더이상 java6, java7은 지원하지 않는다. 그러니 이제 제발 java8을 쓰자.

Embedded containers package structure

Embedded containers 패키지 구조가 바뀌었다. reactive 때문에 거의 대부분이 리펙토링 되었다. EmbeddedServletContainer 인터페이스는 WebServer 인터페이스로 변경 되었고 org.springframework.boot.context.embedded 패키지는 org.springframework.boot.web.embedded 으로 변경 되었다. embedded 패키지에 netty도 추가되었고 TomcatEmbeddedServletContainerFactory 클래스도 TomcatServletWebServerFactory 으로 변경 되었다. 또한 새로운 TomcatReactiveWebServerFactory 클래스가 추가 되었다.

Actuator default mapping

Actuator의 기본적인 url mapping이 변경 되었다. 원래는 아무 것도 없었지만 이제는 /application 이 기본적으로 추가 되었으니 참고하면 되겠다. 만약 기본값을 변경하고 싶다면 기존과 동일하다. management.context-path 를 사용해서 기본값을 변경하면 된다.

@ConditionalOnBean

@ConditionalOnBean은 원래는 OR 조건이 만족하면 동작하였는데 이제는 AND 조건이 만족하면 동작한다.

Remote CRaSH shell

저번 Spring boot 1.5에 변경사항 이야기 할 때도 언급했지만 CRaSH 프로젝트가 유지보수를 하지 않는 관계로 Spring boot 도 지원을 멈추었다. 이제는 사용할 수 없으니 참고하면 되겠다.

Spring Loaded

Spring Loaded 프로젝트가 종료되면서 이제는 지원하지 않는다. 대신 devtools을 사용하는 것을 권장한다. 원래부터 devtools를 권장했던거 같은데.. 아예 지원을 안하니 만약 Loaded를 사용하는 사람은 devtools 바꾸자!

Dedicated Hazelcast auto-config for Caching

이건 무슨 말인지 모르겠다. 아무튼 spring.cache.hazelcast.config를 사용할 수 없다고 한다.

Default connection pool

기본적인 커넥션풀이 변경 되었다. 기존에는 tomcat의 기본적인 connection pool을 사용했으나 이제는 HikariCP로 변경되었다. spring.datasource.type를 사용해서 tomcat 기반의 어플리케이션을 강제로 HikariCP로 바꾸었다면 이제는 그 설정을 제거해도 된다.

Servlet Filters

Filter의 기본 DipatcherType은 REQUEST로 변경되었다.

Spring Security

Spring Security Filter는 ASYNC, ERROR, REQUEST로 변경 되었고 이것은 Spring Security의 기본 설정을 맞춘것이다.

Spring Session

Spring Session 또 한 마찬가지다. ASYNC, ERROR, REQUEST로 변경 되었다. 그리고 Spring Session 2.0 부터는 MongoGemFire가 제거되었다. 그래서 Spring boot도 Mongo Session을 제거하였다.

Jetty, Tomcat, Hibernate, Gradle 지원버전

jetty는 최소 9.4+ tomcat은 최소 8.5+ Hibernate는 최소 5.2+ Gradle은 최소 3.4+ 이상만 지원한다.

SendGrid

SendGrid 의 최소 버전은 3.2 버전이다. 해당 버전을 지원하기 위해 API키가 유일한 인증 수단이므로 username과 password는 삭제 되었다.

Starter transitive dependencies

기존에는 몇몇의 Spring boot starter를 디펜더시 받으면 spring-boot-starter-web까지 종속적이였던 부분이 많았지만 이제는 새로운 Spring WebFlux를 지원하면서 spring-boot-starter-mustache, spring-boot-starter-thymeleaf 는 더이상 starter-web에 의존하지 않는다. 이제는 spring-boot-starter-web 또는 spring-boot-starter-webflux를 선택하여 사용할 수 있지만 그것은 개발자의 몫이다.

Solr health indicator

Solr health 체크의 속성이 solrStatus 에서 status으로 변경 되었다. 그리고 상태값이 Status.UP 일때 OK로 정의 된 부분이 정수로 바뀌었다.

Default Proxying strategy

spring boot 이제 AOP 지원을 기본적으로 CGLIB 프로시를 이용한다. 만약 JDK 프록시를 필요할 경우에는 spring.aop.proxy-target-class를 false로 설정하면 된다.

@ConfigurationProperties

ignoreNestedProperties 속성이 제거 되었다.

Multipart configuration

서블릿 특성을 잘 살리기 위해 spring.http.multipart.에서 spring.servlet.multipart. 로 프로퍼티가 변경되었다.

Mustache templates default file extension

기본적으로 Mustache 템플릿의 기본 파일 확장자는 .html 에서 .mustache로 변경 되었다. 하지만 spring.mustache.suffix 프로퍼티로 변경 가능하다.

Spring Framework 5.0

Spring boot2.0은 스프링 프레임워크 5.0 기반으로 동작한다. 스프링 프레임워크 리액리브로 인해 많은 변경이 되었다. 그것은 해당 wiki를 참조하면 되겠다.

WebFlux and WebFlux.fn support

다들 알겠지만 Spring boot 2.0은 Reactive Spring 웹 프레임워크를 지원한다. spring-boot-starter-webflux는 기본적으로 Reactor Netty를 사용한다. (spring-boot-starter-reactor-netty) 그래서 기본적으로 netty로 서버를 띄운다.

Reactive data support

Spring boot 2.0은 몇몇의 reactive Data 자동 설정을 지원한다.

  1. MongoDB (spring-boot-starter-data-mongodb-reactive)

  2. Redis (spring-boot-starter-data-redis-reactive)

  3. Cassandra (spring-boot-starter-data-cassandra-reactive)

@WebFluxTest support

리액티브로 만든 Controller는 Spring MVC의 @WebMvcTest와 기능이 유사한 @WebFluxTest를 사용해서 테스트 할 수 있다. 특히 WebTestClient 는 자동으로 설정된다.

Gradle plugin

Spring boot 의 Gradle 플러그인이 많이 개선되었다. 자세한 내용은 API를 참고하면 되겠다. 필자는 현재 Gradle을 잘 쓰지않아서.. 아직..

Deprecations in Spring Boot 2.0.0 M1

spring.main.web-environment 프로퍼티가 deprecated 되었다. 그 대신 spring.main.web-application-type로 변경되었다. 아마도 reactive 추가 되어서 enum 타입으로 바꾼 듯 하다.

Milestone 2

Default connection pool

아까 위와 동일한 내용이다. Default connection pool이 Hikari로 변경 되었고 spring.datasource.type를 사용해서 변경 할 수 있다. 만약 tomcat을 사용하고 싶다면 아래와 같이 하면 된다.

spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

Status code for POST on /loggers

POST 로 날리는 /loggers의 리턴하는 상태코드가 200에서 204로 변경되었다.

Elasticsearch

Elasticsearch 가 5.4로 업그레이드 되었다.(드디어 나도 올릴때가 되었다..) 하지만 Elastic의 임베디드 Elasticsearch를 더이상 지원않아 자동설정을 제거 하였다. 그래서 spring.data.elasticsearch.cluster-nodes를 사용하여 하나 이상의 클러스터를 구성해야 한다.

Quartz Scheduler

Spring boot 2.0은 spring-boot-starter-quartz 전용의 starter를 사용할 수 있다. 인메모리와 jdbc 스토어를 모두 설정할 수 있다.

Spring Data Web configuration

Spring boot 2.0은 페이징 및 정렬을 쉽게 도와주도록 spring.data.web. 프로퍼티를 제공한다.

spring.data.web.pageable.default-page-size=
spring.data.web.pageable.page-parameter=
spring.data.web.pageable.size-parameter=
spring.data.web.sort.sort-parameter=

Json starter

새로운 spring-boot-starter-json가 추가 되었다. jackson-databind 뿐만아니라 java8에서 유용하게 사용할 수 있는 jackson-datatype-jdk8와 jackson-datatype-jsr310, jackson-module-parameter-names도 지원한다.

Thymeleaf starter

spring-boot-starter-thymeleaf 디펜더시시에 thymeleaf-extras-java8time도 포함 되어졌다.

InfluxDB

InfluxDB 자동설정을 지원한다. spring.influx.url를 통해 접속할 수 있고 spring.influx.user, spring.influx.password 프로퍼티로 인증도 할 수 있다.

JdbcTemplate

Spring boot 자동설정으로 JdbcTemplate을 네임스페이스로 통해 커스텀하게 만들 수 있다.

spring.jdbc.template.fetch-size=
spring.jdbc.template.max-rows=
spring.jdbc.template.query-timeout=

그리고 내부적으로 NamedParameterJdbcTemplate은 JdbcTemplate을 재사용한다.
spring 1.5

new NamedParameterJdbcTemplate(this.dataSource);

spring 2.0

new NamedParameterJdbcTemplate(jdbcTemplate);

jOOQ

Spring boot2.0 은 JPA dialect 비슷하게 DataSource에 기반하여 자동으로 JOOQ dialect 설정한다.
또한 JOOQ를 쉽게 테스트하기 위해 @JooqTest가 추가되었다.

@DataRedisTest

redis를 쉽게 테스트하기 위해서 @DataRedisTest가 추가 되었다.

Mongo client customizations

Mongo클라이언트의 정보를 커스텀하게 설정할 수 있도록 MongoClientSettingsBuilderCustomizer가 추가되었다.

Cassandra

spring.data.cassandra 의 pooling options이 추가 되었다.

spring.data.cassandra.pool.heartbeat-interval=
spring.data.cassandra.pool.idle-timeout=
spring.data.cassandra.pool.max-queue-size=
spring.data.cassandra.pool.pool-timeout=

Kafka listener types

배치 타입의 listener가 추가 되었다.

spring.kafka.listener.type=batch
spring.kafka.listener.type=single

오늘은 이상으로 Spring boot 2.0 M2의 변경 사항을 알아봤다. 몇가지 빠진게 있긴 한데 그건 필자가 이해 못했거나 자주 거의 사용해보지 않았던거라 잘 몰라서 남기지 못했다. Spring 의 reactive 때문에 많은 변화가 있었다. 대부분 거의 reactive로 인해 변경된 사항이 많았다. 일단 java8이상부터 된다니 그게 젤 맘에 들고 json starter도 히카리CP로 변경된 것도 나쁘지 않다. 아직 더 많은 변화가 있겠지만 차근차근 알아봐야 겠다. 혹시나 잘못 이해한 부분도 있을 수 있으니 해당 문서를 보는 것을 추천한다.