허원철의 개발 블로그

Java And Spring forward! 2017 세미나 - 후기 본문

conference

Java And Spring forward! 2017 세미나 - 후기

허원철 2017. 11. 26. 21:01

이번 글을 Java And Spring forward!을 다녀온 후기를 남기는 글 입니다.



최근 Java 9와 Spring 5가 정식 릴리즈가 되면서 그에 대한 세미나가 생겨 참여하게 되었습니다. 앞서 말했듯이 Java 5와 Spring 5에 대한 내용을 주로 다루게 되는 세미나였는데요. Java Champion이신 양수열님과 Pivotal에서 정윤진님를 비롯해 네이버에서 정상혁님과 이명현님께서 스피커로 진행해주셨습니다.


세미나 전반적으로는 새로운 릴리즈되어 나온 기능들을 소개하기 위한 내용이다보니 스펙 위주로 진행되었습니다. 아쉽게도 참여를 하지 못한 분들은 3개월 안에(?) KSUG-유투브채널에 공개된다고 하니 Java 9와 Spring 5가 궁금하시다면 보시면 좋을 것 같습니다.



Java 9 new feature


주요기능

- Jigsaw: Java 9부터 모듈시스템 개념이 추가됩니다. (패키지 상위 개념?)

- Cloud 환경에서 Java언어로 만들어진 애플리케이션 타 언어에 비해 무거웠던 것을 보다 개선해 나가기 위한 과정입니다.

- 이로 인해 필요한 모듈만 가져옴으로써 보다 경량화된 모듈 시스템이 가능해집니다.

- Jlink: JVM 배포판을 만들 수있는 유틸성 도구입니다.

- 필요한 모듈만 가져와 사용할 수 있습니다. 

- 버전 관리에 대한 가시성이 가능해집니다. ( --listmods )

- Multi Release Jar: 특정 버전에 맞춰 해당 버전에 맞게 원하는 클래스가 동작할 수 있습니다.

- 하위 버전에 대한 고려가 된 개념이라고 볼 수 있습니다. ( Module, Package )

- JShell: REPL을 지원 해주는 도구입니다.

- Concurrency에 대한 기능 개선 되었습니다.

- Deprecation에 대한 옵션 추가 되었습니다. ( forRemoval, since 등 )

- JVM

- 디폴트 GC가 G1로 변경되었습니다.

- String: Compact String 개념이 추가되면서 성능이 개선되었습니다. ( +XX:-CompactStrings )

- logging

- JVM상에서 로그를 핸들링할 수 있게 됩니다.

- GC logging 성능 상승

- 기타

- JDK/JRE 구조가 변경되었습니다. 이는 모듈시스템을 적용되면서 변경된 사항인데요. 아마 기존 라이브러리와 프레임워크 때문에 쉽사리 Java 9으로 버전을 올리는 것은 아직은 어려운 상황인 것 같습니다.

- 사라진 것들

- SHA-1에 대한 취약점이 발견되면서 기존 SHA-1는 거둬낸 상황이고, SHA-3으로 변경되었다고 합니다.

- 브라우저 이슈로 인해 액티브X가 없어지고 있는 것처럼, Applet 또한 거둬냈다고 합니다.



HTTP/2세대의 JAVA


- 2015년 5월 RRC 7240 스펙이 공표되었습니다.

- 전송 방식의 변경이 크게 대두되고 있습니다.

- 기존에는 text protocol, HTTP/2에는 Binary protocol입니다.

- 지속적인 연결을 하면서, 기존에 HTTP/1.1에서 keep-alive는 무시하게 됩니다.

- 헤더에 대한 표기가 약간 변경되었습니다. (기존에는 첫글자가 대문자, 이후에는 소문자)

- 용어 정리

- h2: 웹 브라우저와 서버 통신 ( with TLS )

- h2c: 서버 간 통신 ( without TLS )

- ALPN: TLS 확장. h2 필수

- HTTP/2가 필요한 이유

- 헤더가 압축됩니다.

- 여러 요청을 한번에 처리 가능합니다. => 정적 리소스를 합치지 않아도 된다.

- Server Push: 관련 자원을 같이 넘겨줄 수 있습니다. => 개발자도구 - Network에서 계단식 그래프를 안 볼 수 있다.

=> 결국에는 보다 빨라집니다.


- 그래서 Java에서는?

- Server Push:  Tomcat9( Servlet 4.0 ), Jetty 10에서 지원합니다.

- Java 9에서 HTTP/2지원 하는 별도의 클래스 추가되었습니다. ( HttpClient )

- ALPN 지원 ( Java 7,8에서는 jetty-alpn-agent )


