OracleJDK 와 OpenJDK

본 글은 일반 개인이 작성한 글입니다. Oracle 및 본문의 관계자들의 공식적인 의도와 다소 상이한 해석이나 불편한 내용이 있을 수 있습니다. 하여 위와 관련하여 내용 정정이나 삭제 요청이 있을 시에는 공지 없이 수정되거나 삭제될 수 있음을 명시합니다.

들어가며

Oracle 자바의 정책이 바뀜에 따라 국내 개발 환경에도 많은 변화가 일어날 것으로 생각합니다. 이 글을 쓰는 것만 봐도 가늠이 되겠지만 저 역시 한 명의 개발자로서, 환경에 변화를 대비하게 되면서 정리 차원에서 그리고 팀 내에 공유 차원에서 포스트를 작성하게 되었습니다.

자바의 기본 구성

Oracle의 유료 정책을 논하기 전에 자바의 복잡해괴한 -_-;; 버전들과 종류들에 대해서 먼저 이해 할 필요가 있습니다. 우선 가장 첫번째로 가장 기본적인 Java 의 구성에 대해서 말해볼까 합니다.

자바는 JDK 와 JRE 라는 형태로 나누어져 있습니다. JDK(Java Develop Kit) 란 이름에서 보이듯이, JDK는 이름 그대로 자바 기반의 소프트웨어를 개발하는 데에 필요한 개발 도구가 내장 되어 있는 키트 이고, JRE(Java Runtime Environment)는 실제로 자바를 실행하기 위한 JVM이 포함 된 실행 플랫폼입니다.

JVM ((Java) Virtual Machine)

JVM은 자바 소스 코드로 부터 자바 컴파일러를 통해 만들어진 class 파일이 실제 OS에서 실행 될 수 (실행 해주는) 플랫폼입니다. 자바는 이 JVM 덕에 OS가 윈도우이든 리눅스이든 어떠한 OS 에서도 컴파일 된 class 파일과 JVM이 설치만 되어 있으면 소프트웨어를 구동할 수 있습니다.

이런 마법이 가능한 이유는 자바에서의 컴파일이란 class 파일이 이진 데이터(기계어)로의 변환이 아닌 Java Byte Code 로 JVM에서만 해석될 수 있는 것으로 만드는 형태이기 때문입니다. 이런 형태 탓에 종종 자바에는 컴파일 언어이면서도 스크립트 언어와 같은 인터프리트 언어의 성격을 갖고 있다고도 책에서 소개 되곤 합니다.또한 class 가 Java Byte Code 이기에 자바란 언어는 컴파일 언어치고는 디컴파일이 쉽게 되는 부분도 있습니다.

심지어는 Java Byte Code 로만 컴파일이 되면 되는 부분을 응용해서 Java 프로그래밍 문법(syntax) 이 아닌 다른 스타일의 프로그래밍 문법으로 Java Byte Code 를 만드는 JVM 기반의 언어들이 등장하게 되었습니다. 예를 들면 Groovy 나 Go, Gradle, 코틀린, 스칼라 등이 있겠습니다. 이런 부분때문에 이 작은 소제목을 Java Virtual Machine 이라고 소개 하지 않고 (Java) Virtual Machine 이라고 타이틀을 적은 이유입니다.

JRE ((Java) Runtime Enviroment )

JRE 는 이름 그대로 (자바) 실행 환경입니다. 웹서핑을 하려면 ‘웹 브라우저’를 설치해야 하는 것처럼 자바 소프트웨어를 실행 할 수 있는 최소 요건입니다.

JRE가 JVM 자체가 아니냐고 물어보면 반은 맞고 반은 틀리다고 볼 수 있습니다.정확히는 JVM 만 포함되는 것이 아니고, 다양한 OS 에서 구동할 수 있도록 JVM Core 를 보좌 하는 실행 환경 라이브러리들이 포함된 것이 JRE 이기 때문입니다. (윈도우 JRE나 리눅스 JRE의 경우 이 JRE의 라이브러리 구성요소가 다름.)

결국 자바의 장점인 다양한 플랫폼에서 실행을 할 수 있도록 해주는 것은 Only JVM 이 아닌 JRE가 만들어져야 비로소 가능해집니다.

JDK ((JAVA) Development Kit)

자바 컴파일러를 포함한 자바 소프트웨어를 개발하기 위한 도구의 집합체입니다. 개발 영역에서 중요한 컴파일러와 함께 서비스 운영 상에서 자주 사용 되는 덤프(dump) tool 이나 모니터링 툴들을 하나로 모은 것이 JDK 입니다. 또한 JDK 에는 JRE가 포함되어 있습니다.

자바의 종류와 버전 네이밍

자바는 다른 언어와 달리 버전 족보가 기괴 -_-; 합니다. Java History WIKI를 보면,

