grep

Engineering

우리팀이 JDK 17을 도입한 이유

김동기Jayden(제이든)/개발3팀여기어때

2022년 7월 11일

원문에서 보기 ↗

안녕하세요, T플랫폼개발실 개발3팀 제이든입니다. ✋

제가 속해있는 개발3팀은 망고플레이트 서비스와 여기어때 통합리뷰 시스템의 개발/서비스 운영을 맡고 있습니다. 😀

이번 포스팅에서는 저희팀에서 Java 17 버전을 도입하게 된 이유와 개발자 입장에서 주요하다 생각되는 업데이트 내용 및 사용사례를 소개드리려 합니다.

Java 17 Version

2021년 9월 새로 공개한 LTS(Long-Term Support) 버전으로, Oracle JDK 기준 2029년 9월까지 지원합니다.

Java 11과 비교하여 70가지 이상의 JEP가 더 추가 되었습니다.

출처: Oracle Java

JDK 버전별 점유율

JetBrains에서 발표한 조사(위 링크)를 보면 Java언어를 이용하는 개발자분들께서 주로 사용하는 버전은 JDK 8입니다.

왜 JDK 8을 사용할까?

JDK 8은 2014년 등장한 다소 오래된 Java 버전입니다. 그렇지만 위에서 보신 바와 같이 국내/외에서 현재까지 많이 사용되는 버전이기도 합니다. 그렇다면 왜 많은 분들이 다른 버전도 아닌 JDK 8을 사용하고 계실까요?

그 이유는 다음과 같다고 생각합니다.

1. 발표된 LTS 버전 중 가장 오랜 Support을 보장

Oracle 지원 로드맵

2. 기존 서비스와의 호환

그렇다면 우리는 왜 JDK 17을 사용할까?

이제 아래에서 JDK 17의 업데이트 된 기능들을 소개드리며, 저희가 어떤 신규 기능에 매료되어 17버전을 선택하게 되었는지 설명 드리겠습니다. 그 전에, 다른 이유를 짧게 말씀드릴까 합니다.

1. Java Support 기간이 길다.

2. 신규 버전을 위한 대비

3. 다음 세대 플랫폼 호환 준비

또한, 저희팀은 기존 서비스에는 없었던 신규 시스템 개발을 착수하는 시점이라 기존 시스템과 연관관계가 복잡하지 않은 상황이었습니다. 그리하여 저희는 선택의 폭을 넓혀 사용할 기술을 결정할 수 있었습니다.

JDK 17 까지의 주요 업데이트

https://gist.github.com/kdkrkwhr/0556f074d124325cd1330b4338a30116

JDK 9부터 JDK 17까지 추가 및 변경 된 업데이트 내용 중 개발자가 관심 가질 항목을 리스트업 해 봤습니다.

JDK 9부터 11까지의 주요 업데이트

New Garbage Collector, ZGC 추가

JDK 11부터 공개되었고, “Stop-The-World”로 인한 성능저하를 개선하기 위한 목적을 가지고 Oracle에서 개발하였습니다.

ZGC 동작 원리 (Wiki, GitHub)

특징

적용 방법

java -XX:+UseZGC -jar Application.java

Collection Factory Method 강화

Set, List, Map 인터페이스에 Immutable 생성할 수 있는 새로운 메서드가 추가 되었습니다.

변경 전

https://gist.github.com/kdkrkwhr/228d6e3ab6180974780c60edc2decacb

변경 후

https://gist.github.com/kdkrkwhr/b2599e6abccc7a11fc671a284ecb8919

기존보다 깔끔한 코드스타일을 가져갈 수 있고, Collection 초기화 값을 세팅하여 사용 가능합니다.

또한 본 개념대로라면 Immutable 속성을 가지고 있기에 데이터 변경 작업이 어렵지만 데이터의 추가, 수정, 삭제 작업이 필요할 경우, 아래와 같이 진행할 수 있습니다.

https://gist.github.com/kdkrkwhr/f9fa172a402f99e23f02fae3358478ac

