미국 워싱턴 D.C에서 9/24 ~ 9//27까지 개최된 SpringOne Platform 2018 발표 자료가 유튜브에 공개되었다.
2019년엔 텍사스에서 진행될 예정이라고 한다. (2017년엔 샌프란시스코)
현재까지 178개 정도 등록되어 있다.
향후 5년간의 Java SE Lifecycle
- java 8, 11, 17이 LTS 버전
- 현재 11이 정식 릴리즈 된 상태
- 8은 2022+ 까지 상업적 지원
11은 2023+ 까지 상업적 지원
(+는 해당 연도 이후 extended commercial support 의미) - 17는 2021년 9월 릴리즈 예정이며 그 전 12 ~ 16 버전은 반년마다 릴리즈 예정
Spring Framework Release Matrix
|
GA |
Java 8 |
Java 9 |
Java 10 |
Java 11 |
Java 12 |
EOL |
SPR 4.3 |
2016년 6월 |
X |
- |
- |
- |
- |
2020년 6월 |
SPR 5.0 |
2017년 9월 |
X |
X |
X |
- |
- |
2019년 5월 |
SPR 5.1 |
2018년 9월 |
X |
X |
X |
X |
- |
2019년 12월 |
SPR 5.2 |
2019년 6월 |
X |
X |
X |
X |
X |
|
GraalVm도 지원 예정이고 5.2에서는 Kotlin 1.3 지원예정
Spring-Data-Jpa를 사용하기 위한 Spring-JDBC가 아님.
spring-data-jdbc가 새로 나왔음.
orm이 아니라는 점을 강조.
- @ID가 필요
- getter/setter 가 필요하지 않음
Jpa의 복잡성을 대체하기 위한 대안
- No Lazy Loading
- No Caching
- No Proxies
- No deferred flushing
- very simple & limited & opinionated ORM
테이블간 관계가 N:N인 경우 매핑 테이블을 설정하는 코드를 소개했는데 따로 공부해야 이해가 될 것 같다.
auditing은 spring-data-jpa와 동일해보임
event는 spring-data-rest의 event와 동일해보임
mybatis와 통합도 지원한다고 하는데 이것도 코드를 봐야 이해가 될 것 같다.
추후 지원될 기능들 (Maybe)
- Derived Queries
- Sorting and Paging
- Named Queries with MyBatis
- Named Queries via Properties
리액티브도 아직 미지원. ADBA, AoJ (ADBA Over JDBC), R2DBC 상황을 지켜봐야 할 듯
1.x와 2.x의 변경된 properties 설정을 확인할 수 있도록 spring-boot-properties-migrator 를 제공함
해당 dependency를 추가하고 실행하면 로그에 변경되지 않은 properties를 확인할 수 있음
webflux를 사용하면 WebSecurityConfigurerAdapter를 SecurityWebFilterChain으로 변경해줘야함
micrometer 사용 소개
설정 방법
- micrometer-registry-prometheus dependency 추가
- SecurityWebFilterChain에 "prometheus" endpoint 노출 설정을 추가
- management.metrics.distribution.percentiles-histogram.http.server.requests=true
management.metrics.distribution.sla.http.server.requests=1ms, 5ms
grafana에서 확인할 수 있음 (관련 설정에 대해서는 보여주지 않음)
Spring Boot 2.0 Migration Guide 참고
SlideShare 자료
JDK 9: Big And Small Changes
Java Platform Module System (JPMS)
- module 로 라이브러리가 구성됨 (JEP 220)
- 75 OpenJDK 모듈: 27 Java SE, 48 JDK
- OracleJDK: 14 additional JDK, 8 Java FX, 2 Oracle specific
- 대부분의 내부 API가 캡슐화 (JEP 260)
- sun.misc.Unsafe
- commond line 옵션을 사용할 수 있는 경우도 있음
jlink: The Java Linker (JEP 282)
모듈러 런타임 이미지를 만들 수 있음
Java Platform Development
릴리즈 개발 소요 시간
- JDK 6 : JDK 5 이후 2년 2개월
- JDK 7 : JDK 6 이후 4년 8개월
- JDK 8 : JDK 7 이후 2년 8개월
- JDK 9 : JDK 8 이후 3년 6개월
새 버전으로 마이그레이션 시간
- JDK 6 : 2년 11개월
- JDK 7 : 1년 9개월
- JDK 8 : 1년 1개월
이후 반년마다 새 버전을 릴리즈할 계획임.
Long Term Support Releases
JDK 10, JDK 11 이 현재 릴리즈 된 상태
3년 주기로 Long Term Support release (LTS) 예정
LTS 버전은 JDK 8, JDK 11
JDK Binary
전통적인 오라클 브랜드 바이너리 (java.oracle.com)
- oracle binary code License (FoU 제한)
신규 OpenJDK 바이너리 (jdk.java.net)
- GPLv2 with CPE license
- 보안과 버그 수정은 다음 JDK 릴리즈에 반영
- 이전 버전과 병행으로 업데이트 하지 않을 것
Converged Binaries
JDK 10 이전 OracleJDK > OpenJDK > Java SE
JDK 11 이후 OpenJDK & OracleJDK > Java SE
JDK 11 이후 일부 비공개 소스가 오픈 소스로 전환 예정
- Flight recorder
- Mission control
- Others
일부 비공개 소스는 제거 예정
- Browser Plugin
- Java Web Start
- JavaFX
JDK 9는 변화의 시작점
The Clean Up Starts
- Deprecated API를 제거하기 시작
- 6개 method와 1개 class
- JDK 10 은 1개 package, 6개 class, 9 method와 1개 field
- 중복 기능이 제거됨
- 중요한 command line 변경
- JDK 9는 187개의 -XX flag가 삭제
- JDK 10 은 37개의 -XX flag가 삭제
이는 JDK 11에서도 계속될 예정
- Applets, Browser Plugin, Web Start, JavaFX
- java.se.ee meta-module
- java.corba
- java.transaction
- java.activation
- java.xml.bind
- java.xml.ws
- java.xml.ws.annotation
- 그 이후에는?
- Nashorn 제거 예정
- CMS garbage collector?
호환성을 보장하지 않음
JDK 10
JEP 286 : Local Variable Type Interface
var list = new ArrayList<String>(); 와 같이 var 사용 가능
JEP 307 : Parallel Full GC for G1
Still a full GC with potentially big pauses
JEP 310 : Application Class-Data Sharing
이전 상용 오라클 기능
JEP 317 : Experimental Java-based JIT compiler (Graal)
JEP 319 : Root Certificates
기본 루트 CA 인증서 set
JEP 296 : Consolidate JDK forests into single repo
8개 repo를 1개로
JEP 316 : Heap allocation on alternative devices (Intel)
JEP 313 : Remove javah tool
javac로 동일한 기능을 제공
JEP 304 : Garbage Collector Interface (Red Hat)
새 알고리즘을 쉽게 추가할 수 있게 함
JEP 312 : Thread-Local Handshakes
전역 VM safepoint를 수행하지 않고 Thread에서 콜백을 실행
73 new apis
com.sun.security.auth package 제거 (6개 class)
java.lang.SecurityManager 제거 (1개 field, 7개 method)
Docker container에서 JVM관련 지원
JDK 11
17 JEPs
3개의 Oracle 기능이 공개
- JEP 318 : Epsilon garbage collector (Red Hat)
- JEP 315 : Improve Aarch64 intrinsics (Red Hat)
- JEP 331 : Low overhead heap profiling (Google)
JEP 309 : Dynamic Class-file constants
invokedynamic와 비슷하지만 class-file contants
컴파일 시점이 아닌 런타임 시점에 사용되는 bootstrap method
컴파일러와 language 개발자에게 유용
JEP 328 : Flight Recorder
OpenJDK와 Oracle JDK를 정렬하는 마지막 부분
JEP 320 : Remove CORBA and Java EE modules
JEP 321 : HTTP client
HTTP/2 지원
JEP 323 : Local variable syntax for Lambda parameters
JEP 286을 확장
(var x, var y) -> x.process(y)
JEP 324 : Key Agreement with Curve25519 and Curve448
기존 ECDH 보다 효율적이고 안전함
JEP 327 : Unicode 10
8,518 new characters
Bitcoin symbol, Nishu, Soyombo, Zanabazar Square
이모지 사용 가능
Longer Term JDK 특징
OpenJDK Projects
Amber
구문 단순화
JEP 286 : Local Variable Type Interface
JDK 10에서 제공
JEP 323 : Local variable syntax for Lambda parameters
JDK 11에서 제공
JEP 302 : Lambda leftovers
사용하지 않는 parameter들에 대해 _ 처리
JEP 326 : Raw string literals (JDK 12)
요거 되면 매우 편해질 듯.
' 로 문자열 블록을 지정, 여러 라인에 대해서도 범위 사용이 가능해질 예정
JEP 305 : Pattern Matching
switch 구믄을 사용하면서 타입 체크 시 해당 타입으로 선언하여 전달하여 캐스팅 처리 생략
JEP 325 : Switch Expressions (JDK 12)
Valhalla
value type과 generics 진화
java 는 primitive 타입이 있고 Object 타입이 있다.
문제는 primitive 타입을 ArrayList<int> 와 같이 사용하지 못하기 떄문에 boxing, unboxing 단계가 들어가게 된다.
이런 문제를 해결하기 위한 프로젝트임
Loom
병행 프로그램을 좀더 간단하게 하기 위함
Thread는 너무 무거움
fiber를 제시
JVM 레벨의 thread
JVM에 연속성을 추가
ForkJoinPool scheduler 사용
Thread보다 가볍고 메모리를 적가 먹음
작업을 switching하는데 드는 비용이 0에 수렴함
Metropolis
The JVM re-written in Java
Run Java on Java
Graal 컴파일러 프로젝트를 중요한 입력으로 사용 (이건 무슨 말인지 이해를 못하겠음)
새로운 플랫폼으로 포팅이 쉬워짐
프론트 엔드에서 더욱 빨라진 새 기능
성능은 개선되어야 할 문제
Panama
JNI에 대해 FFI로 교체
배치 고도화 관련 내용. async task 소개