다른 언어들의 버전명이 단순 숫자로만 불리우는 것에 비해 Java version 은 조금 복잡합니다. 기본적으로 자바는 se, me, ee 3개의 플랫폼 별로 나뉘어져 있습니다.

java se?, ee?, me?

자바를 개발한 썬에서 (지금은 Oracle 이 인수) 플랫폼 별 모델을 나누는 비지니스 전략을 취하면서 아래와 같이 세분화 되었습니다.

SE 는 일반 컴퓨팅의 목적을 의미하고, EE는 비지니스 서비스 환경, ME 는 임베디드 환경을 목적으로 합니다.

위의 버전 히스토리에 나오는 j2se 와 java se 는 같은 의미를 가집니다. j2se 는 java 2(to) standard edtion 이고, java se는 java standard edtion 입니다. 그냥 표기를 java se 로 더 간략하게 바꾼 것입니다. java ee 및 me 도 마찬가지로 j2ee -> ee , j2me –> me 입니다.

java se

자바 자체에 대한 표준은 JSR(Java Spec Request) 에서 정의를 하고 있으며, SE는 JSR 에서 기본 컴퓨팅에 해당하는 기능들을 묶은 Spec 입니다. java se 를 구현한 것으로는 openjdk 가 대표적이고 이를 base로 하는 OracleJDK, Zulu JDK 등이 있습니다.

java ee

ee는 엔터프라이즈 서버 기능이 포함되어 있는 기능들에 대한 spec 이 정의 된 모델로, 대표적으로 엔터프라이즈 서버 개발에서의 EJB(Enterprise Java Bean) 기능이나 웹 브라우저에 자바 어플리케이션을 실행하는 web start kit 과 같은 것들이 있습니다. java ee 를 구현한 것으로는 대부분의 WAS(Web Application Server)가 해당합니다. 티맥스의 제우스나 Oracle 의 Weblogic, Redhat의 Jboss 등이 있습니다. 주변에서 흔하게 볼 수 있는 Tomcat 같은 WAS의 경우에는 서블릿 컨테이너로서의 역활만 할 뿐 Java EE 의 Full Spec 을 구현한 것이 아닙니다. 그래서 톰켓을 EE라 하지 않고 경량 컨테이너라고 부르기도 합니다.

java me

me 는 제 개인적으로는 많이 생소한 편이었습니다. me는 소형 임베디드에서 구동 될 java 를 뜻 하고 있으며, Java me 의 JSR 을 보면 Mobile 기기에 대해서도 타겟팅 되어 있는 것을 확인해 볼 수 있습니다. 이 부분에 대해 생각 해 볼 만한 것으로 android Os 는 java me 를 구현한 것인걸까? 하는 의문을 가질 수도 있습니다만 이 2가지는 전혀 별개의 다른 존재입니다.

android 는 java 문법을 사용할 수 있지만 dalvik vm (지금은 Android RunTime 으로 변경 )을 기반으로 어플리케이션이 실행 됩니다. java me 는 과거에 몇몇 모바일 폰에서 사용이 되곤 했으나, 최근에 거의 사용 되고 있지지 않은 추세입니다(Java ME wiki 기준으로는 jre 1.3 에서 지원에서 멈추었다고 하니, 거의 보존만 된 상태라고 볼수도 있겠습니다.)

예를 들면 ‘삼성의 E2650’ 모바일 폰이 Java me 기반으로 개발되었다는 것을 알수 있습니다. 또한 samsun-java-sdk 라는 글을 보면, java me 를 구현한 samsung sdk 가 있었음을 알 수 있습니다. 호달달..

j2se 에서 java se로의 변화

재밌는 점은 j2se(j2ee,j2me)에서의 java se(ee,me)로의 네이밍 변경이 일어난 부분입니다. 이에 대해서는 명확한 정보를 찾기가 어렵기에 약간의 상상을 해보면 java se 라 불리우게 된 시기는 java se 6 부터로, 이 때가 썬이 Oracle 에 인수 될 준비를 한 시기 이기도 합니다. (인수 발표 2009년, se6 개발 2006) 아마 Oracle 에서 버전 네이밍을 변경하길 원했던 게 아닐까 하는 생각을 해보고 있습니다.

java se 8 == java 8 == java jdk 8?

위에서도 말했지만 대중적인 의미에서 Java SE 의 버전을 Java Version 과 동일 시 하여 불리곤 합니다. 또한 컴파일러나 JVM 의 구현에 대한 사양이 Java SE에 있기 때문에, 딱히 자바 버전에 다른 명시를 하지 않은 경우에 java se 8 == jdk 8 == java 8 인 셈 됩니다.

자바를 사랑하지만… 참 이런 것은 조금 난해하긴 합니다. -_-;;

OpenJdk

