Java

[TIL] spring을 공부하기 전 배워야 할 것들 (1) : Java의 특징과 빌드 과정

손가든 2023. 12. 30. 16:20

오늘부터 java 스프링에 대해 공부할 것이다.

 

예전엔 어떻게 하면 api를 만들어 보낼 수 있는지에 집중했었지만, OS를 공부하면서 내부 구조가 어떻게 되고

 

왜 사람들이 maven과 gradle 중에 하나를 선택하는지 그것들이 무엇인지 등

 

조금 세부적으로 공부해서 내가 주체적으로 선택한 이유를 알고 사용하고 싶다고 생각했다.

 

 

그래서 이번엔 java 스프링을 본격적으로 배우기 전에

 

배워야 할 것들에 대해 공부하고, 그것들을 포스팅해보겠다.

 

1. 자바의 빌드 과정과 특징

 


 

자바의 빌드 과정

 

 

자바의 컴파일 순서를 보자.

 

1. 개발자가 작성한 .java 소스 파일은 자바 가상 머신이 읽을 수 있는 .class 바이트 코드로 컴파일 된다.

 

이 컴파일은 Java Compiler인 javac 가 수행한다.

 

 

2. 이후 컴파일된 .class 바이트 코드는 JVM(자바 가상 머신)의 클래스로더에 전달된다.

 

클래스로더는 동적 로딩(lazy_loading과 같음) 및 링크하여 JVM 내의 가상 메모리 내의 런타임 메모리에 적재한다.

(pintos의 process_exec()함수 내의 load()과정과 동일)

 

 

3. 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다.

 

이때, Execution Engin 내에서는 두가지 방식으로 실행한다.

 

  1. Interpreter : 바이트 코드 명령어를 하나씩 읽어서 해석 후 실행한다. 이는 전체적인 실행 속도가 늦다.

 

  2. JIT compiler : 인터프리터가 한번 컴파일 한 내용을 바이트 코드 전체 단위로 컴파일한다. 따라서 인터프리팅된 메서드는 바이너리 코드 자체로 직접 실행한다.(한번 인터프리터가 컴파일 한 내용을 캐싱하듯 바로 실행하게 해주는 느낌)

 


자바 언어의 특징

 

1. 운영체제에 독립적이다.

 

자바 응용프로그램은 운영체제나 하드웨어가 아닌 JVM에게만 파일을 전달한다.

 

따라서 일종의 에뮬레이터인 자바 가상머신(JVM)을 통해 로딩되고 실행되므로 운영체제에 로딩과 실행을 의존하지 않는다.

JAVA는 운영체제의 버전과 호환에 비교적 독립적이고, 이는 JVM이 운영체제의 호환에 맞게 변경하기에 가능하다.

 

2. 객체지향적이다.

 

객체지향 개념의 특징인 상속, 캡슐화, 다형성이 잘 적용된 순수한 객체 지향 언어이다.

(객체 지향의 특성은 다음 포스팅으로 미루겠습니다.)

 

3. 자동 메모리 관리 (Garbage Collection)

 

동적 메모리 관리를 해야하는 C와 달리 JAVA는 가비지 컬렉터가 자동적으로 메모리를 관리해주므로 malloc, free에 관한 동적 메모리 누수에 관해 신경 쓸 필요가 없다.

 

4. 네트워크와 분산처리를 지원

 

다양한 네트워크 프로그래밍 라이브러리(JAVA API)를 통해 쉽게 네트워크 관련 프로그램을 개발할 수 있다.

 

5. 멀티쓰레드 지원

 

보통 멀티 쓰레드의 지원은 컴퓨터 환경의 내부 운영체제에 따라 구현 방법도 상이하며, 처리 방식도 다르다.

 

그러나 자바는 JVM이 있지.

 

JVM이 여러 쓰레드에 대한 스케줄링을 자바 인터프리터가 담당하며

 

멀티 쓰레드와 관련된 라이브러리가 제공되어 있어서 구현이 쉽다.

 

6. 동적 로딩을 지원

 

자바는 핀토스의 lazy_loading과 같은 동적로딩을 지원한다. 따라서 load 시에 모든 클래스를 로딩하지 않고 필요한 시점에 클래스를 로딩하여 메모리를 관리한다.

 

그 외에도 일부 클래스가 변경되어 재 컴파일 할 때에도 변경된 작업 단위만 컴파일하도록 JIT compiler가 지원한다.