JDK 개요

블러거·2025년 12월 17일

JVM

목록 보기
2/26

JDK

한번 작성하면 어디든 실행된다.
메모리 관리를 자동으로 해준다.
핫 코드를 감지하고 컴파일 및 최적화하여 성능을 높인다.

우리가 자바를 쓰는 이유들이다.

JDK 는 자바 프로그래밍 언어, JVM, 자바 클래스 라이브러리를 묶어 부르는 말이며, 이는 자바 프로그램 개발에 필요한 최소 환경이다.

https://docs.oracle.com/javase/7/docs/index.html
https://docs.oracle.com/javase/7/docs/index.html

위 그림과 같이 JDK 내부에는 Java SE API, JRE 라 부를 수 있는 집합이 있다.

Java SE API

데스크톱 애플리케이션용 자바 플랫폼이다.
완전한 형태의 자바 핵심 API 를 제공한다.

JRE

JDK 에서 Java SE API 와 가상머신, 배포기술을 합쳐 JRE 라고 한다.
다만 위 그림은 JDK 7 의 그림이며, Deployment 에 있는 Java Web Start, Applet/Java Plug-in 은 이미 다 사장된 기술이다.

나머지

JDK 에서 JRE 를 뺀 부분은 자바 언어 자체와 도구들이다.
도구들에는 javac 컴파일러, jar 패키징들과 모니터링을 위한 다양한 툴(JConsole, VisualVM, JMC, JFR ...) 이 포함되어 있다.

즉, JDK 안에는 우리가 자바를 분석할 수 있는 다양한 도구들이 이미 포함되어 있다는 것이다.
(우리가, 적어도 내가 사용한게 많이 없어서 그렇지..)

실제로 한번 보자면

https://docs.oracle.com/en/java/javase/21/docs/api/index.html
위 오라클의 jdk docs 를 보면 Java SE API 의 범위와 JDK 범위를 탭으로 구분해준다.
(java.smartcardio 는 SE API 가 아니다)

그리고 아래 그림은 필자의 IntelliJ 의 라이브러리 Explore 에서 사용중인 JDK 21 을 펼치면 나오는 화면이다.

Java SE API 중 가장 중요한 java.base 에는 익히 알고 있는 java.lang(언어) 가 있으며, 이외에도 LocalDate, BigDecimal, CollectionAPI 등등 자바의 많은 기능들이 있는 것을 볼 수 있다.

Java SE? EE?

Java SE : 완전한 형태의 자바 핵심 API 패키지
Java EE : 기업 규모 애플리케이션용 자바 확장 패키지

Java SE 는 핵심 API 를 제공하며, JDK 에 기본으로 포함되어 있다.

Java EE

기업규모 애플리케이션 개발을 위한 Java 확장 패키지.

엔터프라이즈 애플리케이션을 개발하기 위한 기술 인터페이스의 모음.
Java SE 가 완전한 언어 형태의 구현체를 제공하는 것과 달리, Java EE 는 확장 기능의 인터페이스만 제공한다.

아래 그림은 Java EE 에서 정의한 기술들인데, 가장 대표적으로 JPA 가 있음을 볼 수 있다.

https://www.researchgate.net/figure/A-diagram-of-the-Java-EE-Full-Platform-and-Web-Profile-specifications_fig1_325534947

Java EE 는 확장 패키지라서, javax 네임스페이스를 가진다.
다만 2018년, 오라클은 돈이 안되는 Java EE 의 개발을 놓았고 이클립스 재단에 기증해버린다. 다만 java 의 상표권을 가진 오라클이 java 이름을 쓰지 못하게 했으며 현재는 jakarta 라는 이름으로 모두 변했다.

EJB 의 대표적인 구현체가 GlassFish, JBoss EAP 등이 있다. 이들은 EJB 의 구현 뿐 만 아니라 JPA 구현체로 EclipseLink 를 기본 제공하는 등 Java EE 앤터프라이즈 애플리케이션의 모든것이 갖춰져 있고 유저의 애플리케이션 코드만 얹으면 되는 형태였다. 특정한 클래스를 상속하여 비즈니스 로직을 짜서 올리기만 하면, 엔터프라이즈 애플리케이션 개발이 완료될 수 있었다.
현재 사용하는 Spring 은 모든 개발 필요 라이브러리를 직접 구성해야하는 프레임워크임이 다른 점이다. 완성된 형태로 제공하기에 무겁고, 미리 정의된 틀에 박힌 개발을 해야 했다. 이게 불편했고, spring 이 등장했다.
spring 또한 java ee 스펙을 사용하는건 변함 없으므로 jakarta.* 코드들을 쉽게 볼 수 있다.