OpenJDK는 썬 마이크로시스템이 오라클에 인수가 되면서, 자바를 오픈소스화 하기위해 만들어진 프로젝트입니다. 현재는 오라클이 운영 지원을 담당하고 오라클 엔지니어와 오픈소스 진영에서 합작으로 개발 되고 있는 자바 SE 의 구현체 입니다(공식). 오픈 소스 프로젝트이다 보니 누구나 개발에 참여하고, 또한 무료로 사용이 가능합니다. OpenJDK 관리하는 프로젝트로는 아래와 같습니다.

결국 일반적으로 사용 되는 자바의 모든 것을 개발한다고 보면 됩니다.

안정성이 조금 떨어졌던 과거에 비해 최근에 와서는 성능적으로나 안정성에서 충분히 입증이 되면서 자바 se 구현체의 표준으로 인정받고 있습니다.

표준의 사례를 예로 들면 openjdk 를 base로 하는 oraclejdk 나, Azul 사의 ZuluJdk, 트위터의 경우 openjdk 를 튜닝한 twitterJdk 등이 있습니다.

OpenJDK는 사용하기가 까다로운 녀석 입니다.-_-;; OpenJDK 프로젝트는 소스코드만 개발 할 뿐, JDK를 빌드하고 쉽게 사용할 수 있는 패키지를 따로 제공 하지 않기때문입니다. official site를 보면 그나마 리눅스 한해서만 관리해주고 있지만, 윈도우나 맥 사용자는 개발자가 직접 소스코드를 받아서 빌드 해야합니다.

이러한 이유는 프로젝트에 포함 된 여러 자바 컴포넌트들이 다양한 라이센스와 비공개 유무로 복잡하게 엮이었기 때문이라고 합니다. 이에 대한 이야기는 네이버D2블로그에 잘 정리되어 있습니다.

이런 불편한 OpenJDK와는 반대로, Oracle JDK 에서는 다양한 OS 에서 쉽게 사용할 수 있게 패키징해서 제공해주었기에 위에서 언급한 것처럼 많은 한국 자바 개발자들은 Oracle JDK 를 자주 사용했습니다.

저 역시 학원에서 강의를 들었을 때에는 Oracle JDK 를 다운 받아 공부했었습니다. 문제는 Oracle 의 Java 정책이 바뀌었기 때문에 앞으로 OracleJDK 의 신버전들을 사용할 수가 없게 되어서 OpenJDK를 개발자가 직접 빌드해서 사용해야할 지도 모르는 상황이 되었습니다. -_-;

다행히도 윈도우 환경에서는 ojdkbuild 오픈 프로젝트나, azul 의 zulu jdk 에서 openjdk를 패키징 해주는 프로젝트들이 있기 때문에 이곳에서 다운로드 받아 편하게 설치하면 됩니다.

zulu 에 대한 설명은 아래에서 다루겠고, oracle jdk 에서 zulu jdk 를 설치하는 과정은 zulu jdk 설치 포스트에 작성했습니다.

HotSPOT

OpenJDk의 설명이나, Zulu 의 소개글을 보면 HotSPOT이란 단어가 많이 나옵니다. 예전 OracleJDK를 설치해서 사용할 때에도 java -version 명령을 찎어보면 HotSPOT VM 으로 나오는 걸 쉽게 볼 수 있습니다. 이 녀석은 도대체 뭐하는 친구 일까요?

자바 가상 머신 위키를 보면 아래와같은 설명을 볼 수 있습니다.

핫스팟 가상 머신(영어: HotSpot Virtual Machine)같은 고성능 가상 머신 구현

쉽게 말해 JVM 의 구현체이고, 이름이 HotSPOT 인 JVM 입니다. 기존에 SUN에서 개발했었고, 현재는 Oracle이 이에 대한 소유권을 가지고 있습니다. 개발은 OpenJDK 진영에서 개발 관리 되고 있습니다.

다른 구현체들로는 JRockit, IBM J9 와 같은 다른 벤더들의 구현체들들이 있는 데.. 대략 20개 이상이 있는 걸 볼 수 있습니다.

여기서 재밌는 것은 위키에서 Hotspot에 대한 설명이 압권인데,

the primary reference Java VM implementation. Used by both Oracle Java and OpenJDK.

primary reference 라고 합니다. 호달달..

그리고 아래에서 설명할 ZuluJDK 가 OpenJDK를 base로 하기 때문에 OracleJDK, OpenJDk , ZuluJDK 도 모두 같은 HotSPOT을 사용하게 되는 셈입니다. 결론에서도 말하겠지만 이런 부분이 있기에 OracleJDK에서 OpenJDK나 Zulu를 쓰더라도 유료 지원 서비스의 디테일한 차이 외에는 퍼포먼스 적으로 없다고 볼 수 있습니다. (Zulu 를 만든 Azul 사에는 Hotspot 대신 Zing 이라고 부르는 Azul 에서 만든 JVM 도 있습니다.)

scala 와 hotspot

