본문 바로가기
Java/JS개발자 관점에서 보는 Java

JS개발자 관점에서 보는 Java | Java17 | 자바 입문, 컴파일러와 인터프리터, JDK 설치

by 햄또멈 2023. 7. 27.
반응형

 

💡 단순 프로필

더보기

- 문과 출신, 스포츠과학과/경영학과 학사 졸업

- Python 5개월 공부
- C언어 및 CS, 네트워크 5개월 맛보기
- Java Script(Node) 경력 약 1년 6개월. 현재 주니어 웹개발자

- NestJS 학습하다 스프링부트 강의도 참고하게 됐고, 그러다가 Java에 흥미 생겨서 공부하기 시작함

- 즉 많이 부족하고 아직도 배울 점이 많음. 틀리거나 잘못된 부분들이 있다면 과감하게 뒤로 가기 클릭하기

(피드백해 주시면 정말정말 감사할 것임!)

 


 

새해 때 세운 목표 중 하나는 하나의 웹 서비스를 A to Z까지 만들고, 배포까지 하는 것이었다. 이를 위해 기술 스택으로 NestJS를 선정했었다. NestJS 학습, API 문서 작성, ERD 설계 등의 준비를 하고 프로젝트를 진행했다. 하지만 각 모듈 간 의존성을 주입하며 코드를 작성하는 설계 방식에 익숙하지도 않았고, 단순히 서버 관련 코드뿐만 아니라 전 영역을 주무르다 보니 부족한 점들이 너무 많았기 때문에 당장 프로젝트를 진행하는 것보다는 부족한 지식들을 더 채워야겠다는 방향으로 피벗 하게 되었다.

 

객체지향에 대해서도 더 깊게 공부하기 시작했고, 참고용으로 객체지향 언어들도 찾아봤다. NestJS가 노드 진영에서는 매우 고도화된 프레임워크인 것은 알겠지만, 내가 내공이 부족해서인지 뭔가 아쉽고 어려운 부분이 많았다.

 

그러던 중 예전에 향로님께서 인프런 백엔드 개발자분들(NestJS 사용)이 스프링부트 강의를 수강하신다는 말이 떠올랐다. 토비님의 스프링부트 강의를 통해 NestJS에 대한 이해도를 향상시킬 수 있을 것이라고 기대하신다고 하셨다.

 

그래서 나도 NestJS를 더 깊게 이해하기 위해 스프링부트 강의를 들어보기로 했고, 이를 위해 자바라는 언어에 대해서도 찍먹(?)해보려고 자바를 공부하기 시작했다.

 

JVM(Java Virtual Machine)

자바 관련 강의, 서적을 읽으면서 무조건 처음 등장하는 키워드 중 하나는 바로 자바 가상머신(JVM)이다. 자바로 작성된 프로그램들은 JVM 위에서 실행된다.

JVM은 운영 체제에 독립적으로 동작하면서 ... 이런 방식으로 자바는 여러 플랫폼에서 동일한 동작을 보장할 수 있습니다.

자바를 소개하는 글들을 보면 항상 다음과 같은 설명이 나온다. 자바는 플랫폼에 독립적이기 때문에 어떤 운영체제나 하드웨어에 상관없이 JVM만 설치되어 있다면 자바 프로그램을 실행할 수 있다. 정확히는 자바 코드를 자바 컴파일러(Java Compiler)에 의해 번역된 자바 바이트 코드를 실행시키는 것이 자바 가상 머신이라고 보면 된다.

 

여기서 다른 컴파일러 언어인 C와 다른 점이 있다(사실 C언어 공부도 찍먹 수준이라 정확히 잘 모른다). C로 개발된 애플리케이션 같은 경우는 해당 OS에 직접적인 의존성을 가진다. 즉 같은 코드로 작성된 프로그램이라고 하더라도 Window OS로 컴파일한 것을 Mac이나 Linux에서 실행할 수 없다는 것이다. 내가 C언어를 공부할 때에는 보통 리눅스 환경에서 gcc 컴파일러를 이용했었지만(WSL 사용), 만약 윈도우 운영체제로 했다면 이와는 다른 방법으로 컴파일을 했어야 할 것이다.

 

자바 가상 머신 컴파일 도면

