본문 바로가기
IT 공부/자바와 웹 애플리케이션

[자바] - Java 플랫폼을 둘러싼 모든 개념들 총정리

by exdus3156 2023. 12. 31.

Q: JDK란?

Java Development Kit 의 약자로, 자바로 개발을 하는 사람들을 위한 모든 필요한 소프트웨어 묶음을 말한다. 따라서 자바 실행 프로그램(java.exe)뿐만 아니라 컴파일러(javac.exe), jar.exe, javadoc.exe, 표준 라이브러리 코드들을 전부 포함한다.


Q. JDK의 버전 숫자에 대해서

오라클(oracle) 회사에서 지속적으로 자바 문법과 표준 라이브러리에 대한 명세를 업데이트하고, 업데이트 숫자를 붙여 각 버전을 구분한다. 이걸 통틀어서 Java 13, Java 21, ... 이런 식으로 부른다.

특이한 점은 Java 8 이하의 버전들은 Java 1.8, Java 1.6, .. 이런 식으로 1.x 형태로 표기하는데, 이는 초기 자바 진영이 메이저 업데이트를 1.x 형태로 표기한 관례 때문이다. 그러나 8번 이후 Java 9 부터는 1.x 형태가 아니라 숫자를 그대로 표기하게 되었다. 자바9 부터는 Java 9, Java 10, ... 처럼 표기된다. 그러므로 만약 자바 8버전을 사용하라는 지침이 있다면 Java 8을 찾지 말고 1.8을 다운받아 사용하면 된다. Java 1.8이란 Java 1 버전의 8번째 패치가 아니므로 헷갈리지 말자.


Q: Java SE 란 무엇인가?

SE는 Standard Edition의 약자다. 자바 플랫폼의 표준 사양, 스펙을 말한다. 여기서 플랫폼이란, 자바라는 언어의 문법, 가상 머신의 스펙, 표준 API 라이브러리의 명세, 바이트코드 명세, 컴파일러 명세 등을 통틀어 말하는 아주 큰 개념이다.

JDK와 구분해야 한다. JDK는 자바 소프트웨어 개발을 위해 필요한 실행 가능한 소프트웨어 집합을 뜻한다. Java SE는 자바 전체 플랫폼에 대한 스펙, 명세, 문서 같은 개념이다.

아래와 같은 그림이 JDK와 JavaSE의 차이를 설명해준다. 즉, JavaSE는 JDK를 포함해 표준 라이브러리 API, 구현코드, 각종 툴(javac, jvm, jar, javadoc, ..)에 대한 스펙, 명세를 말하는 것이다.

그림 클릭 시 공식 홈페이지 이동

버전과 관련해서 설명하자면, 예를 들어 JDK 11 이라고 하면 Java SE 11 명세를 지원하는 구체적인 개발 소프트웨어들의 묶음이라고 이해하면 된다. JDK는 JavaSE를 구현한 구체적인 개발 소프트웨어 묶음이다.

 


Q: Java EE 란 무엇인가?

Java SE가 자바 언어의 핵심적인 표준 명세를 설정한 것이라면, Java EE는 Enterprise Edition의 약자로서 Java SE보다 더 많은 기능과 명세를 설정해 기업이 자사의 서비스를 만드는데 일관적으로 지킬 수 있는 표준을 설정한 것이다. 보통 서버측 기능들이 포함된다. 예를 들어, JSP나 Servlet 스펙이 Java EE에 속한다. 이외에도 분산 컴퓨팅, 트랜잭션 등 비즈니스 애플리케이션 개발과 관련된 기술들의 명세가 JavaEE에서 정리된다.

굳이 JavaEE를 JavaSE와 구분한 이유는, 개발자들이 자신들의 목적에 맞게 적합한 툴을 사용할 수 있도록 한 것이다. 프로그래밍의 기초적인 기능만 필요한 개발자에게 기업이 필요로 하는 서버 관련 기능과 표준 API, 스펙은 굳이 필요하지 않기 때문이다.

100%는 아니지만 일반적으로 javax.로 시작하는 패키지의 기술들이 JavaEE 스펙인 경우가 많다.

하지만 현재 자바 엔터프라이즈 기술 명세에서 Java EE라는 표현은 더 이상 사용되지 않는다. JavaEE는 과거의 유산이다. (J2EE는 JavaEE 보다도 더더욱 과거의 스펙이다!)

 

 


Q: Jakarta EE 란 무엇인가?

2017년, Java EE 8 버전 이후로 오라클(Oracle)이 자바 엔터프라이즈 에디션의 표준화 작업 주도권을 이클립스 재단에 이양했다. 비영리 단체인 이클립스 재단(Eclipse Foundation)이 표준화 개발 주도권을 가져갔으나, Java라는 상표권 자체는 여전히 민간 기업인 오라클이 소유하고 있었으므로 Java 대신 Jakarta라는 단어를 썼던 것이다.

( ※ Jakarta는 산스크리트어로 complete victory라는 의미를 가지는 jayakarta에서 따왔다고 한다. )

IntelliJ 같은 IDE에서도 두 기술이 같은 것일 뿐 naming만 다르다고 공지하고 있다.