여담으로 자바와는 조금 다른 이야기이지만, JVM 기반의 언어인 스칼라는 당연하겠지만 jvm 환경만 준비되면 되기에 jre만 설치해주면 됩니다.

다만 스칼라에서 official site 에서 권장 스펙을 보면 SUN의 HotspotVM 을 권장 한다고 적혀 있습니다. 이는 결국 openjdk 를 쓰라는 말과 거의 같은 셈입니다.

hotspot 이 primary reference 라 불리우는 이유에 대해 어느정도 수긍이 되네요. -_-;;

Zulu

zulu는 azul에서 만든 jdk 입니다. 정확히는 만들었다기 보다는 기본 base인 openjdk 를 다양한 OS에 쉽게 사용될 수 있게 openjdk 빌드 바이너리를 제작하고 QA까지 마쳐서 패키지로 배포해주는 형태입니다.

기본적으로 zulu는 오픈 소스 프로젝트로 운영되고 있으며 당연히 무료 입니다. 별도의 유료 모델로 과거 Oracle 의 기존 유료 구매와 비슷한 zulu enterprise가 있으며, hotspot 과 동등하거나 그 이상의 퍼포먼스를 가진다는 유료 JVM인 zing 이 있습니다. Zulu는 openjdk 를 base로 하기에 자바의 표준 스펙으로 구현되었음을 의미하는 TCK(Technology Compatibility Kit) 인증이 포함 되어 있습니다.

zulu 같은 경우엔 그냥 openjdk를 쉽게 설치 해주는 starter 란 느낌으로 접근하면 쉽습니다.

TCK

TCK 는 Java 의 개발 사양인 JSR(Java Spec Request) 를 구현한 자바 구현체(JDK)에 부여하는 라이센스 입니다. 자세한 것은 .. TCK.TCK WIki 를 참고부탁드립니다.

OracleJDK

OracleJDK 는 OpenJDK 를 base 로 하고 있습니다. 성능 적인 튜닝이나 Oracle 만의 엔터프라이즈 기능이 담긴 컴포넌트 를 몇 개 더 추가해서 제작하고 있습니다.

한국과 OracleJDK

한국의 대부분 SI 시장에서는 Oracle 이란 회사와 인연이 참 많습니다. DB 부터 코딩을 하는 자바 JDK 까지 Oracle 을 많이 사용하고 있습니다. 흔히 도장찍기라고 말하는 한국식 SI 자바 개발자를 양성하는 교육소에서도 가장 첫번째 수업으로 Oracle JDK 을 설치하는 과정을 배우는 걸 쉽게 볼 수 있는 데, 한국에서의 자바 프로그래머에겐 윈도우 환경에 OracleJDK install를 설치해서 시작하는 것이 Hello World와 같은 느낌이었습니다.

JAVA라는 언어 자체는 GNU 라이센스로 무료입니다. 문제의 관심사는 대부분의 한국 개발자가 사용하는 Oracle JDK 가 무료인가? 유료인가 입니다.

결론적으로 말하면 개발 환경에 대해서는 Oracle JDK 가 무료였습니다. Oracle Java Licensing : Free of Charge vs Commercial Use를 보면

The current version of Java Standard Edition (Java SE8) can be used free of charge and is available for redistribution for “general purpose computing”. A general-purpose computer is a computer that, given the appropriate application and required time, should be able to perform most common computing tasks.

라 나오고, 해석해보면 범용적인 컴퓨팅에서는 무료라고 명시 되어 있습니다. 요 범용적인 컴퓨팅의 표현이 애매하지만, 임베디드 환경을 제외한 일반적인 컴퓨팅 작업을 말하는 것으로 이는 코딩이나 프로그래밍도 해당되는 내용입니다. 결론적으로 보면 프로그래밍 개발 환경에 대해서는 무료라는 말이 되고 업무 PC에서도 같이 적용이 됩니다.

이는 OracleJDK SE 에 반영된 BCL 라이센스 원문 에서도 확인할 수 있습니다.

  1. LICENSE TO USE. Subject to the terms and conditions of this Agreement including, but not limited to, the Java Technology Restrictions of the Supplemental License Terms, Oracle grants you a non-exclusive, non-transferable, limited license without license fees to reproduce and use internally the Software complete and unmodified for the sole purpose of running Programs. THE LICENSE SET FORTH IN THIS SECTION 2 DOES NOT EXTEND TO THE COMMERCIAL FEATURES. YOUR RIGHTS AND OBLIGATIONS RELATED TO THE COMMERCIAL FEATURES ARE AS SET FORTH IN THE SUPPLEMENTAL TERMS ALONG WITH ADDITIONAL LICENSES FOR DEVELOPERS AND PUBLISHERS.
  1. 라이센스 사용. 다운로드 받은 공개용 OracleJDK 를 수정하거나 튜닝 하지 않고, BCL 라이센스에 승인하고 다운로드 받겠다고 서명한 유일한 사람에 한해서만 무료로 쓸 수 있는 제한적 라이센스. BCL을 동의하고 합법적으로 공개용 다운로드판에 한해서만 프로그램을 실행하기 위한 목적에는 상업적 이용으로 보지 않는다.

