백엔드 개발자 블로그

JDK 버전 고려해보기 본문

Java

JDK 버전 고려해보기

backend-dev 2024. 4. 17. 21:55

JDK 버전을 선택하면서 경험했던 내용들을 공유하고자 합니다.

보통 버전 선택 기준은 LTS(유지보수 기간), 성능 및 유틸성, 호환성, 비용, 개발 속도를 고려합니다.


유지보수 기간을 살펴보자

https://access.redhat.com/articles/1299013

  • 서포트 기간이 4년이나 길게 남아 있는 JDK 17이 가장 안정적입니다.

성능 및 유틸성을 살펴보자

  • Java 11
    • 람다 파라미터에서 var를 사용할 수 있게 되었습니다.
    • 내부적으로 JVM은 모듈을 활용하여 클래스 로딩을 보다 효율적으로 할 수 있습니다.
    • Java Flight Recorder(JFR) 및 Java Mission Control(JMC)는 Java 8에서는 유료지만, Java 11에서는 오픈소스로 제공합니다.
      • JFR 및 JMC를 사용하면 메모리 누수, GC 오버헤드, 핫 메서드, 스레드 병목 상태 및 I/O 블로킹과 같은 런타임 문제를 진단할 수 있습니다.
    • 다중 릴리스 jar 파일
      • Java 11에서 클래스 파일의 여러 Java 릴리스별 버전을 포함하는 jar 파일을 만들 수 있습니다.
    • JVM 성능 향상
      • Segmented Code Cache
        • JVM 메모리 공간을 효율적으로 제어하고 컴파일된 메서드의 검색시간을 단축하고, 코드 캐시의 조각화를 줄여 성능 향상
    • Compact Strings
      • 문자열을 저장하는 데 필요한 공간이 효율적으로 변경
    • HTTP Client(Standard)
      • HTTP/2 및 WebSocket을 구현하고 레거시 HttpURLConnection API를 대체할 수 있는 새로운 HTTP 클라이언트 API를 제공합니다.
  • Java 17 
    • 텍스트 블록
    • 람다식을 통한 Switch 구문 개선
    • Stream.toList() 간결화
    • NullPointerException의 원인 제공
      • 디버깅, 오류잡는데 시간단축 가능(이건 좋은데?)
    • GC 성능개선도 있었다함

호환성을 살펴보자

  • Spring Boot
    • Spring Boot 2.xx 는 Java 11와 호환됩니다.
    • Spring Boot 3.xx는 Java 17와 호환됩니다.
  • (참고) Spring Boot 2.xx vs 3.xx
    • 2.xx
      • 레퍼런스가 많습니다.
    • 3.xx
      • Java 17 이상 지원
      • 변경 사항
        • Java EE를 jakarta EE 로 대체
          • javax. 에서 jakarta. 로 변경
        • 보안상 이슈로 /api/hello 와 /api/hello/ 는 더 이상 일치하지 않음.
      • GraalVM 기반의 Spring Native 공식 지원
        • MSA의 서버 실행 시간 및 메모리 사용률의 많은 비용 문제를 해결하기 위해 나온것인데 우리는 필요한가??
      • HTTP/RSocket Interface Client를 제공
      • Micrometer Observation API가 자동으로 구성되며, Observability 공식 지원
      • HTTP API 에러 처리를 위한 RFC 7807 스펙 지원
      • 이미 Spring Boot 2.xx로 개발된 서비스에서는 마이그레이션 비용을 감당하면서 까지 3.xx로 넘어갈 이유는 없다고 

비용을 살펴보자

  • Oracle JDK
    • Java 17에서는 Oracle JDK 무료 라이선스를 제공합니다.
  • 마이그래이션 비용
    • 미래에 Spring Boot 3.xx으로 마이그래이션할 경우를 대비해서 Java 17을 사용하면 마이그래이션 비용을 줄일 수 있습니다. 

개발속도를 비교해 보자

  • 레퍼런스 양
    • Java 17은 레퍼런스가 적어서 러닝커브가 높고, 개발 속도가 느립니다.
    • Java 11은 레퍼런스가 많아서 러닝커브가 낮고, 빠른 개발이 가능합니다.

결론

성능 및 확장성을 우선하면 Java 17을, 안정성 및 개발 속도를 우선하면 Java 11을 사용합시다.

 


참고