어떤 컴퓨터, 운영체제이든 상관없이 같은 자바 코드를 컴파일 걱정 없이 사용할 수 있다는 것은 C언어를 조금이나마 경험해 본 입장에서 꽤나 큰 장점이라고 생각한다(물론 각 운영체제에 맞는 JVM을 설치해야 한다). 실제로 교육 받을 때 많은 동기들이 MacOS, Window 등 여러 운영체제에서 C언어 사용을 시작하는 과정 자체에서 많은 어려움을 겪었었다..

그 외의 단어

  • JRE(Java Runtime Environment): 자바 파일을 실행할 수 있는 환경 구성. JVM + 클래스 라이브러리 패키지
  • JDK(Java Development Kit): 자바 응용 프로그램을 개발하는 툴. JRE + 개발을 위해 필요한 도구

출처: https://www.javatpoint.com/difference-between-jdk-jre-and-jvm

 

어쩌다 운영체제까지 들먹이게 된 건지 참 정신없지만 여하튼!!! 자바스크립트, 특히 노드로 개발하는 입장에서는 굳이 신경 쓰지 않았던 영역도 알아야 하는 것이 꽤 신선했다.

 

자바스크립트는 일반적으로 웹 브라우저에서 실행된다고 하고(각 브라우저별로 자바스크립트를 실행하는 엔진이 있음), 인터프리터 방식으로 실행된다. 그리고 자바스크립트 런타임을 얘기하면서 자주 언급되는 것이 바로 구글의 V8엔진이다. V8엔진은 크롬 브라우저에 내장되어 있는 엔진으로 자바스크립트 코드를 컴파일(JIT)하고 실행하는 역할을 한다. 여기서 더 나아가 V8엔진은 브라우저 내부에서뿐만 아니라 크롬 밖에서 사용할 수 있도록 별도의 실행 환경을 구축했는데, 그것이 바로 Node.js이다. Node.js 공식문서를 들어가 보면 다음과 같은 설명 문구가 나온다.

Node.js를 이용하여 자바스크립트를 서버 사이드에서도 실행할 수 있다.

 

Interpreted? Compiled?

자바스크립트는 인터프리터 언어라고 했다. 인터프리터 방식의 실행은 코드를 한 줄씩 해석하고 실행하는 방식을 말한다. 즉 작성한 코드의 실행 결과를 바로 확인할 수 있다.

자바스크립트는 인터프리터 방식으로 디버깅을 할 때 에러 발생 지점을 빨리 찾을 수 있는 장점이 있다(물론 개발 방식에 따라 에러 찾기 무진장 어려울수도...). 코드가 바로 실행되기 때문에 코드 개발 및 테스트도 빨리 확인할 수 있어서 빠른 개발에 유리하다. 그래서 많은 스타트업, 신사업 프로젝트에서 Node에 대한 수요 점차 증가하고 있는 추세인 것 같다. 또한 위에서 말했던 것처럼 자바스크립트는 웹 브라우저에서 실행되기 때문에 별도의 인터프리터를 설치할 필요가 없다. 즉 개발에 대한 진입장벽이 낮은 편이다.

하지만 인터프리터는 실행 속도가 느리다는 단점이 있다. 그리고 지금은 타입스크립트 덕분에 많이 나아지긴 했지만, 런타임 시 발견되는 에러들도 있어서 꽤 난감할 때가 있다.. 암튼, 자바스크립트의 느리다는 단점은 구글에서 개발한 JIT(Just-In-Time) 컴파일러라는 기술로 많이 해결되었다. JIT컴파일러는 프로그램을 실행하는 동안 코드를 해석하고 필요한 부분을 실시간으로 컴파일하여(기계어로 변환) 성능을 최적화한다(구글 크롬뿐만 아니라 다른 브라우저 엔진들도 JIT기술을 적용하여 실행 성능을 높이고 있는 것으로 알고 있다).

 

JIT를 통해 코드 일부를 컴파일하긴 하지만 어찌됐든 자바스크립트는 인터프리터 언어다. 그렇다면 자바는 뭘까? JVM을 설명하면서 봤던 것처럼 자바 컴파일러가 자바 코드를 바이트 코드로 컴파일하는 과정이 있기 때문에 당연히 컴파일 언어라고 생각했다.

 

