2021. 4. 22. 18:38ㆍLanguage/Java
1. JVM (Java Virtual Machine)
1) JVM 이란 ?
JVM은 자바 가상 머신으로 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다. 그리고 JVM은 Java와 OS 사이에서 중간자 역할을 수행하여 Java가 OS에 구애받지 않고 재사용을 기능하게 해준다. 가장 중요한 메모리 관리, GC를 수행한다.
한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해서 자바 가상 머신을 알아야한다. 메모리 효율성을 위해 메모리 구조를 알아야 하기 때문이다. 동일한 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우된다. 메모리 관리가 되지 않은 경우 속도 저하 현상이나 튕김 현상 등이 일어날 수 있다.
2) Java 프로그램 실행 과정
- 프로그램이 실행되면 JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받는다.
- JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.
- 자바 컴파일러 (javac)가 Java 소스 코드 (java)를 읽어들여 자바 바이트 코드(.class)로 변환한다.
- Class Loader를 통해 class 파일들을 JVM으로 로딩한다.
- 로딩된 Class 파일들은 Execution engine을 통해 해석된다.
- 해석된 바이트코드는 Runtime Data Areas 에 배치되어 실질적인 수행이 이루어지게 된다.
- 실행과정 속에서 JVM은 필요에 따라 쓰레드 동기화와 GC같은 관리 작업을 수행한다.
2. JDK (JRE)
어떤 운영체제에서도 동일한 형태로 실행시킬 수 있도록 해주는 것이 JVM이다.
JRE (Java SE Runtime Enviroment)는 Java 언어로 작성된 프로그램을 실행하기 위해 사용된다. Java 언어를 사용하는 개발자가 아닌 Java 언어로 만들어진 프로그램을 실행하는 사용자라면 JRE만 컴퓨터에 설치하면 된다.
Java 언어 개발자는 Java 언어로 작성된 소스를 컴파일하고 관리한다. 이 때 사용되는 도구를 JDK (Java SE Development Kit)라고 한다. JDK 안에는 JRE도 포함이 되어있다. 컴파일한 결과를 실행하기 위해서는 JRE가 필요하기 때문이다.
따라서 JDK를 설치할 때 환경설정을 해주어야 정상적으로 동작한다. 운영체제마다 환경 설정 방법은 다르지만, 설치해야할 환경 변수의 이름은 동일하다.
- Oracle JDK와 OpenJDK
앞서 설명한 내용을 요약하자면, Java 애플리케이션을 실행하기 위해서는 JVM이 필요하고 컴파일하기 위해서는 JDK가 필요하다. 일반적으로 JDK를 설치하면 JVM(HotSpot이라고도 표현)도 설치가 된다.
Oracle이 Java를 인수하면서 Oracle의 JDK와 Sun의 OpenJDK로 나뉘어졌다. Oracle JDK의 경우 OpenJDK의 구현에 더해 여러 추가적인 요소들을 포함하여 유료 라이센스이다. JDK는 1.8 이상부터 유료로 변경되었기에 사용을 하기 위해서는 라이센스 비용을 지불해야한다. (비상업적인 경우에는 무료로 사용이 가능) 반면 OpenJDK의 경우 모든 JDK의 구현 기준이 되며 무료 라이센스이다.
결정적으로 이 두 가지는 지원 및 유지보수의 범위와 기간에서 차이가 있다. Oracle은 3년 정도의 릴리즈 주기를 가지며 오랜기간 Oracle에 의해 지원이 이루어지고, OpenJDK는 6개월마다 릴리즈 되는데, 릴리즈된 버전은 다음 릴리지 전까지만 지원 가능하고 그 후에는 유지보수가 이루어지지 않는다.
현재 Oracle JDK 라이센스를 보유하고 있지 않은 기업의 개발자라면, OpenJDK를 사용하는 것이 맞고, Oracle JDK에 포함된 요소를 반드시 사용해야 한다면 Oracle JDK를 쓰는게 맞다.
- AdoptOpenJDK
AdoptOpenJDK는 사전에 prebuild 형태로 Java binary를 제공하는 커뮤니티 그룹이다. 홈페이지 Mac 뿐만 아닌 윈도우, 리눅스 환경도 제공한다. 공식적으로 OpenJDK를 설치하는건 직접 빌드해서 사용하는 방법이 있지만, 빌드 이외에도 자잘한 JAVA_HOME 설정 문제 혹은 버전업을 편하게 하기 위해서 Homebrew를 사용해 AdoptOpenJDK를 설치한다.
3. JAR vs WAR
1) JAR vs WAR
JAR, WAR은 모두 Java의 jar 툴을 이용하여 생성된 압축 파일이며 애플리케이션을 쉽게 배포하고 동작시킬 수 있도록 관련 파일들을 패키징해주는 것이 주 역할이다. 보통 Maven 등을 통해 내려받는 라이브러리들은 Class 파일들이 묶인 jar 파일로 구성되어 있다. 그리고 서비스 배포시에는 프로젝트를 WAR 포맷으로 묶어서 /webapps 등의 지정된 경로에 넣고 Tomcat 등의 웹 컨테이너를 이용하여 배포한다.
2) JAR
.jar 확장자 파일에는 Class와 같은 Java 리소스와 속성 파일, 라이브러리 및 액세서리 파일이 포함되어 있다. 쉽게 Java 애플리케이션이 동작할 수 있도록 Java 프로젝트를 압축한 파일이라고 생각하면 된다. 실제로 JAR 파일은 플랫폼에 귀속되는 점만 제외하면 WIN ZIP 파일과 동일한 구조다. JAR 파일은 원하는 구조로 구성이 가능하며 JDK에 포함되고 있는 JRE만 가지고도 실행이 가능하다.
3) WAR
.war 파일은 Servlet/JSP 컨테이너에 배치할 수 있는 웹 애플리케이션 압축 파일 포맷이다. JSP, Servlet, Jar, Class, XML, HTML, JavaScript 등 Servlet Context 관련 파일들로 패키징 되어 있다. WAR는 웹 응용 프로그램을 위한 포맷이기 때문에 웹 관련 자원만 포함하고 있으며 이를 사용하면 웹 애플리케이션을 쉽게 배포하고 테스트할 수 있다. 원하는 구성을 할 수 있는 JAR와 다르게 WAR은 WEB-INF 및 META-INF 디렉토리로 사전 정의된 구졸르 사용하며 WAR 파일을 실행하려면 Tomcat, Weblogic, Websphere 등의 웹 서버 또는 웹 컨테이너가 필요하다. WAR 파일도 Java의 JAR 옵션을 이용하여 생성하는 JAR 파일의 일종으로 웹 애플리케이션 전체를 패키징하기 위한 JAR 파일이라고 생각하면 된다.
쉽게 말해 JAR가 가장 작은 압축 범위를 가지고 있고, WAR은 JAR의 모든 파일과 WAR만의 파일을 더 압축한다고 보면 된다.
'Language > Java' 카테고리의 다른 글
[Java] Java Garbage Collection (0) | 2021.04.22 |
---|---|
[Java] LocalDate, LocalTime, LocalDateTime (0) | 2021.04.03 |
[Java] 객체지향 5대 원칙 SOLID (0) | 2020.11.02 |
[Java] 명명 규칙 (0) | 2020.07.21 |