[Spring Boot] 2.1.0 릴리즈노트

참조
릴리즈노트: https://spring.io/blog/2018/10/30/spring-boot-2-1-0
기선님유트브영상:https://www.youtube.com/watch?v=DE95JaugOys

이번 주에 새로 스프링 부트 2.1.0이 떴다.
릴리즈 노트를 대충 살펴봤는데 첫눈에 들어오는 변화는 없었고 이름 변경등 소소한
변경인 것같아서 일단 나중에 충돌나면 찾아봐야지 했는데…
백기선님이 또 2.1 릴리즈 노트 읽는 영상을 올리셔서 보고 정리하려고 한다.

I. 새로 바뀐것들

1. 써드파티 업그레이드

  • Hibernate 5.3
  • Micrometer 1.1
  • Reactor Californium
  • Spring Data Lovelace
  • Spring Framework 5.1
  • Tomcat 9
  • Undertow 2

2. 성능 향상

  • 더 빨리 시작되고 적은 메모리를 소모하게 되었다.

3. Java 11 지원

스프링 부트가 사용하는 스프링프레임워크 5.1이 자바 11을 지원함에 따라서, 스프링부트 2.1도 자바 11을 지원하면서 자바8과 호환성도 그대로 유지된다.

4. DataSize 지원

스프링 부트 2.0의 ‘Duration’과 비슷한 맥락으로 데이터 사이즈나 크기를 표시할 필요가 있을때 org.springframework.util.unit.DataSize를 사용할 수 있다. Duration에서 시간의 단위를 ns부터해서 값+단위를 마음껏 표시하고 기록할 수 있었던 것 처럼 DataSize를 이용하면 용량의 값+단위를 마음껏 표시할 수 있다. (ex) 10MB

5. Actuator

Actuator 엔드포인트 2개가 더 추가 되었다.

  • /actuator/caches: 어플리케이션 CacheManager 의 정보 제공-상세-
  • /actuator/integrationgraph 스프링 내장 컴포넌트의 그래프 출력-상세-

health 엔드포인트는 개별 컴포넌트의 헬스 체크가 허용되도록 향상되었다.
예로 actuator/health/db는 오직”db” 헬스인디케이터만 실행한다.

6. Metrics

Micrometer 1.1로의 업그레이드 되면서 AppOptics, Humio, KariosDB에 대한 자동 설정이 추가 되었다. Metrics 커버레이지도 향상되서 다음도 포함하게 되었다.

  • Hibernate metrics
  • Spring Framework’s WebClient
  • Kafka consumer metrics
  • Log4j2 metrics
  • Jetty server thread pool metrics
  • Server-side Jersey HTTP request metrics

7. Context ApplicationConversionService Support

이제 ApplicationConversionService가 SpringApplication에 의해 만들어진 Environment 및 BeanFactory와 함께 디폴트로 등록이 된다. 이제 @Value 어노테이션등의 코어 스프링 항목에도 컨버터를 다이렉트로 사용할 수 있다.

1
2
@Value("${my.duration:10s}")
private Duration duration;

8. Profile Expression

스프링 프레임워크 5.1에서 향상된 expression format을 사용할 수 있다.

9. Task Execution

스프링 부트에서는 비동기 서비스를 사용할때 ‘@Async’를 붙이는데 이것만으로는 작동하지 않고 Configuration에서 @EnableAsync를 붙여야 ‘@Async’를 별도의 쓰레드 풀에서 실행을 해준다.
스프링 부트 2.1부터는 ‘ThreadPoolTaskExecutor’에 대한 자동설정을 제공한다. @EnableAsync를 사용하는 경우 이제는 spring.task.execution 네임스페이스에서 사용할 수 있는 커스터마이제이션을 사용할수 있기에, 사용자가 이전에 커스텀한 ‘TaskExecutor’를 지울 수 있다. 커스텀 ‘ThreadPoolTaskExecutor’은 ‘TaskExecutorBuilder’를 이용해서 쉽게 만들 수 있다.

한마디로 빌더로 커스텀익스큐터를 쉽게 만들 수 있다..라는 말임 ㅋㅋ

10. Task Scheduling

