EnjoyCSStudy / CS-Knowledge-Source

0 stars 0 forks source link

231217 Java & Spring Interview Question #6

Open skydreamer21 opened 9 months ago

skydreamer21 commented 9 months ago

Java & Spring 관련 면접 질문 달아주세요!

skydreamer21 commented 9 months ago

JVM의 주요 특징에 대해서 설명해주세요.

BaeYoungSuk commented 9 months ago

Garbage Collector에 대해서 설명해주세요.

soun997 commented 9 months ago

스프링은 클라이언트가 전송하는 JSON 형식의 Message Body를 어떻게 Java Object로 변환할 수 있나요?

rt3310 commented 9 months ago

aot 컴파일과 jit 컴파일에 어떤 차이가 있나요

BaeYoungSuk commented 9 months ago

JVM의 주요 특징에 대해서 설명해주세요.

자바 바이트코드를 실행할 수 있는 주체이며, OS에 독립적이라는 특징을 가지고 있습니다. 클래스 로더, 실행엔진, 메모리 영역으로 구성되어 있습니다.

Garbage Collector에 대해서 설명해주세요.

Heap 메모리 영역에서 더 이상 호출되지 않는 객체를 찾아 지우는 역할을 합니다. Heap 메모리 영역은 Young Generation과 Old generation, Permanent Generation 으로 구분되어 있습니다. 이 때 Young Generation에서 일어나는 GC를 minor GC, Old generation에서 일어나는 GC를 major GC라고 합니다.

스프링은 클라이언트가 전송하는 JSON 형식의 Message Body를 어떻게 Java Object로 변환할 수 있나요?

내부적으로 Jackson Library의 ObjectMapper를 통해 객체를 매핑합니다.

aot 컴파일과 jit 컴파일에 어떤 차이가 있나요.

가장 큰 차이는 실행 전에 컴파일하는지, 실행 중에 컴파일하는지

AOT(Ahead Of Time)

JIT

rt3310 commented 9 months ago

JVM의 주요 특징에 대해서 설명해주세요.

JVM은 자바 바이트코드를 실행할 수 있는 주체이다. 즉, 자바 애플리케이션을 클래스 로더를 통해 읽어들여 자바 API와 함께 실행하는 역할을 수행한다. 자바 바이트코드는 플랫폼에 독립적이며 모든 JVM은 JVM 규격에 정의된 대로 자바 바이트코드를 실행한다. 따라서 표준 자바 API까지 동일한 동작을 하도록 구현한 상태에서는 이론적으로 모든 자바 프로그램은 CPU나 운영 체제의 종류와 무관하게 동일하게 동작할 것을 보장한다. 또 JVM은 메모리 관리와 Garbage Collection도 수행한다.

Garbage Collector에 대해서 설명해주세요.

GC는 자바의 메모리 관리 방법 중 하나로 JVM의 힙 영역에서 동적으로 할당했던 메모리 중 필요 없게 된 메모리 객체(garbage)를 모아 주기적으로 제거하는 프로세스를 말한다. C/C++에서는 이러한 GC가 없어 프로그래머가 수동으로 메모리 할당과 해제를 일일이 해줘야하지만 Java에서는 가비지 컬렉터가 메모리 관리를 대행해주기 때문에 Java 프로세스가 한정된 메모리를 효율적으로 사용할 수 있게 하고, 개발자 입장에서 메모리 관리, 메모리 누수 문제에 대해 관리하지 않아도 되어 개발에 집중할 수 있다는 장점이 있다. 자동으로 처리해준다 해도 메모리가 언제 해제되는지 정확하게 알 수 없어 제어하기 힘들며, 가비지 컬렉션(GC)이 동작하는 동안에는 다른 동작을 멈추기 때문에 오버헤드가 발생되는 문제점이 있다. 이를 Stop The World라 하는데 이로 인해 GC가 너무 자주 실행되면 소프트웨어 성능 하락의 문제가 되기도 한다.

스프링은 클라이언트가 전송하는 JSON 형식의 Message Body를 어떻게 Java Object로 변환할 수 있나요?

스프링에는 HttpMessageConverter가 정의되어 있는데, 이는 HTTP message body를 사용한 요청 및 응답을 처리할 때 사용된다. HTTP 요청 및 응답은 @RequestBody 또는 @ResponseBody 어노테이션을 사용하여 구현할 수 있다. 요청을 받는 경우에는 클라이언트로부터 들어온 request의 타입이 application/json인 경우 HttpMessageConverter가 호출되며 converter가 request body의 내용을 읽는다. 이후 읽어온 json을 HttpEntity 객체 또는 @RequestBody와 함께 사용된 Model 객체로 변환한다. 요청에 응답하는 경우에는 앞서 언급한 것과 같이 @ResponseBody 어노테이션을 명시하거나 HttpEntity를 사용하여 Model 객체를 반환하는 경우 MessageConverter가 호출된다. 이때 메서드의 반환 값이 HttpMessageConverter에 전달되며 HttpMessageConverter는 해당 객체를 json 형식으로 변환하여 클라이언트에게 전달한다. HttpMessageConverter는 인터페이스이며 구현체는 String으로 변환하는 StringHttpMessageConverter와 Json으로 변환하는 MappingJackson2HttpMessageConverter 2가지가 있다. 이는 Request 헤더의 Content-type을 기준으로 데이터 타입을 검증하여 구현체가 선택되는데, request의 경우 Accept 헤더를 반드시 확인해야 한다. 여기서 Accept Header란 Client가 HTTP Response를 받을 때, 특정 형식의 데이터로 변환해달라고 서버에 요청/명시하는 것이다. 만약 Accept 헤더가 존재하지 않는다면, 백엔드에서 처리하는 형식대로 응답이 전달된다.