java vs javax

java.* 네임스페이스에는 자바 핵심 API 가 위치한다.
자바 핵심 API 는 Java SE 에 있다.
따라서 Java SE 는 모두 java.* 네임스페이스다.

javax.* 네임스페이스는 자바 확장 API 가 위치한다.
Java EE, Java ME 등등이 그렇다.
다만 Java EE 는 이클립스 재단으로 기증된 뒤 모두 jakarta.* 네임스페이스로 바뀌었다.

따라서 개발을 하다가 import jakarta.* 가 보이면, 이클립스로 넘어간 Java EE 사양이구나 하면 된다.

자바 API 에는 여전히 javax 네임스페이스를 쓰는 곳이 몇군데 있다.

  1. 자바 핵심 API 의 javax.
  2. Java ME 등등
    • Java 확장은 Java EE 만이 있는것이 아니다. 대표적으로 Java ME 라는 것도 있다. 이 프로젝트는 여전히 오라클이 관리하며, 따라서 여전히 javax 네임스페이스를 사용한다.

OpenJDK

OpenJDK

https://openjdk.org/

썬 마이크로시스템즈 사는 JDK 6를 공개하고, 7이 개발중인 시점 JDK 를 GPLv2 라이센스로 오픈소스스화 했다. 이를 OpenJDK 라 한다.

이후 오라클이 썬을 인수한 후 부터는 OpenJDK 는 오라클이 개발을 주도하며, 여러 기업들이 참여한다.

OpenJDK 는 6개월마다 새로운 메이저 버전이 개발되도록 약속되어 있다. 많은 내용이 하나의 버전에 포함되지 않도록 짧은 주기로 자주 개발 배포된다.

사실 이 OpenJDK 라는건 결국 자바 코드다. OpenJDK Github 에서 개발되는 모습을 볼 수 있다.

PreBuilt OpenJDK Binary

OpenJDK 깃허브에서 다운받은 소스코드를 컴파일하고 빌드하여 빌드 바이너리로 만들면, JAVA_PATH 만 지정하면 바로 사용 가능한 실행파일로 만들 수 있다.

그리고 JDK 개발을 주도하는 오라클은 출시된 메이저 버전이 최신 버전인 6개월동안 해당 버전의 PreBuilt Binary 를 제공한다.
즉, 오라클이 OpenJDK 소스코드를 미리 컴파일 빌드하여 바이너리 파일로 만들어 올려놓으면, 우리는 그걸 다운로드만 받아 바로 사용하는 것이다.

바이너리는 https://jdk.java.net/ 에서 다운로드 받을 수 있다.

하지만 반대로 말하면 하나의 메이저 버전의 빌드 바이너리는 6개월 동안만 오라클이 관리 및 배포한다.

사실 소스코드만 있다면 우리가 빌드하여 사용하면 되지 않느냐 싶지만, 공인된 공급자로부터 미리 빌드되었다는 것은 많은것을 보장해준다.

예를 들어, OpenJDK 소스를 빌드할때에는 여러 옵션을 줘서 빌드할 수 있다. 하지만 미리 빌드된 바이너리를 쓴다면 빌드 옵션을 일정하게 안정적으로 쓸 수 있다.
이 사실은 사용에 있어서도, 이후 보안이라든 감사라든 이 사실이 필요할 때가 있을 수 있다.

여하튼, 6개월만 유지보수해주기 때문에 공급자로부터 미리 빌드된 바이너리가 필요한 사람은 6개월마다 버전을 업그레이드 하여야 한다.
그게 힘들다면 (사실 대부분 힘들다) 오라클, 레드헷, 이클립스, 아마존 등 여러 공급자가 자체 제공하는 JDK 를 사용할 수 있다.

OpenJDK Updates Project

오라클이 빌드된 바이너리를 6개월동안만 제공한다는 것이 과거 버전들에 버그가 발견되어도 고쳐주지 않는다와 같은 말은 아니다.

OpenJDK 중 LTS 버전들은 계속해서 소스코드상 업데이트가 이뤄진다. 다만 PreBuilt Binary 는 공식적으로 제공되지 않는다는 것이다.