These Supplemental License Terms add to or modify the terms of the Binary Code License Agreement. Capitalized terms not defined in these Supplemental Terms shall have the same meanings ascribed to them in the Binary Code License Agreement. These Supplemental Terms shall supersede any inconsistent or conflicting terms in the Binary Code License Agreement, or in any license contained within the Software.

A. COMMERCIAL FEATURES. You may not use the Commercial Features for running Programs, Java applets or applications in your internal business operations or for any commercial or production purpose, or for any purpose other than as set forth in Sections B, C, D and E of these Supplemental Terms. If You want to use the Commercial Features for any purpose other than as permitted in this Agreement, You must obtain a separate license from Oracle.

A. 상업적 특징. 내부 사업 운영이나 상업적 목적 또는 생산을 목적으로 하는 경우에는 아래 B,C,D,E 절에 명시 된 목적 외에는 상업적으로 치부합니다.

B. SOFTWARE INTERNAL USE FOR DEVELOPMENT LICENSE GRANT. Subject to the terms and conditions of this Agreement and restrictions and exceptions set forth in the Java SE LIUM incorporated herein by reference, including, but not limited to the Java Technology Restrictions of these Supplemental Terms, Oracle grants you a non-exclusive, non-transferable, limited license without fees to reproduce internally and use internally the Software complete and unmodified for the purpose of designing, developing, and testing your Programs.

B. 개발을 위한 소프트웨어 사용권. 프로그램을 설계, 개발 및 테스트 할 목적으로 사용하고 패키징을 훼손하지 않고 내부적으로 사용하는 경우.

대충 해석하면, 공식 사이트에서 BCL 라이센스를 수락한 공개용 다운로드 판에 대해서는 단순 개발을 위한 환경에 대해서는 상업적인 것으로 보지 않는다는 이야기 입니다. 단, 이는 다운로드 한 개인과 Oracle 간의 계약이기에 (다운로드 받기 전에 BCL 라이센스를 수락하는 라디오 버튼 기억나시죠?) A 사용자가 받은 OracleJDK 패키지를 B,C 사용자가 나눠서 다운로드 받아 설치한 경우에는 라이센스 위법이 됩니다.

정리를 하면 합법적인 공개용 다운로드 페이지에서 BCL 서명에 수락하고 다운로드 한 경우에는 사무실에서 개발을 하더라도 무료입니다. 다만 BCL 에 수락하지 않은 제 3자에게 다운로드한 패키징을 전달하는 것은 위법이고, 다운로드한 패키징을 디패키징하거나 수정하는경우에는 위법입니다.

재밌는 점은 이런 부분 때문에 JENKINS 의 경우에 Java 환경 변수를 셋팅하는 과정에서, JDK를 자동 설치하는 구문에 BCL 라이센스를 승인한 Oracle 사용자의 ID 와 PW 를 요구하는 부분이 있습니다. 이는 OracleJDK가 무료로 사용은 가능 하지만, 다운로드에 대해서는 1인에 한한 BCL 라이센스를 승인을 해야하기 때문에 그러한 것을 알 수 있습니다.

문제의 바뀐 Oracle 의 유료 정책

라이센스 정책이 세세하게 바뀐 것을 알아보기에는 너무 양이 많기에 (관심도 없고 -_-;) 무료 사용자 입장에서의 변경 된 것을 위주로 알아보겠습니다.

앞에서 말씀드린 것처럼 Oracle 에서는 범용적인 컴퓨팅에서의 무료인 Java SE 와 비범용적인 (유료) Java SE 를 따로 구분해서 다운로드 페이지를 만들었습니다. 문제는 2019년 1월 부터는 업데이트를 위해서는 My Oracle Support(Oracle Subscription) 라는 별도의 서비스를 통해서 다운로드 할 수 있어진다고 합니다.

아래는 Oracle Java SE 원문에서 발췌 한 내용으로

End of Public Updates for Oracle JDK 8

Oracle will not post further updates of Java SE 8 to its public download sites for commercial use after January 2019. Customers who need continued access to critical bug fixes and security fixes as well as general maintenance for Java SE 8 or previous versions can get long term support through Oracle Java SE Subscription or Oracle Java SE Desktop Subscription. For more information, and details on how to receive longer term support for Oracle JDK 8, please see the Oracle Java SE Support Roadmap.

End of Public Updates Oracle will make available to Commercial Users and Personal Users updates to publicly available versions of Oracle Java SE in accordance with the table below. Once a Java SE version reaches “End of Public Updates”, any further updates will be available only to Customers and accessible through My Oracle Support and via corporate auto update where applicable (Visit My.Oracle Support Note 1439822.1 - All Java SE Downloads on MOS – Requires Support Login).