하지만 자바는 인터프리터 언어임과 동시에 컴파일 언어라고 설명하는 글들이 많고, 자바 강의를 하시는 강사분들도 그렇게 설명하셨다. 구글링하던 중 해외의 어느 교육 사이트에서 다음과 같이 언급한 것이 있다.

The Java source code first compiled into a binary byte code using Java compiler, then this byte code runs on the JVM (Java Virtual Machine), which is a software based interpreter. So Java is considered as both interpreted and compiled.

즉 자바는 자바 소스 코드를 먼저 바이트 코드로 컴파일한 후, 그 다음 바이트 코드를 JVM에서 인터프리터 방식으로 실행된다고 한다. 그래서 자바는 인터프리터, 컴파일 두 방식이 모두 사용되는 것으로 간주된다고 한다. 이러한 인터프리터 + 컴파일 방식의 조합으로 자바는 "Write Once, Run Anywhere"라는 특성은 가진다고 한다. 앞서 말했던 자바의 특성처럼 C와 같이 각각의 운영체제에 맞게 컴파일 과정을 거쳐야 하는 언어와 다르게 자바는 JVM을 통해 어떤 플랫폼에서도 실행할 수 있다는 것이 큰 장점이다.

 

JDK 설치

JDK는 위에서 잠깐 언급했듯이 자바 프로그래밍을 하기 위해 필요한 툴킷이다. 자바 컴파일러, JVM, 자바 런타임 환경(JRE), 개발을 돕는 다양한 도구 등이 포함되어 있는 도구 모음집이라고 생각하면 된다. JDK 설치는 여러 방법이 있겠지만, 나는 여러 툴들을 설치하는 것을 도와주는 SDKMAN이라는 매니저를 통해 설치했다. 나는 Mac Pro16 M2를 사용하고 있고, 맥OS가 유닉스 기반이기 때문에 이 매니저 설치를 쉽게 했다(윈도우 운영체제는 다른 방식을 찾아봐야 하는 것 같음..).

 

사이트에 나온 것과 같이 아래의 명령어를 터미널에 입력하면 쉽게 설치할 수 있다.

curl -s "https://get.sdkman.io" | bash

 

설치가 완료 후 터미널에서 "sdk list java"를 입력하면 다음과 같은 화면을 마주하게 될 것이다.

이렇게 여러 버전들의 리스트가 나오는데, 여기서 내가 사용하기 원하는 버전을 찾아서 설치하면 된다. 나는 이미지에서 보이는 것과 같이 Corretto의 17.0.7버전의 자바를 설치했다. 명령어는 다음과 같다.

sdk install java 17.0.7-amzn

설치 후, "java -version"을 입력하면 현재 설치된(사용하고 있는) 자바의 버전을 확인할 수 있다.

 

만약 여러 프로젝트를 진행하고 있고, 각 프로젝트마다 다른 자바 버전을 이용한다면 다음과 같은 명령어를 사용하여 자바 버전을 바꿀 수 있다.

sdk use java 11.0.20-amzn

 

스트링부트 역시 해당 명령어도 설치할 수 있다.

sdk install stringboot

이렇게 뒤에 버전을 따로 명시하지 않으면 가장 최근의 LTS버전이 다운된다.

 

 

자바스크립트에서도 이와 유사한 기능을 하는 것으로 nvm이 있다. nvm이 설치되어 있다면 nvm ls 명령어를 통해 현재 기기에 설치되어 있는 node 버전들을 확인할 수 있다.

현재 node는 18버전이 LTS이고, 우리 팀은 지금 18.14.2버전을 사용하고 있다. 현재 우리팀은 마이그레이션 작업을 진행 중에 있고, 기존 develop 브랜치의 버전은 14버전이다. 그래서 마이그레이션 브랜치와 스위칭을 할 때, nvm use 14.18.1 명령어를 통해 버전을 바꿔서 사용한다.

 

 

오랜만에 새로운 언어를 공부하기 시작했는데 아직 입문 단계라서 그런지 꽤 재밌다...! 앞으로도 계속 자바스크립트와 비교하면서 공부 내용들을 정리해보자!!

반응형