일단 JDK 의 새로운 버전이 GA 로 나온 후, 필요한 업데이트들은 JDK Updates Project 에서 계속 업데이트 한다.

https://www.reddit.com/r/java/comments/be91du/leadership_of_openjdk_8_and_openjdk_11/
2019 년, JDK8 과 11 은 오라클에서 레드햇으로 유지보수 리더쉽이 이양되었다.
8 과 11 의 JDK Updates Project 의 책임자가 레드헷 사람이 된 것.

LTS 가 아닌 버전들은 6개월 후 이 프로젝트가 멈춘다. 반면 LTS (8, 11, 17, 21, 25) 버전들은 긴 기간동안 Updates Project 가 진행된다. 즉, 8, 11, 17, 21, 25 LTS 버전에 대해서는 지속적으로 코드가 업데이트 된다.

예를 들어 openJDK 깃허브에는 OpenJDK-17u 리포지토리에서 지금까지도 업데이트 버전이 릴리즈 되고 있다. 반면 18u 는 이미 아카이브된 리포지토리이다.

OpenJDK 여러 밴더

다행히 지난 버전 소스코드들의 버그 수정이나 보안 패치는 이뤄진다.
하지만 빌드된 파일은 어디서 구할까? 우리가 직접 빌드해서 써야하나?

이것도 다행히도 아니다.
오라클, 이클립스 재단, 아마존, 레드햇같은 밴더사들은 각각 자기만의 PreBuilt binary 를 제공한다. 원하는 곳에서 다운로드 받아 사용할 수 있다.

이런 각각 회사들은 OpenJDK 의 소스코드를 베이스로 자기내 입맛대로 조금씩 바꾼다.
그리고 TCK 라는 도구로 밴더사들이 각각 구현한 JDK 가 너무 엇나간건 아닌지 검사한다.

AWS 의 Corretto ChangeLog 를 보면 자기네가 빌드한 JDK 의 baseline 이 OpenJDK Update Project(openJDK/17u 리포지토리) 의 릴리즈임을 알 수 있다.

Oracle JDK

오라클은 Java 상표권을 가지고 있는 회사다. 오라클은 JDK 11 부터 상용 툴(JFR, JMC 등) 을 오픈소스로 공개하면서부터 OpenJDK built binary 와 오라클이 제공하는 JDK Built Binary 는 완전 동일한게 되었다.

하지만 Oracle JDK 는 라이센스상 개인용으론 무료지만 상용으로 사용할때에는 돈을 내야 한다.
이 돈을 내면, 사용하는 바이너리는 같다 해도 많은 차이가 있다.

몇가지 보자면..
1. OpenJDK PreBuilt Binary 제공 기간인 6개월이 지나도 상관없다. 오라클 JDK 는 계속해서 업데이트 및 빌드해준다.
2. JDK 에 문제가 있으며 24시간 오라클에 질문할 수 있다.
3. 문제를 대신 해결해주기도 하는 것 같다.
4. 오픈소스를 사용함으로 발생하는 우려를 없앨 수 있다. (이거 지원 계속 되는거야? 버그 있으면 어떡해? 등등...)

Eclipse Temurin

https://adoptium.net/temurin
이클립스에서 OpenJDK 로 만드는 JDK.
가장 큰 커뮤니티를 기반으로 운영되는 것 같다.
TCK 를 통과했으며 무료 및 LTS 를 지원한다.

AWS Corretto

https://aws.amazon.com/ko/corretto/faqs/
AWS 에서 OpenJDK 로 만드는 JDK.
OpenJDK 에 아직 통합되지 않은 패치도 최대한 빠르게 패치한다고 한다.
TCK 를 통과했으며 무료 및 LTS 를 지원한다.

이외에도 레드햇, 마이크로소프트 등 굴지의 기업에서 JDK 를 만들어 제공한다. 비슷비슷해 보이는데, 잘 비교하여 적합한 곳을 고르면 될 것 같다.

어떤 JDK 를 선택해야하는데 ???

에 대해서 정리된 사이트
https://whichjdk.com/#openjdk-builds-by-oracle-jdkjavanet

참고하면 좋을..

JDK eol 이 다가오며 겪은 일 https://engineering.linecorp.com/ko/blog/line-open-jdk
여러 소프트웨어 eol https://endoflife.date/openjdk-builds-from-oracle
오라클의 11 이후 라이센스 https://blogs.oracle.com/java/oracle-jdk-releases-for-java-11-and-later

profile
안녕하세요!

0개의 댓글