Oracle does not plan to migrate desktops from Java SE 8 to later versions via the auto update feature. This includes the Java Plugin and Java Web Start. Instead of relying on a browser-accessible system JRE, we encourage application developers to use the packaging options introduced with Java SE 9 to repackage and deliver their Java applications as stand-alone applications that include their own custom runtimes.

Oracle will continue to provide Public Updates and auto updates of Java SE 8, until at least the end of December 2020 for Personal Users, and January 2019 for Commercial Users.

지금 많이 사용 되는 Oracle SE 8 을 예로 들면 2019년 01월 부터의 버전에 대해 업데이트는 제한 되고, 개인 사용자 및 유료 구독자에 한해서만 2020년 12월말까지 업데이트 받을 수 있다고 나옵니다.

특히 벌써부터 Java 11 버전 이후에는 BCL 라이센스가 아닌 Oracle Technology Network License 로 갱신되어 있습니다.

License Rights and Restrictions

Oracle grants You a nonexclusive, nontransferable, limited license to internally use the Programs, subject to the restrictions stated in this Agreement and Program Documentation, only for the purpose of developing, testing, prototyping and demonstrating Your Application and not for any other purpose. You may allow Your Contractor(s) to use the Programs, provided they are acting on Your behalf to exercise license rights granted in this Agreement and further provided that You are responsible for their compliance with this Agreement in such use. You will have a written agreement with Your Contractor(s) that strictly limits their right to use the Programs and that otherwise protects Oracle’s intellectual property rights to the same extent as this Agreement. You may make copies of the Programs to the extent reasonably necessary to exercise the license rights granted in this Agreement.

Further, You may not:

아래의 경우에는 사용할 수 없다.
  • use the Programs for any data processing or any commercial, production, or internal business purposes other than developing, testing, prototyping, and demonstrating your Application;

응용 프로그램 개발, 테스트, 프로토 타이핑 및 시연 이외의 어떠한 모든 데이터 처리 또는 상업적, 생산적 또는 내부 비즈니스에서의 프로그램 실행을 할 수가 없다.

Oracle Technology Network License 는 일반적인 사용에는 기존과 같이 무료이지만, 상업적인 공간에서의 사용에 대한 제한성이 대폭 강화되었습니다. 예전의 BCL 라이센스가 아닌 Oracle Technology Network License 로 갱신 된 버전의 OracleJDK 의 사용이 어려워졌습니다.

공개 SW 제단에서는 아래와 같이 명시되어 있습니다.

오라클 Java SE가 유료화 될 예정이다. 그동안 유/무료 버전이 혼재되어 있었으나, 2019년 1월부터 Oracle JDK Java SE의 모든 버전이 상용화된다. 아울러 비용 청구 방법도 개편됐다. 오라클은 1회성 영구 라이선스 대신, 서브스크립션 모델 개념을 도입했다. 사용자는 Java SE 라이선스를 기간별로 구매하여 사용할 수 있다.

Java SE 라이선스를 구매하지 않을 경우, 공개SW 기반의 OpenJDK를 활용하면 Java를 무료로 이용할 수 있다. Java 11이상부터 Oracle JDK는 유상으로만 공개되며, 대신, Java 11에서 Oracle JDK와 동일한 기능 및 품질을 갖춘 OpenJDK 바이너리가 무료로 제공될 예정이다.

Oracle 제품 이사장인 Donald Smith 의 공식 입장을 보면 OracleJDK 는 유료 전용으로, OpenJDK 를 공개용으로 노선을 잡은 것을 알 수 있습니다.

Oracle’s BCL-licensed JDK historically contained “commercial features” that were not available in OpenJDK builds. As promised, however, over the past year Oracle has contributed these features to the OpenJDK Community, including:

OracleJDK 에는 OpenJDK 에 없던 상용 기능이 포함되었으나, 앞으로 OpenJDK 에는 OracleJDK 에 있던 아래 일부 기능들을 제공합니다.

Java Flight Recorder,

Java Mission Control,

Application Class-Data Sharing, and ZGC.

Oracle 유료 라이센스를 사용하는 이유

기본적으로 공개용 페이지 외에 유료 전용 다운로드 페이지에서 다운로드 받는 패키지는 서로 다릅니다. 유료판에는 유료 컴포넌트(advanced kit)들이 포함되어 있습니다. 또한 Oracle 의 유료 라이센스를 취득하면 좋은 점은 라이센스에서 지원하는 범위 내에서 Oracle 의 기술 지원을 받을 수 있으며, 특정 자바 버전들은 LTS(Long Time Support) 업데이트를 제공 받을 수 있습니다.

예를 들어 위에서 언급 된 java se 8 버전으로 만들어진 소프트웨어를 운영하면서 시간이 흘러 발생할 수 있는, 잠재적 버그나 보안 업데이트를 Oracle 을 통해 지원 받을 수 있습니다.