Reactive Stream

Non-Blocking Backpressure를 이용한 비동기 스트림 처리의 표준 제공이 목적인 기능으로, 기존 “Observer Pattern”에서 극복이 어려웠던 “C10K” 문제 해결을 위하여 “Subscription”이라는 중계 브로커가 추가된 패턴 방식 입니다.

(Reactive Stream reference)

또한 이러한 Reactive Stream은 WebFlux와도 연관이 있습니다.

(Spring Webflux 가이드)

Reactive 프로그래밍을 지원하는 String WebFlux는 Spring 5에 포함되어 있습니다. Project Reactor와 Publisher 구현을 위해 “Flux/Mno” 클래스를 사용합니다.

아래에 간단한 Reactive Stream 예제를 구현해보았습니다.

  1. Reactive Stream 라이브러리

https://gist.github.com/kdkrkwhr/1bdf56f515913f05716dbc6406d71767

  1. 인터페이스 구현

[Publisher]

https://gist.github.com/kdkrkwhr/c2bce0b49c72da226cf1254f9853b3e4

[Subscriber]

https://gist.github.com/kdkrkwhr/7b2e8678109d94d54bfdc43845155bf5

로컬 변수 타입 추론 “var”

로컬 변수 선언 시, “타입 추론”을 이용하여 명시적 타입 선언 없이도 변수 선언이 가능하도록 지원하는 신규 Keyword입니다.

기존 Lombok Library에서 지원하던 기능이었으나, JDK 10 버전에 등장하며Java에서 공식 지원하였습니다. 이후 LTS 버전인 JDK 11부터는 람다 타입에서도 사용 가능하도록 지원하고 있습니다.

컴파일 시 변수 타입을 추론하기 때문에 성능에 영향을 주지는 않습니다. 그러나 가독성 높은 코드 작성을 위해 무분별한 “var” Keyword 이용은 지양하는 것이 좋겠습니다.

제약

https://gist.github.com/kdkrkwhr/7360eaf4847ccece3ff86c3be5c1e248

신규 문자열 Method 추가

문자열 내 공백 확인/제거 등 JDK 11 버전부터 String에 여러 편리한 기능을 지원하는 새로운 Method들이 추가 되었습니다.

아래에 간단한 예시를 준비했습니다.

https://gist.github.com/kdkrkwhr/bd3839e2aff75cf11743c8da77d988fa

JDK 12부터 17까지의 주요 업데이트

텍스트 블록

JDK 15부터 정식 지원하는 새로운 기능입니다.

“”” {String 문자열 } “”” 형식을 이용해 Java 문자열을 보다 가독성있게 작성하도록 도와줍니다.

https://gist.github.com/kdkrkwhr/3d4bdb9364e26fa9c89bab58682d7ca5

현재 저희팀에서 TextBlock을 적용한 예시 입니다.

Switch 표현식 기능 향상

다소 늦은 업데이트라는 느낌이 있으나 Switch 표현식 기능이 업데이트 되었습니다. (람다식 지원 등)

1. Switch문 값 직접 반환

2. yield 예약어 이용한 값 리턴 방식 추가.

3. Case문 람다식 지원.

위 세가지 기능이 추가가 되었고, 아래는 실제 적용해 본 테스트 코드입니다.

https://gist.github.com/kdkrkwhr/fa8d71e8d9a503c0f1ebd18f241fca6a

Record Data Class 추가

Record Data Class란, JDK 14 버전부터 공개된 Immutable 객체를 생성하는 새로운 유형의 클래스입니다.

아래는 Record Class 구현/실행 예제입니다.

https://gist.github.com/kdkrkwhr/047941131bfafbabed4d82c13b42229a

마무리 ,,,

이상으로 Java 17 업데이트 적용과 관련된 포스팅을 마치겠습니다. 😊

끝까지 읽어주셔서 감사합니다.

다음엔 좀 더 숙달 된 필력과 함께 좋은 내용으로 찾아뵙겠습니다.

To be continued … 😶‍🌫️