Java, jre, jdk, jvm, jar, jconsole ... 등 J 놈놈들이 서로 뒤엉켜 만들어내는 몽롱하고 혼탁한 개념의 그물망은 Java 세계로의 진입을 힘들게 하는 커다란 장벽이다. 대체 그것들은 무엇일까.
우선 이 점을 알아야 한다. 우리는 흔히 프로그래밍 언어라는 말을 쓴다. 여기서의 언어 Language 는 한국어, 영어, 중국어 할 때 붙는 언어와는 다른 류의 개념이다. 그러니까 통상적인 언어라함은 문자와 문법들이 어우러져 만든 하나의 표현 체계이다. 이러한 언어의 정의는 프로그래밍 언어에도 일단 적용 가능하다. 프로그래밍 언어도 결국 특정한 표기들과 표기법이 어우러져 만든 표현 체계다. 단 한국어, 영어, 중국어를 사용한다는 말과 Java, python, go 등을 사용한다는 말이 포괄하는 의미의 범위가 결코 같지 않음을 알아야한다. 한국어를 사용하는 건 한국어 표기를 활용해 읽고, 쓰고, 말하는 것을 지칭한다. 하지만 Java를 사용한다는 건 Java의 표기법에 맞추어 코드를 작성하고, 읽는 것을 넘어 새로운 표기를 양산, 수정하고 작성된 코드가 구동될 수 있는 환경을 구축, 설정하는 일까지도 포함한다. 이것이 진실된 프로그래밍 언어의 정의라서 그런 것이 아니다. 그냥 IT 세계에서 그런 식으로 말하다 그런 식으로 개념이 정립된 것이다. 그러므로 기실 우리가 프로그래밍 언어의 종류를 말함에 언급하는 Java, python, go 등은 따지자면 한 종류의 Platform을 지칭하는 단어이기도 하다. 무튼 Java는 하나의 거대한 Platform을 지칭하는 말이고, 이 안에 그것에 맞는 개발 표현법이 있다는 식으로 이해하는 것이 깔끔한 개념 습득에 도움이 되겠다. 실제로 Oracle은 Java platform이란 단어를 즐겨 쓴다. 이건 다른 개발 커뮤니티들이 본받아야할 점이다.
이제 한 개의 단어를 이해했다. Java란 특정한 개발 표현법을 가진 Platform의 명칭이다. 이 말이 하고 싶어서 위의 긴 서두를 썼다. 다음으로 이 말을 할 수 있다.
"jre, jdk, jvm, jar, ..." 등은 Java platform을 이루는 세부적인 시스템들의 명칭이다.
물론 그것들의 유형이나 시스템적 깊이가 동일하진 않다. '세부적인 시스템'이라는 것만 염두하자. 이는 뒤이어 물어지는 의문들과 그것의 해답을 더욱 쉽게 이해할 수 있게 도와줄 것이다.
Q1 . Java를 다운로드한다는 말은 무슨 말인가?
말했듯이 Java는 Java Platform을 가리킨다. Platform을 Platform이라고 불릴 수 있게 하는건, 참여하는 모든 이가 그곳의 주체가 될 수 있다는 점이다. 그리고 모두가 주체로서 만난다는 점. Java를 다운로드한다는 말은 Java Platform의 한 주체가 됨을 말한다. 말하자면 내 서버 혹은 컴퓨터를 Java platform의 참여자로 만들어내는 것.
이런 추상적인 설명을 내지르는 이유는, Java를 다운로드하는 일을 인터넷에서 한 가지 파일을 로컬로 복사해내는 수준으로 생각하지 않기 위해서다. 또한 그건 단순히 한 종류의 어플리케이션을 설치하는 수준을 넘어선다. 물리적인 측면에서도 그러하다. Java의 다운로드는 프로그램의 설치에 더해 시스템적인 설정을 필요로하는 복합적인 과정이다. 이 점들을 종합하여 적절한 표현을 찾자면, Java를 다운로드한다는 것을 내 컴퓨터 환경을 Java platform과의 연결이 가능한 상태로 재구성하는 것이라 말해볼 수 있겠다.
Java 다운로드 과정에선 통상 두 개의 단어와 만나게 된다. Jre와 Jdk이다. Java를 다운로드한다는 것은 종종 jre를 다운로드하는 것 혹은 jdk를 다운로드하는 것과 등치된다. 맞는 말이다. 하지만 jre와 jdk가 서로 등치되는 개념은 아니다. jre를 다운로드하는 것과 jdk를 다운로드하는 것은 모두 앞서 말한 'Java platform과의 연결이 가능한 상태로 재구성하는 것'에 속한다. 다만 그러한 재구성의 깊이가 다를 뿐이다.
둘의 내용을 제대로 파악하기 위해선 그 전에 jvm의 개념을 이해해야한다.
Q2 . Jvm이란 무엇인가?
먼저 이 부분에 대해 생각해보자. Java platform과 연결된다는 건 대체 무엇을 뜻하는가? Java 프로그램을 사용하는 일과 Java 프로그램을 만드는 일이 그것이다. 배달의 민족 Platform과의 연결이 배달하는 것과 배달받는 것으로 나뉘듯이 말이다.
Java 프로그램이란 Java 표기를 따르는 소스 코드들의 집합체이다. 달리 말해, Java 표기의 소스 코드들을 패키징한 파일이라고도 하겠다. 일반적인 프로그램의 실행은 운영체제가 주도한다. 하지만 Java 프로그램의 경우 이 자바 프로그램을 실행시키는 별도의 프로그램이 있다. 이를 자바 가상 머신 Java virtual machine, JVM이라고 한다. JVM은 한 개의 Java 프로그램을 소스 변경 없이 여러 운영체제에서 실행시킬 수 있도록 해준다. Java 진영엔 이런 슬로건이 있다. Write once, run everywhere!
요약하자면 Jvm은 Java 프로그램의 작동방식과 운영 체제의 운영방식을 이어주는 매개체다. Jvm의 개념을 대략 파악했다면 바로 다음의 물음으로 넘어갈 수 있다.
Q3 . Jre와 Jdk의 차이는 무엇인가?
그럼 Jvm만 있으면 Java 프로그램을 구동시킬 수 있을까? 그렇다. 그렇지만 그건 아주 아주 극단적으로 경량화된 Java 프로그램에 한해서만 사실이다. Jvm은 컴파일된 java 코드를 실행시키고, 그러한 실행에 필요한 작업들 가령 메모리 관리 등의 작업을 수행한다. 하지만 실질적인 Java 프로그램의 실행에는 컴파일된 소스 코드를 읽는 것 외에 몇 가지의 부가적인 요소들 필요하다. 프로그램의 내부 코드에 적용되는 기본 api들, 프로그래밍 구동에 참조되는 설정 정보 등등이 있다. 이런 부분들을 제외한 채 Java 프로그램을 만드는 건 실상 불가능하다.
코드를 읽어 실행하는 jvm과 실행에 필요한 기본 요소들을 합쳐 만든 것이 곧 Java Runtime Environment, Jre 다. Jre를 다운로드한다는 건 Java 프로그램을 실행시킬 수 있는 환경을 조성한다는 말에 다름 아니다. 말했듯이 Jre는 프로그램과 시스템 설정의 복합물이다.
지금까지는 Java 프로그램을 실행시키는 일에 대해서만 언급했다. 그럴 수밖에 없었다. 왜냐하면 Jre는 Java 프로그램의 실행 과정만 지원해줄 뿐, Java 프로그램을 개발하는 건 신경 쓰지 않는다. 서운할 필요 없다. Java 프로그램 개발을 위해 만들어진 것이 곧 Java Development Kit, Jdk이다. 말했드시 Jdk 또한 프로그램과 시스템 설정의 복합물이다. 그 목적은 Java 프로그래의 개발.
Jdk는 Jre를 포함한다. 당연히 그럴 것이, Java 프로그램 개발을 위해선 Java 프로그램을 실행시킬 수도 있어야하기 때문. 그렇기에 이렇게 말할 수 있다. Jdk는 jvm과 실행에 필요한 기본 요소들을 합쳐 만든 jre에 Java 개발을 지원하는 몇 가지 프로그램과 시스템 설정이 추가되어 만들어진 결과물이다.
여기서 알아두면 좋을 개념이 Jar 이다. Jar 는 Java 표기의 소스 코드들을 패키징하는 방식이며 동시에 그렇게 패키징된 파일을 뜻한다. 그런 파일의 확장자이기도 하다. 같은 뜻을 가진 war가 있는데 Jar가 대부분의 Java 프로그램들이 쓰는 표준이다.
Jre는 이 Jar 파일을 실행시킬 수 있다. 하지만 Jar 파일을 만들어내진 못한다. Jar 파일을 만들기 위해선 Jdk가 필요한 것이다. 그런 점에서 Oracle은 Jre를 Consumer를 위한 것으로, Jdk를 Developer를 위한 것이라 썻다.
통상 Java를 다운받는다는 것은 Jdk를 다운받는다는 것으로 여겨진다. 그도 그럴 것이 Java를 관리하는 Oracle에서도 Java 11 버전 이후로는 Jre를 빼고 Jdk만 지원한다. Jre와 Jdk가 대체 어떤 차이가 있을까란 고전적인 물음도 이제는 역사 속으로 스며들겠다.
허나 여기서 또 다시 생겨나는 한 가지 문제가 있다. Jdk의 종류에 관한 문제다. Jdk를 다운받는 일은 하나의 길을 가진 과정이 아니다. 동일한 Jdk를 여러 군데에서 다운받을 수 있어서가 아닌, 여러 군데에서 여러 개의 Jdk를 제공하고 있기 때문이다.
Q4 . 어떤 Jdk 종류들이 있는가.
종종 Java SE 라는 문구를 보게 된다. 이건 Oracle에서 만든 Jdk의 한 종류다. 이 밖에, Amazon Corretto, CACAO, Codename One, Eclipse OpenJ9 등등의 여러 Jdk들이 있다. 왜 이런 난립이 있는지 모르겠다. IT 세상이란 원래 이런 곳인가. 혼자만의 생각으로는 Oracle이 자신의 고성능 Jdk를 유료화해서 제공하는 것이 작지 않은 이유이지 않을까 싶다.
자연히 무슨 Jdk를 다운받아야하는가? 라는 문제가 생긴다. 하지만 헷갈릴 것 없다. 두 가지만 기억하고 있으면 된다. 하나는 Java SE(Oracle Jdk) 이고 다른 하나는 Open Jdk이다. 둘 다 Oracle에서 만들었다. 다만 배포 주기와 라이센스가 다르다. Java SE는 Oracle Code Binary License의 라이센스를 가지고, Open Jdk는 GNU General Public License를 라이센스로 가진다. 전자는 조건부 유료이고, 후자는 무조건 무료다. 특별한 사명이 없다면 Open Jdk를 쓰면 되겠다.
각 Jdk의 차이에 대해선 추후에 포스팅을 해야겠다.
'JAVA' 카테고리의 다른 글
[Java DataEngineering] Parquet 파일 쓰고 읽는 코드 정리 Write & Read (0) | 2022.11.25 |
---|---|
[Java Gradle] 등록된 라이브러리 Jar 목록 확인(Classpath) (0) | 2022.11.25 |
Netty 기반 경량 Http Server 구성 ( with Gradle ) (1) | 2022.09.25 |
JAVA Installation On Linux (0) | 2022.09.02 |
Spring boot 프로젝트 도커 이미징 (0) | 2022.09.02 |