특정 OS와 자바 버전으로 인한 버그 리포트가 발생했을 경우, 이를 해결 하기 위한 소스코드 로직의 변경과 추가적인 개발 비용이 발생하지 않고 발 빠르게 Oracle 의 패치를 통해 해결 할 수 있게 되는 셈입니다.

이는 소스코드를 변경할 떄 들어가는 인건비와 변경 후의 side effect 가 발생할 수 있다는 불안함 보다는 좋은 선택이 될 수 있습니다. 또한 운영 중의 성능 튜닝이나, 트러블 슈팅도 자문 받을 수 있고 튜닝으로 해결하기 어려운 패치작업을 지원 받을 수 있습니다. 이러한 성능적인 이유에서도 많은 업체들이 Oracle 유료 라이센스를 구매하고 있습니다.

Oracle 의 비지니스 전략

이러한 Oracle 의 정책 변화에 대해서는 아래의 이유를 생각해 볼 수 있습니다. 최근에 대부분의 서비스가 클라우드 기반으로 플랫폼이 대거 이동함에 따라 서버 N 당의 라이센스로 측정되던 요금이 가변형(오토스케일아웃 등)으로 들쑥날쑥 해지면서 Oracle이 손실을 보고 있었기에 전략을 바꾸게 된 것이 아니었나 하는 생각을 하고 있습니다.

기존에는 서버 N 개수로 라이센스를 구매하는 형태였으나, 1개만 구입하고 가변형으로 N 개 이상의 서버를 잠시 운영했다가 없얬다가 하는 경우가 발생하니 비용 측정이 애매해진 것이겠죠. 그래서 라이센스 구매라던 형태에서 라이센스 구독(년 간) 이란 개념으로 바뀌게 된 것이라 생각하고 있습니다. 이것에 대한 것은 Okky 에서의 논쟁 을 보면 재미난 이야기를 살펴 볼 수 있습니다.

Oracle 의 로드맵

사실상 OracleJDK 11 이후에는 완전 유료화 선언이기에, OpenJDK가 앞으로 어떻게 될 것인가가 중요합니다. Oracle 은 OpenJDK 와 OracleJDK 를 사실상 모두 소유하고 있기 때문에, Oracle 의 앞으로의 로드맵이 굉장히 중요합니다. 앞으로의 Oraclejdk 과 Openjdk 간의 버전 로드맵은 아래와 같습니다.

흥미로운 것은 openjdk는 lts(long time support) 가 없습니다. 덩달아 생명 주기가 6개월로 짧아져서 업데이트란 개념보다는 대부분 업그레이드 형태가 될 것으로 생각됩니다.-_-;; 반면 OracleJDK 의 로드맵을 보면 인기 JDK 에 대해 장기 지원(LTS) 를 제공함으로써 유료 라이센스로의 전환을 시키도록 하곘다는 것이 보입니다.

예를 들어서 Java 10(18.3 이 java se 10 입니다)버전을 예로 들어보면.. 최종 릴리즈가 될 때까지는 문제가 없었던 기능이 최종 릴리즈 이후 몇 달 뒤에 보안 문제가 발생했다고 가정을 해보겠습니다. openjdk 를 사용해서 무료로 서비스 하던 경우에는 소스코드 로직을 변경하거나 다음 메이저 버전인 19.3 을 버전 업해야 합니다. 업데이트가 아닌 메이저 업그레이드일 경우에는 메소드 명이 바뀌거나 패키지 명이 바뀌는 syntax 문제가 발생할 수도 있기에 소스코드에 결국은 손을 대야합니다. 이 말은 새로이 빌드를 해야한다는 이야기이고, Core 한 기능에서의 문제 발생이라면 전체 재설계가 될 수도 있구요. 또한 dependency 를 갖는 library 에서 호환성 문제가 발생할 수 있습니다.

반면 OracleJDK 를 사용하면서 LTS 를 받고 있는 유료 구독자라면 Oracle 에서 제공하는 누구보다 빨리 제공해주는 업데이트를 적용 하면 됩니다. 이렇게 되면 소프트웨어에 손을 대지 않고도 해결할 수 있습니다.

결론적으로 보면 Oracle 은 무료인 OpenJDK 의 생명 주기를 짧게 만들어버려서, 비지니스 시장에서 유료 버전인 OracleJDK 의 사용을 반강제화 하려고 하는 의도를 알 수 있습니다.

그래도 사내에 개발 조직이 있으면서 서비스를 운영하고 있는 회사라면 대부분의 경우 (개발자들이 갈려나가겠지만 -_-;) OpenJDK를 도입해서 잦은 버전 업을 통해 무료로 자바를 서비스 할 수 있습니다.

정리

정리를 하면 아래와 같습니다.