9번의 새로운 task 실행 지원과 마찬가지로 ‘@EnableScheduling’이 정의되었을때 스프링부트는 ThreadPoolTaskExecutor를 자동설정한다. 작업 스케줄러는 ‘spring.task.scheduling’ 네임스페이스를 사용하여 커스터미이징 할 수 있으며
‘TaskSchedulerBuilder’ 역시 기본적으로 가능하다.

9번맥락과 같음. 스케쥴러도 task executor사용하는 듯 빌더도 똑같이 존재.

백기선님: 9,10번 모두 스프링프레임워크에서 제공하는 기능이며
스피링부트는 이 기능에 대한 자동 설정을 제공하는 것입니다.

11. Logging Groups

로깅 그룹 설정이 가능핟.
그룹 설정후 그 구룹에 로그레벨을 주면 해당 그룹에 전부 그 로그레벨이 설정된다.

12. 메이븐 플러그인

시스템 프로퍼티, 그리고 Environment 변수에 대한 전용 옵션이 생기면서
아규먼트 지정이 향상되었다. 물론 classified 아티팩트를 사용해서
repackage,replace 가능하다.
업데이트된 classifier 속성 문서

또한 분류 된 이슈를 재 패키징 및 대체 할 수도 있습니다 (분류 자 속성의 업데이트 된 문서 참조).

13. Bootstrap mode for JPA setup

spring data에서 저장소(repositories)에 대한 “부트스트랩 모드”를 지원한다. JPA 저장소의 부트를 제어 할수 있는 속성을 스프링 부트가 보여주는데

참조: https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/config/BootstrapMode.html?is-external=true

spring.data.jpa.repositories.bootstrap-mode를 가지며 기본값은 “DEFAULT”다.

  • DEFAULT: 명시적으로 lazy 마킹된 것을 제외하고는 다른 빈처럼 열심히 인스턴스화.
  • DEFERRED : 저장소 빈은 lazy로 간주되며 클라이언트는 저장소 프록시를 주입받게 되며
    이 저장소 프록시는 첫번째 엑세스시 초기화된다.(런타임 초기화군)
  • LAZY: 저장소빈은 더더욱 lazy 되며 처음 사용시 초기화된다. 즉 저장소 초기화 없이
    어플리케이션이 완전히 시작되었을 수도 있다.

    백기선님: 어플리케이션 시작직후 jpa를 사용하게 되면 별차이 없을텐데요…

14. Kafka Streams Support

LinkedIn에서 주로 개발하고 사용해온 대용량 분산 메시징 시스템.
‘org.apache.kafka:kafka-stream’의존성이 정의되면 Kafka Stream의 자동 정의가
제공된다.

참조 : Spring Kafka Docs

15. Spring Data JDBC Support

스프링데이터는 JDBC에 대한 저장소를 지원하며 CrudRepository의 메소드에 대한 SQL을 자동으로 생성한다. 필요한 의존성이 클래스패스에 있는 경우 스프링 부트는 스프링데이터의 JDBC저장소를 자동설정한다. 스타터 의존성인 spring-boot-starter-data-jdbc한방으로 또 마법처럼 처리가 가능하다.

16. JMS ConnectionFactory Caching

자동 구성된 ConnectionFactory는 디폴트로 CachingConnectionFactory를 사용하여 캐시된다. pooling 옵션이 enabled되거나 spring.jms.cache.enabled가 false로 설정 될 때까지 캐시된다.

17. Elasticsearch REST Clients

Spring data로 Elasticsearch 5.x 버전 테스트가 안되었기 때문에,
최신 버전의 Elasticseach를 테스트 하기 위해서는 Jest 라이브러리를 사용해야 했다. (Jest는 Elasticseach의 Java HTTP Rest 클라이언트다.) 이제 JEST의 대안으로
RestClient, RestHighLevelClient의 자동 구성에 spring.elasticsearch.rest.* 네임 스페이스의 구성 가능한 옵션이 제공된다.

18. JUnit 5

모든 @…​Test에 ‘@ExtendWith(SpringExtension.class)’로 메타 어노테이트 된다. 따라서 JUnit5를 사용하고 있다면 중복 설치 부분을 제거 할 수 있다. 또한 스프링 부트는 JUnit5를 사용하기 위해 커스텀 설정이 필요없는 ‘maven-surefire-plugin’버전을 사용한다.

19. Security

OAuth2 WebFlux Support

