회사에서 개발하는 레거시 프로젝트의 Version Migration 작업을 준비하기 위해 Java Version별 변경 내역을 조사하고 있는 내용입니다. 누락되거나 잘못 기술된 내용이 있을 수 있는 점 양해 부탁드립니다.

 

회사에서 맡아 진행하는 프로젝트에서 Java 17(Spring Boot는 2.6.2)을 사용하고 있기 때문에 Record나 Switch Expression, 추가된 Util 등에 만족하면서 개발을 하고 있는데요. 그렇기에 가능하다면 다른 레거시 프로젝트 또한 Java 17로 Migration 해보려고 합니다.

 

개인적으로 Spring Boot Version을 올리는 것이 더 까다롭지 않을까 생각하고 있습니다.

 

 

 

Java 9 (~2018년 3월 지원 종료)

  • 자바 모듈화(JDK 모듈 분리 기능), Integration JVM Logging, HTML5 JavaDoc
  • JShell 별도 컴파일 및 선언 없이 코드를 작성하고 테스트 가능한 CLI 도구가 추가되었습니다.
  • try-with-resource 구문 개선 관리하고자 하는 자원 객체를 try 구문 외부에서도 선언 가능합니다.
  • interface private method 추가 default, static method에 대한 공통 로직을 공유하는 용도입니다.
  • diamond operator 개선 (<>) - 익명 클래스에 대한 Generic 문법에서도 타입을 명시하지 않고 <>만 작성 가능하도록 개선되었습니다.
  • Process API 추가 모든, 현재, 자식, 종료 프로세스 정보에 대해 접근 및 관리 가능한 API입니다.
    • Process Stream을 버퍼 공간은 제한적이므로 입, 출력이 잦은 프로세스 요청 시 별도 스레드로 동작시키는 것을 권장한다고 합니다.
    • Java 9 Process API Improvements | Baeldung
  • CompletableFuture 개선 Timeout, Lazy 옵션 및 기능이 추가되었습니다.
  • Reactive Stream API 추가 - Reactive Programming을 위한 Pub / Sub을 지정 및 연계가 가능한 Flow 기능이 추가되었습니다.
  • Compact Strings (String 개선) 기본적으로 사용되는 UTF-16 charset String의 비효율적인 용량을 개선하기 위해 도입된 기능입니다.
    • String 내부에 char [] → byte []로 변경 및 String 생성 시 literal에 영문자만 있는 경우 Latin1 방식을 사용해 각 문자 당 1byte를 차지합니다.
    • benchmark 상 String 처리 속도가 20% 정도 개선되었고, String 으로 인한 Garbage 양이 30% 정도 감소하였습니다.
    • Compact Strings in Java 9 | Baeldung
  • Http Client API 추가 : URLConnection을 개선한 기능 및 명명 규칙을 제공하는 API입니다.
  • Мulti-Resolution Image API 추가 - 여러 해상도를 가지는 이미지들을 단일 해상도로 반환하거나 비교하는 등의 기능을 제공하는 API입니다.

 

 

 