사실상 OracleJDK는 올해까지는 무료였습니다. 올해까지 제공 되는 BCL 라이센스 기반의 버전에 대해서는 OracleJDK는 그냥 사용해도 됩니다. 다만 2019년 01월 부터 이후의 버전을 업데이트하거나 얻기 위해서는 유료 구독에 가입해야 합니다.

이에 대한 대안으로 OpenJDK를 사용하는 것을 고려해봐야지만, 개발 환경에서의 사용성이 불편함으로 OpenJDK를 base로 하는 Zulu 등의 사용을 생각을 해보아야합니다. 다만 Zulu 이 녀석도 OpenJDK 를 base로 하기에 Azul 의 LTS 유료 플랜을 구매하지 않는 이상 보안 업데이트나 성능 업데이트라는 명목에 마이너 버전이 아닌 메이저 버전 업그레이드를 해주어야 합니다, 자바의 라이프사이클이 6개월로.. 짧아졌으니깐요.

상황에 따라 버전 업 없이도 무리 없이 운영할 수도 있습니다. 다만 여러 이유로 6개월 마다 메이저 업그레이드 없이 그냥 사용하더라도, 비지니스의 핵심이 되는 서비스의 경우에는 어떠한 상황에서도 대비할 수 있게 해야하기 때문에, (자바는 하위 호완에 매우 긍정적인 언어이지만, 어떻게 될 지는 뚜껑을 열어봐야 함으로.. -_-;;) 메이저 버전 업그레이드 이후에 일어날 Side Effect 이 일어날 것을 감당하려면 자주 업그레이드 해주는 것이 용이합니다. 예를 들어 자바 8에서 11로 껑충 뛰기보다 자바 8.. 9.. 10.. 11 이렇게 가는 것이 용이하다는 말이죠. 그래서 잦은 리팩토링이 필요해지고 개발자들의 손이 많이 바빠질 것입니다.

따지고 보면 최근 MSA 패러다임이 확산화 되면서 어플리케이션이 서비스 관점에서 작은 컴포넌트로 구성되는 경우가 많아 이미 잦은 리팩토링을 권장하고 있던 분위기 이기도 합니다. 고로 잦은 메이저 버전 업그레이드에 대한 거부감은 크게 없을꺼란 생각을 가지고 있습니다. (어디까지나 제가 몸 담고 있는 웹 개발 영역에서의 이야기입니다.)

문제는 관공서나 은행과 같은 대형 프로젝트인 경우에는 대부분 레거시하고 모노리스한 경우가 많기 때문에 Oracle 의 바뀐 구독형 라이센스 정책 때문에 운영팀이나 유지보수가 계약 된 개발사에서는 머리가 아플 수 있습니다. 구매와 구독의 차이는 엄청 다를테니깐요. -_-;; (구독 비용보다 아웃소싱 계약이 더 싸다면.. 개발자를 갈아넣는 사태가..)

예를 들어 기존에 한번 구매하면 평생 소장 라이센스 였다면, 이제는 1년 마다 N 만원씩 구독 갱신을 하는 형태이기에 생각을 해보아야 할 겁니다. 그래서 이러한 시장 상황을 기회로 보곤 Azul 에서 적극적인 마케팅을 하고 있습니다.

(Official Site 에서도 아얘 대놓고 마케팅 중.. -_-;; 호달달..)

결론적으로 개발자 입장에서는 개발 pc에 설치된 OracleJDK를 제거하고 대안인 Azul 로 마이그레이션 하더라도 태생이 같기 때문에 문제는 없습니다. 심지어 OracleJDK 의 일부 유료 컴포넌트들을 Openjdk에 무료로 포함해서 풀겠다고 선언헀으니깐요. 아무쪼록 OracleJDK의 빈 자리를 OpenJDK 가 잘 채워주길 바라면서, 앞으로도 별 일 없이 해피 코딩을 할 수 있는 환경이 되면 좋겠습니다.

zulu 설치에 관한 것은 zulu jdk 설치 에서 확인하실 수 있습니다.

레퍼런스

https://d2.naver.com/helloworld/1219

http://www.holaxprogramming.com/2014/09/24/java-open-jdk/

https://www.reddit.com/r/java/comments/8jvv8e/what_would_be_the_reasons_to_use_the_zulu_build/

https://stackoverflow.com/questions/25936712/what-is-the-difference-between-oracle-jdk-8-and-open-jdk-8

https://www.reddit.com/r/java/comments/6g86p9/openjdk_vs_oraclejdk_which_are_you_using/

https://www.quora.com/What-is-it-like-to-use-Azul-Systems-Zulu-JVM

https://okky.kr/article/482664

http://jsonobject.tistory.com/395

https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk

http://offbyone.tistory.com/288

https://blog.joda.org/2018/08/java-is-still-available-at-zero-cost.html

https://medium.com/codefx-weekly/no-free-java-lts-version-b850192745fb