WebFlux OAuth2 로그인에 대한 지원이 추가 되었다. OpenID 접속을 지원하는 프로바이더들은 URI를 ‘Issuer Identifier’로 대표하는 ‘issuer-uri’를 사용함으로써 더 쉽게 설정하기 쉬어졌다.

OAuth2 resource server support

‘spring-security-oauth2-resource-server’가 클래스패스에 존재하면, 스프링부트는 JWK-Set-URI가 지정된 한 OAuth2 Resource Server를 설정할 수 있습니다.

1
spring.security.oauth2.resource.jwt.jwk.set-uri=https://example.com/oauth2/default/v1/keys

MVC, WebFlux 모두 지원된다.

Non-web OAuth Applications

이제 어플리케이션 타입에 관계없이 자동 구성되는 ‘InMemoryReactiveClientRegistrationRepository’ 빈을 제공하기 때문에 비 웹 OAuth 어플리케이션을 작성하기 쉬어졌다. 내장 웹서버를 사용하지 않는 응용프로그램(CLI 어플리케이션같은)을 작성시 이제 구성설정된(configured) 등록저장소(registration repository)를 다이렉트로 사용할 수 있다.

II. 2.0에서 부터 바뀐점

1. 2.0의 Deprecation 삭제

스프링 부트 2.0에서 Deprecated 된 클래스,프로퍼티, 메소드들이 삭제되었다. 2.0까진 Deprecated로 어떻게든 사용은 가능했으나 이젠 무조건 코딩 바꿔야 업그레이드가 된다.

2. 빈 오버라이딩(충격!)

이제 기본적으로 빈 오버라이딩이 비활성화된다. 의도하지 않은 빈 오버라이딩을 방지하기 위해서라고 한다. 오버라이딩을 계속 쓰려면 spring.main.allow-bean-definition-overridingtrue해줘야 한다.

3. Actuator ‘info’, ‘health’ 엔드포인트 보안.

Security 설정 없이 spring-security가 클래스패스에 존재하면 일관성(consistency)을 위해 ‘/info’,’/health’가 public으로 노출된다. 이 경우 이제는 명시적으로 secure해줘야한다.

4. Servlet Path

‘server.servlet.path property’ –> ‘spring.mvc.servlet.path’ 로 바뀜

5. 로깅 상세

Spring Framework 5.1은 ‘Spring Mvc’나 ‘WebFlux’등의 웹 응용 프로그램이 돌아가는 동안 로깅 출력을 개선한다… 만약 디버그 모드로 하려거나 스프링 부트 2.0 스타일의 로깅으로 돌아가고 싶다면 application.properties에

1
logging.level.web=debug

실제 request 상세를 볼려면 spring.http.log-request-details도 ‘true’한다. 기본적으로는 민감한 정보 노출을 막기 위해 false되어 있다. set하고 로그를 보면 request와 response정보 그리고 http응답까지 찍혀있다.(걸린시간은 안찍힌다.)

6. Narayana JTA 지원

Narayana지원이 제거 되었다.
Narayana는 JTA 구현 오픈 소스인데 Narayana 릴리즈와 맞는 공식 지원을 위해서 제거 되었다고 한다. 지금까지 spring-boot-starter-jta-narayana를 사용해왔다면 이 밑의 세팅으로 새로운 코디네이터를 사용하도록 하자.

1
2
3
4
5
<dependency>
<groupId>me.snowdrop</groupId>
<artifactId>narayana-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>

상세참조 : https://github.com/snowdrop/narayana-spring-boot

7. ActiveMQ Pooling

‘activemq-pool’지원이 제거 되었다.
JMS2.0 준수시 pooled-jms가 동일한 기능을 지원하기 떄문.
‘activemq-pool’를 사용했다면 이제는 밑처럼 해서 업데이트해야한다.

1
2
3
4
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
</dependency>

8. HttpPutFormContentFilter

FormContentFilter를 위해서 ‘HttpPutFormContentFilter’ 가 Deprecated 됨
따라서 ‘spring.mvc.formcontent.putfilter.enabled’프로퍼티는 더이상 정의되지 않으며 만약 기능을 유지하고 싶으면 ‘spring.mvc.formcontent.filter.enabled’로 업데이트해야한다.

9. OAuth2 Client Configuration