Java 10 (~2018년 9월 지원 종료)

  • 지역 변수 타입 추론 기능 추가 var 제공 (변수 초기화 시 Diamond operation을 통한 Generic 명시)
  • G1 GC 개선 G1 GC의 알고리즘 성능이 향상되었습니다.
  • Unmodifiable Collections 기능 추가 기존 Colleciton을 Unmodifiable Collection으로 복사해주는 copyOf 메서드와 Stream API의 collect()에서 사용되는 Collectors.toUnmodifiableList() 메서드가 추가되었습니다.
  • Optional API 기능 추가 Optional, OptionalDouble, OptionalInt 등에서 사용 가능한 orElseThrow 메서드가 추가되었습니다.
    • 해당 메서드는 기능적으로 Optional.get()을 대체할 수 있습니다.
  • Container Awareness 지원 JVM Process가 Docker Container에서 실행 중임을 인식하여 Container의 구성 정보 값을 접근합니다.
    • Container의 메모리 사용량, CPU 할당량 등
  • Oracle Root Certificates 공개
  • CLI javah 제거, java.security.acl, ava.security.{Certificate,Identity,IdentityScope,Signer Deprecated
  • Graal Compiler 사용 가능 AOT 방식의 Compiler인 Graal Compiler Linux/x64 플랫폼 환경에서 사용할 수 있습니다.

 

 

 

Java 11 (LTS,  ~2023년 9월까지 지원 [연장 - 2026년 9월])

  • HTTP Client API 정식 통합 (JEP 321)
  • CORBA, Java EE, JAXB. JavaFX, JAX-WS Module 제거 - Dependency 정의를 하여야 사용 가능합니다.
  • 지역 변수 타입 추론 기능 개선 - Lambda expression에서 var를 사용 가능합니다.
  • String API 메서드 추가 ****isBlank, lines, strip, stripLeading, stripTrailing, repeat 메서드가 추가되었습니다.
  • Collection to Array 추가 toArray(String []::new), toArray(Integer []::new) 방식으로 사용 가능합니다.
  • Oracle JDK 무료 LTS 종료 JDK LTS의 유료화가 아닌 Oracle JDK에 한정된 사항으로 Oracle이나 다른 벤더에서 제공하는 OpenJDK는 무료 LTS를 지원합니다.
  • Nestmate Reflection API - Reflection API 사용 시 발생하던 중첩 객체의 private method 접근이 허용되도록 수정되었습니다.
  • javac 생략 가능 -. java file을 compile하지 않고 CLI에서 java Sample.java를 입력함으로써 실행할 수 있도록 개선되었습니다.
  • Dynamic Class-File Constants 추가 - 동적으로 생성되는 상수(부트스트랩 메서드를 통한 결과 값)에 대한 생성 비용을 감소시키기 위해 invokedynamic에게 위임되는 constantdynamic과 Constant pool이 추가되었습니다.
  • ARM64, Aarch64에서의 String, Array 내장 함수 최적화 및 Java.lang, Math의 sin, cos, log method 내장 함수 구현 (성능 개선)
  • Epsilon(No-Op) GC 사용 가능 - GC를 하지 않는 성능, 메모리 테스트 용도로 적합한 GC가 실험 기능으로 포함되었습니다.
  • ZGC GC 사용 가능 GC 일시 정지를 최소화하는데 목적을 두고 Colored pointers, Load Barriers, forwarding table 및 Relocation Set을 활용하는 GC인 ZGC를 실험적으로 사용할 수 있게 되었습니다.

 

 

 

Java 12 (~2019년 9월 지원 종료)

 

 

 

Java 13 (~2020년 3월 지원 종료)

  • Switch Expression 개선 - Case 안에서 값을 반환하는 yield keyword가 추가되었습니다.
  • Text Block 여러 줄로 구성된 String literal을 """ ~ """로 묶을 수 있는 기능이 preview로 추가되었습니다. 해당 기능은 literal로 작성하는 Query 구문에 대해서 향상된 경험을 제공하는 것 같습니다.
  • Dynamic CDS Archives - JVM 간의 Class Metadata를 공유할 수 있는 방법인 CDS (Class Data Sharing) 기능을 사용하는 방법이 개선되었습니다.
  • ZGC: Uncommit Unused Memory (JEP 351), Heap 최대 크기 향상 사용되지 않는 Heap Memory 공간을 OS에게 반환하는 기능이 포함되었습니다. 최소 크기에 도달하기 전까지 Heap Memory를 반환합니다. 또한 지원하는 최대 Heap size가 4TB에서 16TB로 향상되었습니다.
  • Reimplement the Legacy Socket API (JEP 353) - java.net.Socket 및 java.net.ServerSocket API의 기본 구현체를 NioSocketImpl로 변경하였습니다.
  • java.nio API 메서드 추가 FileSystem.newFIleSystem() 메서드가 추가되었습니다.

 

 

 

Java 14 (~2020년 9월 지원 종료)

  • Switch Expression 사용 가능 (정식)
  • Pattern Matching for instanceof 명시적인 Casting 없이도 typecasted 시킬 수 있는 기능이 preview 형태로 추가되었습니다.
  • Text Block 개선 escape sequence인 /, /s 가 추가되었습니다.
  • Record 추가 - Data-Transfer-Object, Value-Object 패턴의 POJO에서 발생하는 지속적인 boilerplate를 줄이기 위해 record type이 만들어졌으며, preview로 추가되었습니다.
  • Helpful NullPointerExceptions - Stack trace에 표시되는 NPE 발생 행의 어떤 값이 Null인지 지적하는 기능이 추가되었습니다. 기능을 활성화 함으로써 사용 가능합니다.
  • Foreign Memory Access API 외부 Memory에 접근 가능한 실험적인 Memory API가 Experimental Feature로 추가되었습니다.
  • ZGC on Windows and macOS – Linux 환경에서만 사용 가능한 ZGC가 이제 Windows, macOS에서도 사용 가능해졌습니다.
  • NUMA-Aware Memory Allocation for G1 G1 GC도 Non-uniform memory access를 인식하도록 변경되었습니다.
  • ParallelScavenge + SerialOld GC 방식 제거, Concurrent Mark Sweep(CMS) Garbage Collector 제거

 

 

 

Java 15 (~2021년 3월 지원 종료)

  • ZGC, Shenandoah GC 사용 가능 (정식)
  • Text Block 사용 가능 (정식)
  • Helpful NullPointerExceptions (기본 지원)
  • Record 개선 - Record에 대한 2차 preview로써 Reflection 등으로 Field가 수정될 수 없고, Native Method를 사용하지 못하도록 변경되었습니다.
  • Sealed Classes 추가 접근 제어자 이외에도 상속에 대한 세분화된 제어를 위해 Sealed Classes가 preview로 추가되었습니다. Sub class로 지정할 Type을 permits를 통해 명시적으로 정의할 수 있습니다
  • Hidden Classes 추가 - 동적 클래스의 비효율적인 Memory 사용량 등을 개선하기 위해 Hidden Classes가 preview로 추가되었습니다. 코드에서 직접적으로 접근할 수 없으며 독립적으로 Unload 할 수 있어 필요한 순간에서만 사용하고 GC 시킬 수 있습니다.
    • 명시적인 Reflection API, ClassLoader의 Lookup 메서드로는 찾을 수 없으며, Super-class, Field, Return, Argument type으로 사용할 수 없습니다.
    • Java 15부터 Lambda 기능을 수행하기 위해 만들어지는 Instance는 Hidden Classes입니다.
    • JEP 371: Hidden Classes
  • Pattern Matching Type Checks (Pattern Matching for instanceof) - 해당 기능은 개선 없이 preview 상태를 유지합니다.
  • Foreign Memory Access API - 해당 기능은 Experimental Feature 상태로 유지되고 있으며, Memory Access Handle를 사용자가 정의 가능하도록 VarHandle API를 추가하고 Spliterator Interface를 통한 parallel processing of Memory Segment을 지원합니다.
  • Reimplement the Legacy Socket API - DatagramSocket API 가 재작성되었습니다.

 

 

 

Java 16 (~2021년 9월 지원 종료)

  • Pattern Matching for instanceof 사용 가능 (정식)
  • Record 사용 가능 (정식) 이제 Ineer Class의 상태로써 Reocrd를 정의할 수 있습니다.
  • Sealed Classes 개선 - sealing , non-sealed keyword를 abstract, extends와 유사한 JVM이 인식 가능한 Context keyword로 허용되었으며, Type check 나 Sealed Classes의 Sub Class를 만드는 기능이 제한되었습니다.
  • foreign linker API 추가 JNI를 대체하기 위한 Host System의 Code에 Access 하는 방법인 foreign linker API가 추가되었습니다.
  • Invoke Default Methods From Proxy Instances (JDK-8159746) - Dynamic proxy 정의 시 interface의 default method를 호출할 수 있는 java.lang.reflect.InvocationHandler가 추가되었습니다.
  • Day Period Support (JDK-8247781) DateTimeFormatter에 사용할 수 있는 새로운 기호가 추가되었습니다.
  • Add Stream.toList Method (JDK-8180352) .collect(Collectors.toList()); 와 같은 boilerplate를 줄이기 위해 도입된 기능으로 collect 종결 연산 대신. toList()를 사용할 수 있습니다.
  • Vector API (JEP-338) 추가 스칼라 연산보다 더 최적화된 벡터 연산 방식을 제공하기 위해 Experimental Feature 상태로 도입된 API입니다.
  • Strongly Encapsulate JDK Internals by Default JDK 내부를 직접 접근하는 모든 Library가 접근할 수 없도록 내부 코드가 강하게 Encapsulate 되었습니다.

 

 

 

Java 17 (LTS, ~2026년 9월까지 지원 [연장 - 2029년 9월])

 

 

 

Java 18 (~2022년 9월 지원 종료)

  • Internet-Address Resolution SPI 추가 (JEP-418) Host의 이름이나 주소를 확인할 수 있는 API가 추가되었습니다.
  • Pattern Matching for Switch (JEP 420) Pattern Matching 기능을 Switch에도 확장하기 위한 작업으로 2번째 preview 상태입니다.
  • Reimplement Core Reflection with Method Handles (JEP 416) 기존 핵심 Reflection API의 일부 동작을 다시 구현하여 유지 관리 비용을 줄이기 위한 작업입니다.
  • Simple Web Server 추가 (JEP-408) 정적 리소스 파일을 제공할 수 있는 간단한 웹 서버를 만드는 CLI 도구를 제공하는 작업입니다.
  • UTF-8 by Default (JEP-400) -Java API에서 사용되는 기본 문자 집합으로 UTF-8을 사용하도록 변경한 작업입니다.
    • 특정 문자 집합으로 고정하여 사용하지 않고 Java의 기본 문자 집합을 사용하는 Asia Locale Application에서 String과 같은 데이터의 손상이 발생할 가능성이 높다고 합니다.
    • JEP 400: UTF-8 by Default
  • Vector API (JEP-417) 개선 최적화된 벡터 연산 방식을 도입하기 위한 3번째 incubating 작업으로 CPU 아키텍처에 최적화된 벡터 명령어로 Runtime에 Compile 되는 벡터 계산을 표현하여 동등한 스칼라 계산보다 우수한 성능을 달성하였습니다.
  • Finalizer 제거 예정 (JEP-421) - 보안, 성능, 안정성 및 유지 관리 측면에서 심각한 문제를 일으키는 Finalizer (finalize()) 를 제거하는 작업입니다. try-with-resources 문법이나, Cleaners API를 사용하도록 권장합니다.

+ Recent posts