aot 컴파일과 jit 컴파일에 어떤 차이가 있나요

AOT 컴파일은 사람이 읽을 수 있는 코드를 컴파일러에 넣고 바로 실행 가능한 기계어로 변환시키는 과정을 말한다. AOT는 프로그램을 실행할 플랫폼과 프로세서 아키텍처에 딱 맞은 실행코드를 얻는 것이다. 때문에 이렇게 대상이 고정된 바이너리는 프로세서별로 특수한 기능을 활용해 프로그램 속도를 높일 수 있다. 하지만 대부분의 실행 코드는 자신이 어떤 플랫폼에서 실행될지 모르는 상태에서 생성되므로 AOT 컴파일은 자신이 사용 가능한 프로세서 기능에 대해 가장 보수적인 선택을 해야한다. 때문에 AOT 컴파일한 바이너리는 CPU 기능을 최대한 활용하지 못하는 경우가 다반사고 성능 향상의 숙제가 남는다. JIT 컴파일은 런타임에 프로그램을 고도로 최적화한 기계어로 변환하는 기법이다. 대부분의 주요 상용 JVM이 이 방식으로 작동된다. JIT는 프로그램의 런타임 실행 정보를 수집해서 어느 부분이 자주 쓰이고, 어느 부분을 최적화해야 가장 효과가 좋은지 프로파일을 만들어 결정을 내린다. JIT 서브 시스템은 실행 프로그램과 VM 리소스를 공유하므로 프로파일링, 최적화 비용, 성능 향상 기대치 사이의 균형을 맞추어야 한다.

skydreamer21 commented 9 months ago

JVM의 주요 특징에 대해서 설명해주세요.

JVM의 주요특징으로는 JAVA의 이식성을 지원한다는 점과 메모리관리를 말할 수 있습니다. Java 코드는 OS에 상관없이 어디서나 실행가능한데 이는 JVM이 애플리케이션과 OS사이에서 각 실행환경에 맞게 기계어로 변환하기 때문입니다. 다음으로 Java는 C언어와 달리 개발자가 직접 힙의 메모리관리를 하지않아도 되는데 이는 JVM의 가비지컬렉터가 더 이상 쓰지 않는 메모리를 자동으로 해제해주기 때문입니다.


Garbage Collector에 대해서 설명해주세요.

Gabage Collection은 자바의 메모리 관리 기법 중 하나로 JVM의 Heap영역에 할당했던 메모리 중 필요없게 된 메모리 객체를 모아 주기적으로 제거하는 프로세스입니다. 복잡한 메모리 과정을 개발자가 직접 다루지 않아도 되기때문에 그만큼 더 애플리케이션 로직에 집중할 수 있습니다. 하지만 가비지 컬렉터가 동작할 때 다른 동작을 멈추기 때문에 최적화를 통해영향을 최소화 하는 것이 중요한 과제입니다.


스프링은 클라이언트가 전송하는 JSON 형식의 Message Body를 어떻게 Java Object로 변환할 수 있나요?

스프링에서 역직렬화 과정은 HttpMessageConverter에 의해 진행됩니다. 그 중에서도 Content-Type 이 JSON 인 것에 대하여 MappingJackson2HttpMessageConverter 가 사용됩니다. 이 과정은 요청에 대한 핸들러 매핑과 핸들러 어댑터에 대한 정보를 주고 받을 때 이루어지는데 ArgumentResolver 를 통해 @RequestBody 가 처리되면서 Converter가 해당역할을 하게 됩니다.


aot 컴파일과 jit 컴파일에 어떤 차이가 있나요

AOT (Ahead-of-Time) 컴파일은 프로그램을 실행하기 전에 이미 기계어 코드로 변환된 실행 파일을 생성 합니다. 따라서 이미 최적화된 기계어 코드를 사용하므로, 프로그램이 실행될 때 높은 성능을 보일 수 있습니다. 하지만 해당 플랫폼에서만 돌아간다는 이식성이 낮은 단점이 있습니다.

JIT (Just-in-Time) 컴파일은 런타임에 실행 코드를 생성합니다. 즉, 프로그램이 실행되는 동안 필요한 부분을 필요할 때마다 기계어 코드로 컴파일합니다. 따라서 런타임에 최적화를 수행하므로, 특정 플랫폼에 대한 최적화를 런타임에 수행할 수 있으므로 이식성이 높은 특징을 가지고 있습니다. 하지만 실행 파일로 바로 실행하는 것이 아니라 중간 과정을 거치기 때문에 프로그램 시작속도가 느릴 수 있습니다.