2022-12-30,   김수민

이번 포스팅에서는 OpenJDK의 8버전과 17버전에 대해 17까지 진행하면서 어떤 기술들이 추가되었는지 간략하게 알아보도록 하겠습니다.


OpenJDK

OpenJDK는 Java SE Platform Edition의 무료 오픈소스 구현체 입니다.

Java SE(Java Standard Edition : Java의 표준 문법)의 공식 레퍼런스를 구현했기 때문에 Oracle JDK와 큰 차이가 있지는 않습니다.

다만, 6개월마다 새로운 버전을 릴리즈하고, 약 3년에 한 번씩 LTS버전을 릴리즈 합니다.

OpenJDK 8 / 17 개요

이번에 비교할 OpenJDK 8버전은 2014년에 발표된 버전으로, 국내/외에서 현재까지 가장 많은 곳에서 사용되고 있는 버전입니다.

Oracle에서 가장 오랜 기간 지원될 버전이며, 이미 기존에 많은 프로젝트들이 사용해 운영중이기에, 한동안 연관된 프로젝트 역시 안정적 운영을 위해 버전을 유지할 가능성이 높습니다.

또한 32비트를 지원하는 마지막 공식 Java 버전이라고 할 수 있습니다.

17버전은 2021년에 발표된 가장 최신의 LTS 버전입니다.

지원 기간의 경우 OpenJDK8의 지원기간이 더 길지만 현재까지 나온 버전 중 가장 비슷한 시기까지 서비스를 제공하는 것으로 보입니다.

따라서 다음 LTS버전인 OpenJDK21의 도입이 필요한 시기가 올 때, 버전 이동에서의 부담이 8버전은 적게 들 수 있습니다.

또한 가장 크게 생각해봐야할 점은 Spring Boot 3.0부터는 JDK 17이상을 지원하기 때문에, Spring의 호환에 대비가 필요할 경우 버전의 전환이 필수적일 수 있습니다.

image


상세 비교

그렇다면 JDK 9버전부터 17버전에 이르기까지 변화된 주요 기술들에 대해 알아보겠습니다.

물론 각 버전 별로 다양한 특징들이 있으나, 모두 기술하기에는 무리가 있어 일부에 대해서만 알아보겠습니다.

전체 버전에 대해서는 자바의 공식 홈페이지에서 각 릴리즈 정보에 대해 제공하고 있으니 참고 하면 좋을 것 같습니다.

일단 기능적으로는 다음과 같은 기능들이 도입/강화/추가 되었습니다.

Features Content
Collection Factory Method 기능 강화 List, Set, Map 인터페이스에 immutable 생성 가능한 Method 추가
Interface, Private Method 도입 인터페이스 내 private Method 사용 가능
Optional ifPresentOrElse Method 추가 기존 ifPresent Method : Optional 객체가 값을 담은 경우만 처리
ifPresentOrElse Method : 값이 없을 경우의 처리 내용까지 정의 가능
HTML5 Javadoc javadoc 생성 시, HTML5 마크업으로 생성이 가능(이전-HTML4 형식)
HTTP 2 Client http2를 구현하는 신규 클라이언트 API 제공 (기존 HttpURLConnection API 대체 가능)
Reactive Stream Non-Blocking Backpressure를 이용한 비동기 스트림 처리 지원 API 추가
로컬 변수 타입 추론 “var” 로컬 변수 선언 시 명시적 타입 선언 없이 변수 선언 가능 변수 추가(var)
문자열 메서드 추가 isBlank, lines, strip, stripLeading, stripTrailing, repeat 등 추가
텍스트 블록 기능 추가 기존 String을 여러 줄 작성할 때 사용 가능(가독성 있는 코드 지원)
Switch 표현식 기능 향상 Switch 문 이용 시 값을 반환하여 이용 가능, 람다 스타일 구문 사용 가능
Record Data class 추가 immutable 객체를 생성하는 새로운 유형의 클래스
기존 toString, equals, hashCode Method에 대한 구현을 자동 제공
Instanceof 매칭 기존 : Instanceof 내부에서 객체를 캐스팅 하는 과정이 필요
변경 사항 : 캐스팅 과정을 내부에서 지원할 수 있음
NumberFormat 클래스 기능 향상 기존 숫자 Format 클래스(NumberFormat) 내 Method 추가 (getCompactNumberInstance)
DateTimeFormatter 클래스 기능 향상 기존 날짜 Format 클래스(DateTimeFormatter) 내 패턴 Method 형식 추가(“B”)
봉인 클래스(Sealed) 무분별한 상속을 막기 위한 목적으로 등장한 기능
지정한 클래스 외 상속을 허용하지 않으며, 지정한 클래스 외 상속 불가
Stream.toList() 기능 추가 기존 : Stream을 List로 변환 시 Collectors에서 기능을 찾아 사용
변경 사항 : Collectors호출 없이 toList()만으로 변환이 가능

또한 패키지 혹은 지원도구 상 업데이트 내용은 다음과 같습니다.

Features Content
Jigsaw 모듈 시스템 모듈을 만들고 해당 모듈은 외부에서 호출할 수 있는 API를 제공
언어레벨에선 직접적으로 해당 모듈에 접근이 불가능
New Garbage Collector, ZGC 추가 새로운 Garbage Collector 도입
Thread-Local Handshakes GC 실행 전 우선 발생하는 “STOP-THE-WORLD” 발생 시
이전에는 모든 Thread가 동시에 중단 → 변경 후, Thread 개별로 중단 가능
다른 종류의 메모리에 JVM 힙 영역 할당 HotSpot JVM이 JVM 힙 영역의 메모리를 대체 메모리 장치(사용자 지정) 또는 여러 개의 메모리장치를 이용해 할당 가능
Multi-Release JAR File JAR파일 형식을 확장해 여러 버전의 클래스 파일을 하나의 JAR 안에 공존 가능
향상된 의사 난수 생성기 의사 난수 생성기(Pseudo-Random Number Generator)를 위한 새로운 인터페이스 타입과 구현을 제공
신규 Mac OS 렌더링 파이프라인 Apple 메탈 API를 사용하는 Mac OS용 Java 파이프라인을 구현
jlink JRE를 생성해주는 도구
Jshell 메인 Method 없이 자바 코드를 넣고 즉석에서 실행 가능한 도구

이외에도 각 개별 클래스에 대해서 상세한 비교가 필요한 경우 다음 사이트를 참고해보면 좋을 것 같습니다.

해당 사이트에서는 java 버전에 따라 원하는 버전과의 상세 비교를 제공하고, 각 클래스별 수정 사항에 대한 사항이 표시되어 변경 사항에 대해 쉽게 파악 할 수 있습니다.

https://javaalmanac.io/

image

이번 포스팅에서는 openjdk의 변화된 내용에 대해 표로 간략하게 알아보았습니다.

openJDK 8을 오랫동안 사용해옴에 따라 현재까지 나온 버전과의 차이가 생각보다 많았습니다.

추후 버전 서비스 종료를 대비해서라도, 바로 버전을 전환하지 않더라도 중간중간 파악해 두는 것이 도움이 될 것 같습니다.


참고 문헌

  • https://techblog.gccompany.co.kr/우리팀이-jdk-17을-도입한-이유-ced2b754cd7
  • https://pretius.com/blog/java-17-features/
  • https://e-una.tistory.com/46#6.%20%EA%B8%B0%EA%B0%84%20%EC%A7%80%EC%9B%90%20%EC%B6%94%EA%B0%80

업데이트: