사전 OpenJDK
구현체

OpenJDK

gabury1고친 사람 github-actions[bot]

OpenJDK 는 자바를 컴파일하고 실행하는 프로그램을 소스째 공개해 누구나 만들어 쓰게 합니다. 지금 쓰이는 자바 실행 환경은 이름이 무엇이든 거의 이 소스에서 나옵니다. 자바가 어떻게 동작해야 하는지를 글이 아니라 돌아가는 코드로 보여 주기도 합니다.

쉽고 빠른 이해

OpenJDK 는 자바 실행 환경의 소스를 공개해 두고 여럿이 함께 고쳐 가는 프로젝트입니다. 내 컴퓨터에 깔린 자바도 이름만 다를 뿐 거의 이 소스를 빌드한 결과입니다.

자바가 어떻게 동작해야 하는지는 규격 문서가 정합니다. 문서만 있으면 만드는 곳마다 조금씩 다르게 읽습니다. 같은 코드를 보고 맞춰 갈 수 있도록 공개해 둔 소스가 이것입니다.

어떻게 도나:

  1. 규격 문서가 자바의 동작을 정합니다
  2. 이 프로젝트가 그 규격대로 도는 코드를 소스로 내놓습니다
  3. 여러 곳이 그 소스를 빌드해 각자 이름을 붙여 내놓습니다

대가도 있습니다. 소스는 하나인데 내놓는 곳이 여럿이라, 무엇을 깔지와 보안 수정을 얼마나 오래 받을지를 쓰는 쪽이 직접 골라야 합니다.

상세

OpenJDK 는 자바로 짠 코드를 컴파일하고 실행하는 데 드는 프로그램 한 벌의 소스를 모아 두고 공개하는 프로젝트입니다. 그 한 벌을 JDK(Java Development Kit, 자바 개발 키트)라고 부릅니다. 터미널에서 javac Hello.java 로 컴파일하고 java Hello 로 돌릴 때 부르는 프로그램들이 이 소스에서 나옵니다.

이름 때문에 헷갈립니다. OpenJDK 는 내려받아 깔면 되는 완성품 하나를 가리키는 말이 아닙니다. 그 완성품을 만들 수 있는 소스와 그것을 함께 고쳐 가는 사람들을 묶어 부르는 이름입니다. 내 컴퓨터에 깔려 있는 것은 누군가 이 소스를 빌드해 이름을 붙여 내놓은 결과물입니다.

규격과 이 소스의 관계부터 보고, 소스 하나가 어떻게 여러 벌로 갈라져 나오는지로 내려갑니다.

규격 문서와 참조 구현

자바는 언어와 그것을 실행하는 가상 머신이 어떻게 동작해야 하는지를 문서로 못 박아 둡니다. 그 규격의 이름이 Java SE(Standard Edition, 표준판)입니다. 문서는 「이렇게 동작해야 한다」까지만 적습니다. 그대로 만들어 돌아가는 물건은 따로 있어야 합니다.

OpenJDK 가 그 물건입니다. 규격이 애매하게 읽히는 대목을 만나면 이 코드가 어떻게 하는지를 보고 맞춥니다. 이렇게 규격의 기준 노릇까지 하는 구현을 참조 구현이라고 부릅니다.

참조 구현이라고 해서 규격이 코드를 따라가는 것은 아닙니다. 순서는 문서가 먼저입니다.

규격에 맞는지 가리는 호환성 시험 모음도 따로 있습니다. 이름은 TCK(Technology Compatibility Kit, 기술 호환성 키트)이고, 규격을 내는 쪽이 문서와 함께 내놓습니다. 자바라고 이름 붙여 내놓으려면 이 시험을 통과해야 합니다.

소스 하나와 배포판 여럿

소스가 공개되어 있으니 누구나 내려받아 빌드할 수 있습니다. 여러 회사와 재단이 각자 빌드해 자기 이름을 붙여 내놓습니다. 이렇게 나온 결과물을 배포판이라고 부릅니다.

flowchart TD
    SPEC["Java SE 규격 문서"] --> SRC["OpenJDK 소스"]
    SRC --> A["Eclipse Temurin"]
    SRC --> B["Amazon Corretto"]
    SRC --> C["Azul Zulu"]
    A --> T["호환성 시험"]
    B --> T
    C --> T
    SPEC -.-> T
    T --> ME["내 컴퓨터에 깔린 JDK 한 벌"]

그림의 가운데 한 칸이 OpenJDK 입니다. 그 아래 셋은 그 소스로 만들어 낸 배포판입니다. 위는 문서이고 아래는 깔아 쓰는 물건입니다. 「OpenJDK 를 쓴다」는 말이 대개 아래쪽 배포판 하나를 깔았다는 뜻인 것은 이 때문입니다.

점선은 호환성 시험의 기준이 코드가 아니라 규격 문서 쪽에 있다는 뜻입니다.

배포판끼리 갈리는 대목은 코드가 아니라 그 바깥입니다. 보안 수정을 얼마나 오래 내주는지, 쓰는 데 돈이 드는지, 어떤 운영체제와 칩에 맞춘 빌드를 내주는지가 다릅니다. 무엇을 골랐든 자바 코드가 도는 방식은 같습니다.

지금 깔린 것이 어느 배포판인지는 java -version 이 찍어 줍니다.

한 벌로 묶여 나오는 프로그램

JDK 한 벌을 내려받아 풀면 아래 넷이 함께 들어 있습니다.

묶여 나오는 것 하는 일
가상 머신 컴파일된 코드를 읽어 실행합니다
컴파일러 자바 소스를 가상 머신이 읽을 형태로 바꿉니다
클래스 라이브러리 문자열·목록·입출력처럼 미리 만들어 둔 코드를 줍니다
개발 도구 압축·디버깅·실행 이미지 만들기 같은 보조 명령입니다

넷은 서로 짝이 맞아야 자바 코드가 돕니다. 짝이 어긋나면 컴파일은 되는데 실행이 안 되는 일이 생깁니다. 그래서 하나씩 구해다 맞추는 대신 한 벌로 묶어 내놓습니다.

넷이 어디에 담겨 나오는지는 이렇습니다. 그림에서 칸의 아랫줄이 그 이름입니다.

flowchart TD
    SRC["OpenJDK 소스"] --> BUILD["빌드"]
    BUILD --> BUNDLE
    subgraph BUNDLE["JDK 한 벌"]
        VM["가상 머신<br/>HotSpot"] ~~~ JC["컴파일러<br/>javac"]
        JC ~~~ LIB["클래스 라이브러리<br/>표준 라이브러리"]
        LIB ~~~ TOOL["개발 도구"]
    end

가상 머신은 JVM(Java Virtual Machine, 자바 가상 머신)이라고 부릅니다. OpenJDK 가 들고 있는 그 구현에 붙은 이름이 HotSpot 입니다. 컴파일러의 이름은 javac 입니다. 미리 만들어 둔 코드 묶음은 표준 라이브러리라고 부릅니다.

소스 공개에 붙는 조건

공개했다고 아무 조건 없이 가져다 쓸 수 있는 것은 아닙니다. 소스는 GPL(General Public License, 일반 공중 사용 허가서) 계열 라이선스로 나옵니다. 받은 코드를 고쳐 배포할 때 고친 소스도 함께 공개하라고 요구하는 라이선스입니다.

여기에 클래스패스 예외라는 단서가 하나 붙습니다. 이 코드 위에서 도는 프로그램까지 같은 요구를 받지는 않는다는 단서입니다. 회사에서 자바로 짠 코드를 공개하지 않아도 되는 근거가 이것입니다.

갈림은 내가 무엇을 배포하느냐 하나뿐입니다.

flowchart TD
    Q["내가 배포하는 것이 무엇인가"] --> A["고친 OpenJDK 소스"]
    Q --> B["그 위에서 도는 내 프로그램"]
    A --> A1["고친 소스도 함께 공개합니다"]
    B --> B1["클래스패스 예외로 공개 의무가 없습니다"]

새 기능과 수정은 공개된 저장소를 거쳐 들어갑니다. 한 회사가 코드를 쥐고 있지는 않습니다. 다만 기여가 고르게 나뉘어 있지도 않아서, 손이 많이 가는 부분은 큰 참여자 몇 곳이 주로 맡습니다.

OpenJDK 가 맡지 않는 범위

소스와 그것을 빌드한 결과물까지가 이 프로젝트의 몫입니다. 그 바깥은 쓰는 쪽이 챙깁니다.

자바에는 판이 여럿 있습니다. 자바 8·자바 17 처럼 번호로 부르고, 프로젝트마다 요구하는 판이 다릅니다.

  • 여러 판을 깔아 두고 갈아 끼우는 일은 SDKMAN(Software Development Kit Manager, 소프트웨어 개발 키트 관리자) 같은 도구가 합니다
  • 라이브러리를 내려받고 빌드 순서를 챙기는 일은 Gradle 이나 Maven 같은 빌드 도구가 맡습니다
  • 보안 수정을 얼마나 오래 내줄지는 배포판을 내놓는 곳이 각자 정합니다

마지막 줄이 실무에서 제일 자주 걸립니다. 소스가 공개되어 있다는 것과 내가 깐 빌드가 앞으로도 고쳐진다는 것은 다른 이야기입니다. 무엇을 깔지 고를 때는 코드보다 이쪽을 먼저 봅니다.

관련 항목

OpenJDK 소스에서 나오는 프로그램과 구성 요소

JDK · JRE · JVM · HotSpot · javac · javap · 표준 라이브러리 · jlink

OpenJDK 소스를 빌드해 내놓는 배포판

Eclipse Temurin · Amazon Corretto · Azul Zulu · Oracle JDK · Liberica JDK · GraalVM

OpenJDK 가 맞춰야 하는 규격과 검증 절차

Java SE · 자바 언어 명세 · JVM 명세 · JCP · TCK · JEP

OpenJDK 가 컴파일하고 실행해 주는 언어

자바 · 코틀린 · 스칼라 · 그루비 · 클로저

JDK 위에서 프로그램이 도는 동안 벌어지는 처리 단계

클래스 로딩 · 가비지 컬렉션 · JIT 컴파일 · 바이트코드 · 클래스 파일 · 클래스패스

OpenJDK 소스 공개에 붙는 라이선스와 지원 조건

GPL · 클래스패스 예외 · 오픈 소스 · 장기 지원 · 소프트웨어 라이선스

OpenJDK 바깥에서 따로 갖추는 개발 도구

Gradle · Maven · SDKMAN · 통합 개발 환경 · 정적 분석 도구

OpenJDK 가 속하는 상위 분류

참조 구현 · 가상 머신 · 런타임 · 컴파일러 · 소프트웨어 개발 키트

다른 이름: 오픈JDK · OpenJDK 프로젝트