- H1.1에서 H2로 변경해보는 과정

- 1~2줄 변경하면 될 줄 알았지만, 현실은 아니였다고 하네요...

- 아직 H2를 제대로 지원하는 웹 서버나 통신 라이브러리가 없는 것 같습니다.

- OkHTTP가 그나마 H2통신을 지원하지만 H2C를 지원하지 않는다고 합니다.

- Proxy용도로 아직까지는 HAProxy가 H2를 지원합니다.



JPA 2.2와 JSON-B, JSON-P


- JPA 2.2

- @Repeatable

- 기존에 무의미하던 @NameQueries같은 것을 사용하지 않아도 @NameQuery를 여러번 사용할 수 있다.

- Date관련 API 지원하게 됩니다. 

- 현재 상황으로는 아직 ZonedDateTime은 지원이 안된다고 하네요. ( 단, Hibernate 5.2에서는 지원합니다. )

- Stream API 지원합니다.

- 기존 Hibernate는 Stream를 만들어주는 반면에 하위 호환성을 위해(?) 콜랙션을 stream으로 변형하는 형태라고 하는데요. 아마 Hibernate가 JPA 2.2 스펙을 가져온다면.. 해당 메소드를 재정의해서 사용할 것이라는 예상이 있습니다.

- CDI

- Spring Bean처럼 만들어주는 것은 아니지만, injection이 가능해집니다.

- @PostConstruct, @PreDestory를 지원합니다.


- JSON-B, JSON-P

- Java 진영에서 JSON에 대한 표준 스펙이 정해졌습니다.

- 흔히 사용하는 jackson으로 예를 들 수 있습니다.

- jackson-databind는 JSON-B가 됩니다.

- jackson-core는 JSON-P가 됩니다.

- 시리얼라이즈와 디시리얼라이즈 과정이 전반적으로 비슷합니다.

- 나머지는 .. 스펙 확인바랍니다... ( http://json-b.net/ )

- Spring Boot는 2.x 버전 대에서는 JSON-B와 JSON-P를 다 구현한 Johnzon을 사용합니다. ( 이슈 참고 - https://github.com/spring-projects/spring-boot/pull/9648 )



Spring 5 new feature


- 엔터프라이즈급 애플리케이션에 적용하기에 너무 방대하고 어렵다..? ( 하위 호환성, PSA에 대한 결과..?)

- MSA를 해야합니다. ( YouTube - 혼돈의제왕, YouTube- Bootiful Microservice, 책 - Release it! )

- 가장 대두되는 것은 JDK9, HTTP/2, Reative입니다.

- Server Push는 지원합니다. 

- JSON-B, JSON-P를 지원합니다.

- Java 8, 9 스펙을 지원합니다. ( 람다, 애노테이션 등 )

- XML Bean 설정이 개선됩니다. ( 버전을 명시 하지 않아도 알아서 맞춰줍니다. )

- spring-jcl가 logging 라이브러리를 auto decting 해줍니다.

- component scan에 대해서 @Indexed 개념(인덱스 설정)이 추가되면서 보단 빠른 로딩을 할 수 있습니다. ( spring-context-indexer )

- Funtional Bean을 지원합니다. ( 리플렉션과 CGLIB가 필요없어집니다. )

- 코틀린을 적용하면서 null safety한 환경이 가능케 합니다. ( @Nullable )

- HTTP/2 적용 시, Tomcat 9.0, Jetty 9.3, Undertow 1.4 이상을 사용해야 합니다.

- 파일 업로드 시, 용량 초과에 대한 에러 처리가 추가 되었습니다. ( MaxUploadSizeExceededException )

- exception을 던지면서 바로 상태 코드와 메시지를 보낼 수 있습니다. 

- throw new ResponseStatusException

- exceptionHandler와 controllerAdvice는...?

- WebClient로 비동기 통신 지원합니다. ( AsyncRestTemplate는 사라졌습니다. )

- Spring Boot 2.0 GA는 2018년 초에 릴리즈될 예정입니다.

- Spring Cloud Gateway는 Netflix의 Zuul이 아닌 자체적으로 개발하여 적용될 예정입니다.

http://spring-calendar.cfapps.io/에서 스프링관련 일정 확인이 가능합니다.


'conference' 카테고리의 다른 글

Oracle Code Seoul - 2017  (402) 2017.08.30
Naver Hack Day 2017  (418) 2017.05.26
Spring Camp 2017 - 후기  (397) 2017.04.23
GDG WebTech - AMP, PWA  (394) 2017.02.27
GDG DevFest Seoul 2016  (432) 2016.12.05
Comments