‘spring.security.oauth2.client.registration’의 구조가 재작성됨
원래는 ‘authorizationcode’,’clientcredentials’ 서브네임스페이스였으나
싱글 트리로 재작성되었다.

10.Micrometer ‘all’ SLA Handling

‘management.metrics.distribution.sla’ 의 설명에서 잘못설명 된 것이 있음
“모든 Meter ID가 모든 Metircs에 대해 SLA를 설정하는데 사용 될 수 있다”라고 설명했는데 잘못된 설명임. 단위가 meter type에 따라 다를 수 있기 때문에 이 기능은 구현될수 없다.

11. InfluxDB HttpClient Customization

InfluxDB에서 사용되는 클라이언트를 커스터마이징할때
이전에는 ‘OkHttpClient.Builder’빈을 선언하면 충분했다.
이런 커스터마이징들끼리 확실히 분리되도록 위에 방법 대신에 이제는 InfluxDbOkHttpClientBuilderProvider 빈을 사용하라.

12. Maven Plugin

표준 메이븐 플러그인의 동작에 맞도록 ‘finalName’프로퍼티를 더이상 커스터마이징 할 수 없다. 만약 repackage goal을 커스터마이징 하려 한다면 메인 execution은 필히 명시되어야하는 ‘repackage’에 대한 id를 가지게 된다.

13. Spring Version POM Property

POM의 ‘spring-boot-dependencies’안에 정의되었던 ‘spring.version’의 이름이
spring-framework.version로 바뀜.
사실상 쓸일이 없는게 그냥 스프링 부트 버전 쓰는 이유중 하나가 써드 파티 버전 걱정 안하려고 쓰는건데 왜 굳이 사서 고생을 하겠음.

14. Removal of ‘spring.provides’ Files

starter는 ‘META-INF/spring.provides’를 정의 할 수 있고, IDE는 어떤 의존성이 제공되는지 파악할 수 있었다. starter POM을 스캐닝 함으로써 POM이 변경시 의존성 반영하는 방법이 사실 충분하므로 제거해도 된다.

15. Thymeleaf Spring Security Extras

Thymeleaf

  • 타임리프
  • 텍스트, HTML, XML, Javascript, CSS 생성할 수 있는 템플릿 엔진.
  • 순수 HTML로 템플릿을 작성할 수 있음
  • Spring Boot에서 사용이 권장되고 있다.
    (Spring Boot에서는 JSP를 추천하지 않는다.)

‘thymeleaf-extras-springsecurity4’에서
‘thymeleaf-extras-springsecurity5’로 이름이 바뀌었다.
Thymeleaf의 자동 설정과 의존성을 맡는 스프링 시큐리티 엑스트라 모듈이다.
해당 모듈을 쓰고 있다면 4->5로 바꾸도록

16. Json Simple

‘json-simple’ 의존성은 더이상 제공되지 않으며 구현체인 ‘JsonParser’도 제거 됨.

Jackson JSON을 쓰라는 이야기 같다.

17. Jersey 1

Jersey 1을 더이상 지원하지 않으며 Jersey 2로 업그레이드 해야한다.

18. Hibernate EhCache Support

만약 EhCache 2를 하이버네이트의 2nd 레벨 캐쉬 사용자로 사용하기 위해 hibernate-ehcache를 사용 중이었다면 하이버 네이트 5.3에서 Deprecated.

19. Endpoint ID names

자신만의 엔드포인트를 개발했다면 스프링 부트2.1부터 도입된 더 엄격한 명명 규칙을 따라야한다. 엔드포인트를 안만들었으면 관련없음

20. Lombok

스프링부트 2.1은 롬복을 1.16.x에서 1.18.x로 업그레이드 하였다. 1.18에서부터 롬복은 더이상 아규먼트 없는 개인 생성자를 디폴트로 생성하지 않는다. 원한다면 ‘lombok.config’에 ‘lombok.noArgsConstructor.extraPrivate=true’을 설정한다.
자세한것은 롬복사이트가서 changelog를 살펴볼것.

기선님: 저 생성자를 만드는 이유는 보통 new를 못쓰게 하고
factory를 통해서만 객체생성을 허락할때 사용한다.
이것은 자바 빈의 규약 에 맞지 않는다.

일단 1차 정리

Related POST

공유하기