Java 02
자바 개발 환경 해부: JDK, JRE, JVM, IDE의 비밀
JDK, JRE, JVM, IDE, 컴파일이라는 단어가 모두 개발 환경처럼 보여서 서로의 역할을 구분하기 어렵다.
근거 · 교안 p13-p20
1장: 루나: 자바 개발, 뭐가 이렇게 많지?
솔라는 노트북 화면에 떠 있는 글자들을 보며 미간을 찌푸렸다. 이제 막 자바 공부를 시작해 보려고 개발 환경을 설정하는 방법을 찾아보고 있었지만, 시작부터 거대한 벽에 부딪힌 기분이었다. 화면에는 온통 처음 보는 세 글자 약어들과 알 수 없는 용어들이 가득했다.
“하아… 이게 다 뭐야.”
혼잣말과 함께 한숨이 터져 나왔다. JDK, JRE, JVM. 분명 어딘가에서 들어본 것도 같은데, 막상 마주하니 서로 뭐가 다른지 전혀 감이 오지 않았다. 거기에 IDE라는 단어도 보이고, ‘컴파일’이라는 과정에 대한 설명도 얽혀 있었다. 솔라의 눈에는 그저 ‘자바 개발에 필요한 것들’이라는 하나의 거대한 덩어리로만 보였다.
“뭐가 잘 안 돼?”
소파에서 책을 읽던 루나가 솔라의 낮은 탄식을 듣고는 조용히 다가와 노트북 화면을 들여다보았다.
“언니, 나 그냥 ‘Hello, World!’ 한번 찍어보려던 것뿐인데, 무슨 용어가 이렇게 많아? JDK를 설치하라는데, JRE랑 JVM은 또 뭐고, IDE는 이걸 다 편하게 해주는 거라는데 그럼 IDE만 있으면 되는 거 아니야? 다 너무 비슷하게 들려서 뭐가 뭔지 모르겠어.”
솔라는 억울하다는 듯이 속사포처럼 불만을 쏟아냈다. 솔라에게는 이 모든 것이 그저 ‘자바’라는 이름 아래 모인, 귀찮고 복잡한 절차일 뿐이었다.
루나는 잠시 솔라의 화면을 응시했다. 화면 가득한 설치 가이드와 용어 설명들이 초심자를 얼마나 압도할 수 있을지 짐작이 갔다. 루나는 대답 대신, 솔라를 지나쳐 부엌으로 향했다. 잠시 후 돌아온 루나의 손에는 작은 쟁반이 들려 있었다. 쟁반 위에는 과도, 도마, 그리고 방금 깎은 사과 조각이 담긴 접시와 포크가 놓여 있었다.
루나는 쟁반을 솔라 옆 책상에 내려놓았다.
“솔라, 이것들 전부 ‘사과를 먹기 위한 것’들이지?”
“응. 그런데 그건 왜?”
솔라는 영문을 모르겠다는 표정으로 쟁반을 쳐다봤다.
“만약에 내가 이걸 전부 그냥 ‘먹는 도구’라고 부르면서, 과도랑 포크 중에 아무거나 집어서 사과를 먹으라고 하면 어떨 것 같아?”
루나의 말에 솔라는 잠시 상상하는 듯하더니 피식 웃었다.
“말도 안 되지. 칼로 사과를 찍어 먹을 수는 없잖아. 껍질은 칼로 깎고, 먹는 건 포크로 해야지. 도마는 받침대고, 접시는 담는 그릇이고. 다 역할이 다르잖아.”
“바로 그거야.”
루나가 말했다.
“지금 네가 보고 있는 화면 속 용어들도 마찬가지야. JDK, JRE, JVM, IDE. 전부 ‘자바 개발’이라는 큰 목적을 위해 쓰이는 건 맞아. 마치 이 도구들이 전부 ‘사과를 먹기 위해’ 있는 것처럼. 하지만 각각의 역할과 쓰임새는 완전히 달라. 그걸 구분하지 않고 ‘전부 그냥 자바 하는 것’이라고 뭉뚱그려 버리면, 마치 과도로 사과를 찍어 먹으려는 것처럼 이상한 상황이 되는 거지.”
루나의 비유를 듣고 나니, 솔라는 아까의 답답함이 조금 다른 느낌으로 다가왔다. 처음에는 그저 모든 게 비슷해 보여서 짜증이 났었다. 하지만 이제는 그 비슷해 보이는 것들 사이에 분명한 역할 차이가 있을 거라는 생각이 들었다. 칼과 포크처럼.
솔라는 다시 노트북 화면으로 고개를 돌렸다. 여전히 복잡했지만, 이제는 이 용어들을 무작정 외워야 할 대상이 아니라, 각자의 역할을 가진 선수들처럼 보이기 시작했다. 누가 공격수고 누가 수비수인지 알아내야 하는 게임처럼 느껴졌다.
“아… 알겠다. 그러니까 이것들을 그냥 한 덩어리로 보고 ‘왜 이렇게 복잡해?’라고 할 게 아니라, ‘그래서 넌 뭘 하는 애고, 쟤는 뭘 하는 애지?’ 하고 하나씩 역할을 나눠서 봐야 한다는 거구나.”
솔라의 목소리에 깨달음이 묻어났다. 답답함을 토로하던 아까와는 달리, 이제는 문제를 해결할 실마리를 찾은 탐정 같은 눈빛이었다. 솔라는 화면에 나열된 용어들을 다시 한번 천천히 훑어보았다.
JDK, JRE, JVM, IDE…
“좋아. 그럼 하나씩 역할을 밝혀주겠어. 그런데… 저기 ‘컴파일’이라는 건 뭐야? 다른 애들은 뭔가 ‘도구’나 ‘환경’ 같은 이름인데, 이건 꼭 어떤 ‘행동’의 이름 같단 말이지. 얘는 이 선수들 중에서 어떤 역할을 하는 거야?”
2장: 루나: 자바 코드는 마법처럼 변신하지 않아
솔라의 질문에 루나는 바로 대답하는 대신, 잠시 솔라의 책상 위를 살폈다. 이내 눈에 들어온 메모장과 펜을 집어 들었다. 루나는 아무 말 없이 메모장 첫 장에 또박또박 글씨를 썼다.
화면에 '안녕!'이라고 보여줘.
그러고는 글씨 위에 Hello.java라고 작게 제목을 붙였다. 마치 파일 이름을 지정하는 것처럼. 솔라는 언니가 뭘 하려는 건지 알 수 없어 가만히 지켜보기만 했다. 루나는 그 메모지를 솔라 앞에 가만히 내려놓았다. 이것이 바로 솔라가 컴퓨터에게 시키고 싶은 일, 즉 인간의 언어로 작성된 ‘소스 코드’인 셈이었다.
“자, 이게 네가 컴퓨터에게 전하고 싶은 메시지야.”
루나가 입을 열었다.
“‘컴파일’은 행동의 이름이 맞는데, 마법 같은 건 아니야. 만약 네가 미국인에게 이 메시지를 전달해야 한다면, 이 메모지를 그냥 줄 거야?”
“아니? 영어로 번역해서 줘야지. ‘Show ‘Hello!’ on the screen’이라고.”
솔라는 당연하다는 듯 대답했다.
“컴퓨터도 마찬가지야. 컴퓨터는 한국어나 영어를 직접 알아듣지 못해. 컴퓨터만의 언어가 있어. 그래서 네가 쓴 이 Hello.java 파일을 컴퓨터가 알아들을 수 있는 형태로 번역하는 과정이 필요해.”
루나는 새 메모지를 한 장 더 찢었다. 그리고 이번에는 알아볼 수 없는 기호와 단어들을 조합해 적기 시작했다.
명령_7번: 화면_출력. 대상_문자열: '안녕!'
솔라가 보기엔 암호문 같았다. 루나는 이 두 번째 메모지 위에 Hello.class라고 적었다.
“이것 봐. 내용은 같지만, 형식은 완전히 다르지? 이렇게 사람이 이해하는 Hello.java 파일의 내용을, 기계가 이해하기 쉬운 중간 형태인 Hello.class 파일로 바꾸는 과정. 바로 이 ‘번역’ 작업이 네가 궁금해했던 ‘컴파일(compile)’이야.”
솔라의 눈이 동그래졌다. ‘컴파일’이라는 단어가 갑자기 다르게 보이기 시작했다. 그냥 ‘실행’ 버튼을 누르면 마법처럼 프로그램이 뿅 하고 나타나는 과정이 아니었다. 명백한 ‘변환’이자 ‘번역’이었다.
“아…! 그럼 컴파일은 그냥 실행하는 게 아니라, 내가 쓴 코드를 컴퓨터용 언어로 번역해주는 거였구나. 그럼 저 Hello.class가 있으면 바로 실행되는 거야?”
솔라는 이제 막 한 고비를 넘었다는 생각에 신이 나서 물었다. 하지만 루나는 고개를 저었다.
“거의 다 왔어. 한 단계만 더. 이 Hello.class 파일은 아주 특별한 중간 언어야. 윈도우 컴퓨터도, 맥 컴퓨터도 아직 이걸 직접 실행할 순 없어. 대신, 어떤 컴퓨터든 이 암호문 같은 .class 파일을 읽고 해석해서 실제 명령을 수행해 줄 전문 배우가 필요해.”
루나는 Hello.class라고 적힌 메모지를 살짝 들어 올렸다.
“그 전문 배우의 이름이 바로 ‘JVM(자바 가상 머신)’이야. JVM은 운영체제(OS)의 종류와 상관없이, 이 .class 파일만 있으면 어디서든 똑같은 연기를 펼쳐주지. 즉, ‘화면에 ‘안녕!’을 보여줘.’라는 연기를 말이야.”
그제야 솔라의 머릿속에 흩어져 있던 조각들이 맞춰지기 시작했다. 복잡하게 얽혀 있던 과정이 두 개의 선명한 단계로 나뉘는 느낌이었다.
내가 코드를 쓴다 (.java).
코드가 기계어로 번역된다 (.class). - 이 과정이 컴파일.
번역된 코드를 전문 배우(JVM)가 읽고 실행한다. - 이 과정이 실행.
솔라는 아까 설치 가이드에서 봤던 문장을 떠올렸다. ‘Java 코드는 .java에서 .class로 컴파일되고 JVM 위에서 실행된다.’ 처음 봤을 땐 그저 외계어 같았던 문장이 이제는 한 편의 짧은 시나리오처럼 읽혔다.
“아하! 알겠다! ‘컴파일된다’는 건 내가 쓴 .java가 기계가 읽을 수 있는 .class로 번역된다는 뜻이고, ‘JVM 위에서 실행된다’는 건 그 번역된 .class 파일을 JVM이라는 애가 실제로 작동시킨다는 거구나. 이게 완전히 다른 두 단계였어!”
솔라는 유레카를 외친 사람처럼 의자에서 등을 떼고 상체를 일으켰다. 답답했던 가슴이 뻥 뚫리는 기분이었다. 그러다 문득, 새로운 의문이 고개를 들었다.
“잠깐만. 그러면… 그 번역, 즉 컴파일은 ‘누가’ 하는 거야? 아까 봤던 선수들 있잖아. JDK, JRE… 그중에 누가 이 번역가 역할을 하는 거지? 그리고 JVM은 또 누구한테 속해 있는 거고?”
3장: 루나: 개발자용 도구, 사용자용 환경
솔라의 시선은 책상 위에 놓인 두 장의 메모지에 고정되어 있었다. 하나는 사람이 읽을 수 있는 Hello.java, 다른 하나는 암호문 같았던 Hello.class. 번역(컴파일)과 연기(실행)라는 두 개의 막으로 이루어진 연극이라는 건 알겠다. 하지만 정작 누가 번역가이고 누가 배우를 무대로 올려주는 스태프인지는 여전히 오리무중이었다. 머릿속에서는 JDK와 JRE라는 용의선상에 오른 이름들만 맴돌았다.
그때, 루나가 다시 부엌에서 나타났다. 이번에는 쟁반 대신 빈 상자 두 개를 들고 왔다. 하나는 꽤 크고 묵직해 보이는 신발 상자였고, 다른 하나는 그것보다 훨씬 작은 액세서리 상자였다. 루나는 큰 상자 위에 매직으로 ‘개발자 키트’라고 쓰고, 작은 상자 위에는 ‘사용자 키트’라고 썼다.
“자, 어제의 선수들이 다시 등장할 시간이야.”
루나는 ‘개발자 키트’라고 쓰인 큰 상자를 솔라 쪽으로 밀어주며 말했다.
“네가 만약 자바로 멋진 프로그램을 만드는 개발자라고 상상해 봐. 그리고 나는 그 프로그램을 다운로드해서 쓰는 평범한 사용자고.”
솔라는 루나의 의도를 파악하려는 듯 두 상자를 번갈아 보았다. 여전히 이 둘이 그저 설치할 때 고르는 옵션 1, 옵션 2 같은 게 아닌가 하는 의심이 가시지 않았다.
“상황은 이거야.”
루나가 Hello.java 메모지를 집어 들었다.
“개발자인 네가 이 ‘사람의 언어’로 된 설계도(Hello.java)를 가지고, ‘기계가 알아들을 언어’로 된 완성품(Hello.class)을 만들어야 해. 즉, 컴파일을 해야 하지. 그럼 넌 이 두 키트 중에 뭘 쓸래?”
솔라는 잠시 고민했다. 개발자니까 당연히 ‘개발자 키트’일 것 같았다. 하지만 그 안에 뭐가 들었는지도 모르는데 섣불리 대답하기는 망설여졌다.
“음… 개발자 키트? 뭔가 더 많이 들어있을 것 같으니까. 컴파일에 필요한 도구가 거기에 있을 것 같아.”
“정확해.”
루나는 큰 상자를 톡톡 두드렸다.
“이 ‘개발자 키트’가 바로 **JDK(Java Development Kit)**야. 이름 그대로지. ‘자바 개발 도구 모음’. 여기에는 네가 쓴 소스 코드를 바이트코드로 번역해 주는 ‘컴파일러(javac)’라는 가장 중요한 도구가 들어있어. 이것 없이는 Hello.java가 Hello.class로 변신할 수 없어.”
이제야 JDK의 정체가 명확해졌다. 개발을 위한 모든 도구가 담긴 공구함 같은 것이었다.
“자, 그럼 이제 네가 열심히 컴파일해서 이 Hello.class 완성품을 만들었어.”
루나는 Hello.class 메모지를 솔라에게서 받아 ‘사용자 키트’라고 쓰인 작은 상자 옆에 놓았다.
“그리고 내가 이 프로그램을 실행하고 싶어서 다운로드를 받았어. 나는 개발자가 아니야. 코드를 수정하거나 새로 만들 생각은 전혀 없어. 그냥 네가 만든 프로그램을 쓰고 싶을 뿐이야. 그럼 나한테는 어떤 키트가 필요할까?”
질문이 명확했다. 솔라는 망설임 없이 작은 상자를 가리켰다.
“사용자 키트. 컴파일 같은 건 할 필요 없으니까, 굳이 복잡한 도구들이 다 들어있는 개발자 키트까지는 필요 없잖아.”
“바로 그거야!”
루나가 작은 상자를 들어 보였다.
“이게 바로 JRE(Java Runtime Environment), ‘자바 실행 환경’이야. 여기에는 컴파일러 같은 개발 도구는 없어. 오직 완성된 .class 파일을 실행하는 데 필요한 것들만 들어있지. 그리고 네가 궁금해했던 전문 배우, JVM이 바로 이 JRE 안에 포함되어 있어. 무대 장치와 배우가 함께 들어있는 세트인 셈이야.”
순간 솔라의 머릿속에서 모든 것이 연결되었다. JDK와 JRE는 설치 옵션의 차이가 아니었다. 사용하는 ‘사람’과 ‘목적’이 완전히 다른, 별개의 꾸러미였던 것이다.
개발자 (솔라): 자바 코드를 만든다 → **JDK(개발자 키트)**를 사용해 컴파일한다 (.java → .class)
사용자 (루나): 완성된 자바 프로그램을 쓴다 → **JRE(사용자 키트)**를 사용해 실행한다 (.class 파일 작동)
“아…!”
솔라의 입에서 짧은 탄성이 터져 나왔다.
“그러니까 JDK는 개발자를 위한 거고, JRE는 사용자를 위한 거구나! 나는 개발을 할 거니까 당연히 컴파일러가 들어있는 JDK를 설치해야 했던 거고, 만약 내가 자바로 만들어진 게임을 하기만 할 거라면 JRE만 있어도 됐던 거네!”
솔라는 한 가지 더 궁금한 점이 생겼다.
“그런데 언니, 개발자도 자기가 만든 프로그램을 실행은 해봐야 하잖아. 그럼 개발자는 JDK랑 JRE를 둘 다 설치해야 하는 거야?”
“좋은 질문이야. 다시 이 상자를 봐봐.”
루나는 ‘개발자 키트’라고 쓰인 큰 상자를 가리켰다.
“훌륭한 요리사는 자기가 만든 음식을 손님에게 내놓기 전에 직접 맛을 보지. 그래서 개발자 키트(JDK) 안에는 사용자 키트(JRE)가 통째로 들어있어. 개발도 하고, 내가 만든 걸 바로 실행해서 테스트도 해볼 수 있도록 말이야.”
JDK가 JRE를 포함한다는 사실에 솔라는 고개를 여러 번 D-D-D-끄덕였다. 이제 모든 조각이 제자리를 찾은 느낌이었다. 설치 가이드에서 봤던 그 문장, ‘Java 코드는 .java에서 .class로 컴파일되고 JVM 위에서 실행된다’는 말이 이제는 완벽한 주어를 가진 문장으로 보였다.
‘Java 코드는 (JDK 안의 컴파일러에 의해) .java에서 .class로 컴파일되고, (JRE 안의) JVM 위에서 실행된다.’
흐릿했던 그림에 선명한 윤곽선이 그려졌다. 그러나 완벽하게 개운하지는 않았다. 솔라는 자신의 노트북 화면을 슬쩍 바라봤다. 거기에는 방금 전까지 솔라를 괴롭혔던 또 다른 용의자, ‘IDE’ 프로그램이 실행되어 있었다.
“알겠어. 이제 JDK가 컴파일하고 JRE가 실행하는 건 확실히 알겠어. 그런데… 이상하다. 내 컴퓨터에 설치된 이 프로그램(IDE)에서는 그냥 초록색 재생 버튼 하나만 누르면 모든 게 다 되는데? 나한테 ‘개발자 키트를 쓰시겠습니까?’하고 물어보지도 않고, 컴파일이라는 과정이 눈에 보이지도 않아. 마치 마법사 지팡이 같아. 얘는 도대체 이 연극에서 무슨 역할을 하는 거야?”
4장: 루나: IDE, 마법이 아니라 도구라고!
솔라의 시선은 자신의 노트북 화면 한쪽에 고정되어 있었다. 초록색 삼각형 모양의 ‘실행’ 버튼. JDK라는 개발자용 공구함과 JRE라는 실행용 환경의 존재를 알게 된 지금, 저 작은 버튼은 더욱 기묘한 존재가 되어 있었다. 마치 복잡한 연극의 무대 뒤편을 모두 구경하고 나왔는데, 관객석에서는 배우가 손가락 한 번 까딱하는 것만으로 모든 막이 오르고 내리는 걸 본 기분이었다. 컴파일도, 실행도, 저 버튼 하나면 끝이었다.
“마법 지팡이 같아.”
솔라의 혼잣말에 루나가 솔라의 화면을 들여다봤다. 솔라의 손가락은 어느새 그 초록색 버튼 위를 맴돌고 있었다.
“그 지팡이, 한번 치워볼까?”
루나는 말과 동시에 솔라의 마우스를 부드럽게 가져가더니, 솔라가 띄워놓은 IDE(통합 개발 환경) 창의 닫기 버튼을 눌러버렸다. 화려했던 마법사의 작업실이 순식간에 사라지고, 밋밋한 바탕화면만 남았다.
“어, 언니! 왜 꺼?”
“그 마법이 진짜 마법인지, 아니면 잘 짜인 무대 장치인지 확인해 보려면, 무대 뒤를 봐야지.”
루나는 윈도우 검색창을 열어 ‘터미널’이라고 입력하고 엔터를 쳤다. 검은색 바탕에 하얀 글씨만 깜빡이는, 삭막하기 짝이 없는 창이 화면에 나타났다. 솔라는 본능적으로 이 창이 불편하다는 것을 느꼈다.
“자, 이제 마법 지팡이 없이, 네 손으로 직접 해보는 거야. 아까 만들었던 Hello.java 파일, 여기 터미널에서 직접 컴파일하고 실행해 보자.”
루나는 텍스트 편집기를 열어 Hello.java 코드를 다시 보여주었다. 솔라는 조금 전까지 IDE가 제공하던 자동 완성이나 색깔 힌트가 전혀 없는, 그저 검은 글씨의 나열이 어색했다.
“일단… 컴파일을 해야지? JDK 안에 컴파일러가 있다고 했으니까… 명령어는… javac였나?”
솔라는 기억을 더듬어 터미널 창에 조심스럽게 입력했다.
javac Hello.java
엔터를 누르자, 아무 일도 일어나지 않은 것처럼 다음 줄로 넘어갔다. 성공인가? 솔라가 어리둥절한 표정으로 폴더를 확인하자, 그곳에는 Hello.class 파일이 새로 생겨 있었다. 솔라가 직접 명령을 내려 java 파일을 class 파일로 번역해낸 첫 순간이었다.
“오! 됐어, 됐어! Hello.class 파일이 만들어졌어!”
“그다음은?”
“실행! JRE 안에 있는 JVM이 실행한다고 했지. 명령어는 java.”
솔라는 신나서 다음 명령어를 입력했다.
java Hello
엔터를 치는 순간, 터미널에 ‘Hello!’라는 단어가 선명하게 찍혔다. 솔라는 자기가 직접 컴파일하고 실행시킨 결과물을 보며 뿌듯한 미소를 지었다. 하지만 그 뿌듯함은 잠시였다. 루나가 말했다.
“만약 코드에 오타가 있었다면 어땠을까?”
루나는 텍스트 편집기에서 System.out.println의 System을 system으로 슬쩍 바꾸고 저장했다.
“다시 해봐.”
솔라는 다시 터미널에 javac Hello.java를 입력했다. 이번에는 성공 메시지 대신, 알아보기 힘든 영어로 된 에러 메시지가 여러 줄 출력되었다.
error: package system does not exist
“아… 대문자 S를 소문자로 썼네.”
솔라는 오타를 금방 발견했지만, 만약 코드가 수백 줄이었다면 어땠을까 하는 생각이 들자 아찔했다. 오타를 수정하고, 다시 컴파일하고, 또 실행해야 했다. 이 모든 과정을 직접 키보드로 치면서 말이다.
“귀찮아… 버튼 하나 누르면 됐던 건데.”
솔라의 입에서 불평이 터져 나왔다. 루나는 그때서야 다시 IDE를 실행했다. 화려한 작업 공간이 다시 눈앞에 펼쳐졌다. 솔라는 아까와 똑같이 System을 system으로 바꾸어 보았다. 그러자 system이라는 단어 아래에 즉시 빨간 밑줄이 그어졌다. 실행 버튼을 누르기도 전에, IDE가 ‘이거 틀렸어!’라고 알려주는 것이다.
그 순간, 솔라는 모든 것을 깨달았다.
“아!”
IDE는 마법사가 아니었다. 마법 지팡이도 아니었다.
“IDE는… 컴파일을 대신 해주는 게 아니었어. 내가 ‘실행’ 버튼을 누르면, 내가 했던 것처럼 뒤에서 몰래 터미널을 열고 javac Hello.java라고 자기가 대신 쳐주는 거였네. 에러가 나면 ‘이런 에러가 났어요’ 하고 예쁘게 보여주고, 오타가 있으면 미리 알려주고… 그냥 엄청 똑똑하고 빠른 비서였구나!”
마치 무대 감독이 배우에게 사인을 보내고, 조명 스태프에게 큐를 주고, 음향 담당에게 신호를 보내는 것처럼, IDE는 개발자가 편하게 개발에만 집중할 수 있도록 JDK와 JRE에게 보내는 모든 귀찮은 명령들을 대신 처리해주고 있었던 것이다. 파일 관리, 코드 자동 완성, 디버깅… 이 모든 것이 마법이 아니라 잘 만들어진 ‘보조 도구’의 기능이었다.
솔라는 다시 IDE의 초록색 실행 버튼을 바라보았다. 이제 그것은 더 이상 정체불명의 마법 지팡이로 보이지 않았다. 수많은 전문가의 명령을 한 번에 수행해주는, 아주 잘 만든 ‘만능 리모컨’처럼 보였다.
“이제 JDK, JRE, JVM, 그리고 IDE까지 각자 무슨 일을 하는지는 확실히 알겠어. 개발 도구, 실행 환경, 핵심 배우, 그리고 이 모든 걸 조율하는 조감독까지… 역할 분담은 완벽하게 이해했어.”
솔라는 고개를 끄덕이며 말했다. 하지만 머릿속에 새로운 그림이 그려지자, 또 다른 궁금증이 생겨났다.
“그런데… 이 배우와 스태프들이 전부 모여서 만드는 한 편의 연극, 그러니까 내가 코드를 짜기 시작해서 ‘Hello!’라는 결과물이 나오기까지의 전체 흐름을 처음부터 끝까지 한눈에 보고 싶어. 이제는 그 지도를 그릴 수 있을 것 같아.”
5장: 루나: 자바 개발, 이제 전체 그림이 보이네
솔라의 방 책상 위는 어지럽게 놓인 소품들로 작은 연극 무대처럼 보였다. 사람이 읽는 Hello.java 메모지, 암호 같은 Hello.class 메모지, 그리고 ‘개발자 키트(JDK)’와 ‘사용자 키트(JRE)’라고 쓰인 상자까지. 솔라는 이 배우와 스태프들의 역할을 이제 각각은 알 것 같았다. 하지만 이들이 모여 어떻게 하나의 공연을 완성하는지에 대한 전체 동선은 여전히 머릿속에서 희미했다.
솔라는 의자를 뒤로 밀고 일어나 책장에서 커다란 스케치북 한 장을 뜯어냈다. 그리고는 책상 위 소품들을 한쪽으로 밀어놓고, 스케치북을 펼쳐 매직펜을 들었다. 말로만 정리하는 것보다 직접 그려보는 편이 나을 것 같았다.
가장 먼저, 솔라는 중앙에 커다랗게 ‘IDE’라는 사각형을 그렸다. 자신의 경험상 모든 것은 IDE의 초록색 실행 버튼에서 시작되었기 때문이다. 그리고 그 IDE 사각형에서 화살표를 뽑아내 ‘JDK’와 ‘JRE’ 상자로 각각 연결했다. 마치 IDE가 모든 것을 지휘하는 중앙 관제탑처럼 보였다. 그림을 완성하고 보니 제법 그럴듯해 보였다.
“자, 내가 그린 자바 개발 지도야.”
솔라가 의기양양하게 스케치북을 들어 보이자, 어느새 다가와 뒤에서 지켜보던 루나가 조용히 입을 열었다.
“그 그림, 맞는 것 같아?”
“응. 내가 코드를 짜고 실행 버튼을 누르는 곳은 IDE고, IDE가 컴파일이 필요하면 JDK를, 실행이 필요하면 JRE를 불러서 쓰는 거니까. 이 그림이 맞지 않아?”
솔라의 그림 속에서 IDE는 모든 작업의 주인이자 시작점이었다. 루나는 대답 대신, 솔라가 그린 그림에서 ‘IDE’ 사각형을 손가락으로 가리켰다.
“어제 우리가 했던 일을 생각해 봐. 이 똑똑한 조감독(IDE) 없이도, 우린 연극을 무대에 올렸었잖아. 터미널에서.”
루나의 한마디에 솔라의 뇌리에 검고 삭막했던 터미널 화면이 스쳐 지나갔다. javac와 java 명령어를 직접 입력하며 겪었던 불편함, 그리고 마침내 ‘Hello!’를 보았을 때의 뿌듯함. 그 과정 어디에도 IDE는 없었다.
솔라는 잠시 멍하니 있다가, 아차 하는 표정으로 스케치북을 내려다봤다. 자신의 그림이 뭔가 단단히 잘못되었다는 것을 깨달았다. IDE는 주인이 아니었다. 모든 것을 가능하게 하는 핵심 동력은 더더욱 아니었다.
“아… 아니구나.”
솔라는 들고 있던 펜으로 자신이 그렸던 ‘IDE’ 사각형과 화살표들을 전부 지워버렸다. 중심을 잘못 잡으니 전체 그림이 다 틀어져 버린 것이다.
“다시. 처음부터 다시 그려볼게.”
이번에 솔라는 스케치북의 가장 위쪽에 ‘나 (개발자)’라고 쓰고 동그라미를 쳤다. 모든 것은 코드를 작성하는 개발자로부터 시작된다.
- 코드 작성: 솔라는 ‘나’ 동그라미 아래에
Hello.java라고 쓰고 네모 상자로 감쌌다. 이것이 첫 번째 산출물이다. - 컴파일: 그 다음
Hello.java에서 화살표를 그리고, 그 끝에 ‘JDK (컴파일러javac)’라고 쓴 커다란 상자를 그렸다. JDK는 개발을 위한 ‘도구’다. 이 도구를 거치면… - 바이트코드 생성: 화살표는
Hello.class라는 새로운 네모 상자로 이어졌다. 이제 기계가 읽을 준비가 된 번역본이다. - 실행: 그리고
Hello.class상자에서 나온 마지막 화살표는 ‘JRE (JVM)’라고 쓴 상자를 향했다. JRE는 코드를 실행하기 위한 ‘환경’이다. JRE 안의 JVM이 이 클래스 파일을 읽어 실제 동작을 만들어낸다.
완성된 그림은 위에서 아래로 흐르는 명확한 폭포수 같았다. 개발자에서 시작해 JDK를 거쳐 JRE에서 끝나는, 군더더기 없는 핵심 흐름.
“그럼 IDE는 어디에 있는 거지?”
솔라는 스스로에게 질문을 던졌다. 그리고 답을 찾았다. IDE는 이 흐름의 한가운데를 차지하는 관제탑이 아니었다. 이 모든 흐름을 감싸 안는 거대한 작업 공간이자, 개발자를 돕는 투명한 막과 같은 존재였다.
솔라는 방금 그린 핵심 흐름도 전체를 커다란 점선 사각형으로 감쌌다. 그리고 그 점선 사각형의 이름을 ‘IDE (통합 개발 환경)’라고 붙였다. IDE는 개발자가 Hello.java를 더 편하게 쓰도록 돕고, javac 명령어를 대신 입력해주며, java 명령어를 실행하고 그 결과를 예쁘게 보여주는, 전체 과정을 부드럽게 만들어주는 윤활유였다.
“이거였어. IDE는 흐름 자체가 아니라, 흐름을 편하게 만들어주는 틀이었구나.”
이제야 모든 것이 제자리를 찾았다. 솔라는 자신이 그린 지도를 보며 처음 자바 공부를 시작할 때 봤던 문장을 떠올렸다.
‘Java 코드는 .java에서 .class로 컴파일되고 JVM 위에서 실행된다.’
그때는 그저 외워야 할 암호문 같았던 문장이, 이제는 눈앞의 이 종합 흐름 지도를 한 줄로 요약한 완벽한 설명문으로 읽혔다. ‘컴파일’이라는 단어를 보면 JDK 상자가, ‘JVM 위에서 실행된다’는 구절을 보면 JRE 상자가 머릿속 지도 위에서 반짝였다.
솔라는 만족스러운 미소를 지으며 스케치북을 덮었다. 이제 더 이상 세 글자 약어들이 두렵지 않았다.
“언니, 이제 알겠어. 내가 만약에 새로운 컴퓨터에서 자바 프로젝트를 시작한다면 제일 먼저 뭘 해야 할지.”
루나는 아무 말 없이 솔라를 바라보았다.
“가장 먼저 내 컴퓨터에 ‘개발자 키트(JDK)’가 제대로 설치되어 있는지부터 확인해야 해. 실행만 할 게 아니라 개발을 할 거니까. 그리고 나서 내가 쓸 IDE를 켜서, 그 똑똑한 비서가 JDK라는 공구함을 잘 찾아냈는지 설정에서 확인해 주면… 끝. 바로 코딩 시작이야.”
솔라의 목소리에는 처음의 막막함 대신, 앞으로 나아갈 길을 정확히 아는 사람의 확신이 담겨 있었다. 복잡해 보였던 자바 개발의 세계로 들어가는 첫 문이, 드디어 활짝 열린 순간이었다.