이양한 원인에는 여러 가지 분석들이 있다. 아마 기업의 서비스용 개발을 민간 기업이 전적으로 주도한다는 것이 어려운 탓도 있었을 것이다. 기업용 기술 표준과 명세에 가장 민감하면서도 잘 아는 사람들은 기업에서 실질적으로 서비스 개발을 하고 있는 사람들이다. 실무자의 감각을 민간 회사의 일부 개발자들이 따라가긴 버거웠을 것이다.

또한 민간 재단에 이양한다는 것은 곧 오픈 소스를 활용하겠다는 것이므로, 자바 플랫폼의 발전을 위해서라도 실무에서 활약하는 개발자들의 의견과 감각을 즉각적으로 반영하는 것이 나을 것이다. 오픈소스는 자바 플랫폼을 소유한 오라클에게도 득이 될 것이라는 판단이다. 어차피 상업화가 힘들다면 자바 플랫폼 자체의 발전과 확산에 투자하는 것이 나쁘지 않았을 것이다.

따라서 어떤 소프트웨어가 Jakarta EE라는 이름의 기술에 의존하고 있다면, 그것은 Java EE 기술을 따르되 조금 더 최신 명세를 따른다는 의미일 뿐이다. 즉, JavaEE와 완전히 다른 기술이 아니다. 같은 시리즈다. 버전이 다를 뿐이다.

버전 구분을 해야 한다. 우리나 JavaSE와 JDK 버전을 토대로 자바 문법의 가능성을 체크하고, JVM에서 가능한 기능 명세를 따지듯이 JavaEE(JakartaEE)도 마찬가지다.

예를 들어, Tomcat 9 버전은 JavaEE 8 (javax) API에 의존하지만, Tomcat 10 버전부터는 jakartaEE에 의존한다. 따라서 서블릿 코드 사용 시 주의를 기울여야 한다. tomcat 9 버전을 사용하는 경우, 만약 내가 빌드한 프로젝트의 서블릿 코드가 jakartaEE의 API을 구현한 코드를 import한다면 동작하지 못한다. 톰캣이 실행되면서 lib 폴더의 서블릿 코드를 사용하는데, 이 서블릿 코드가 jakartaEE Servlet 코드가 아니라 JavaEE 8 Servlet이기 때문이다. 톰캣과 관련한 구체적인 버전 사항은 여기! (링크)

결론적으로 JavaEE와 JakartaEE가 헷갈리는 이유는, 표준화 주도권 이양과 상표권의 법적 이슈로 인해 같은 시리즈임에도 불구하고 이름 자체가 통째로 바뀌었기 때문이다.

 

 


Q: JDK 라이센스와 비용에 대해.. (openJDK의 의미)

이클립스나 인텔리제이와 같은 통합 IDE 환경에서는 JDK를 자유롭게 설정하고 다운로드 받을 수 있다. 그런데 JDK 선택 사항에 특이한 이름들이 있다. 특히 openJDK 라는 이름으로 Amazon corretto-11과 같은 특이한 이름을 가진 JDK들을 사용하라는 교과서와 강의도 있다.

이러한 배경에는 비즈니스적인 문제가 숨어 있다. 자바를 소유하고 관리하는 오라클은 개발자가 자신이 사용할 목적으로 개발을 하는 경우에 한해 JDK 사용은 무료로 푼다. 하지만 상업 목적으로 기업이 JDK를 사용하는 경우에는 유료 원칙을 고수하고 있다...! 구독료를 지급해야 한다.

(※ 이러한 행보에 대해 많은 개발자들이 굉장히 싫어했고, 이것이 자바라는 언어가 안드로이드와 웹 백엔드의 한계를 넘어서지 못하게 만든 패착이 아닌가 하는 주장이 있었다고 들었다.)

이 라이센스 문제를 해결하기 위해 오픈 소스 기반인 openJDK가 생겨났다. openJDK는 오픈 소스이면서 무료다. 명세도 Java SE 표준을 그대로 따르기 때문에 많은 기업들이 oracleJDK가 아니라 openJDK를 사용한다.

그럼에도 불구하고 Java SE 표준과 JDK는 기본적으로 오라클이라는 민간 회사가 소유한 권리이므로, openJDK라고는 하지만 이것도 오라클이 법적 권리를 가지고 있다. 실제 운영 주체도 오라클이며, 개발자가 오라클 공식 홈페이지에서 다운받아 사용하는 JDK인 oracleJDK는 이미 컴파일이 완료된 소프트웨어일 뿐, 기반 소스 코드는 openJDK를 개선한 것이다.

따라서 함부로 openJDK라고 막 써도 된다고 생각해서는 안 된다. JavaSE와 JDK의 법적 소유와 권리의 주체는 민간 회사인 오라클이다. 

그렇다면 openJDK가 무료라는 것은 사실인가? 그렇다. 실제로 상업용으로 개발해도 openJDK를 사용하면 무료인 것이 사실이다. 다만 이러한 무료 사용의 배후에는 openJDK를 개발하고 빌드하고 배포하는 회사(아마존 같은 회사)들이 오라클에게 직접 유료 라이센스 비용을 지불하고 엄격한 검증을 받은 결과물인 것이다. 즉, openJDK를 사용하는 기업은 무료이지만, 배후엔 openJDK 개발 회사가 오라클에게 비용을 지불한 것이다.

(※ 아마 아마존과 같은 회사는 오라클의 JDK 개발 로드맵에 의존하는 것으로부터 벗어나 본인들이 직접 로드맵을 결정하기 위해 이 같은 결정을 내렸을지 않을까 싶다.)