JAVA Runtime Enviroment(JRE)는 하나의 프로세스, 다수의 스레드 환경이다.
JVM은 하나의 프로세스로 동작하고 다수의 스레드로 병렬처리를 지원한다. 이런 환경은 Web Service에 매우 적합하다.
프로세스A가 CPU를 점유하고 있다. CPU가 프로세스A를 프로세스B로 바꾸려고 한다. 이를 컨텍스트 스위칭(Context Switching)이라 부른다. 컨텍스트 스위칭은 오버헤드를 발생시킨다. 컨텍스트 스위칭 작업을 담당하는 디스패처 프로그램이 동작해야 하고 이는 커널수준의 작업이기에 그렇다. 또한 메모리도 서로 독립적이기에, 프로세스가 늘어날수록 메모리 낭비도 심해진다.
초기 동적인 웹페이지 구현 시, Request를 하나의 프로세스에 할당했다. 대표적으로 CGI(Common Gateway Interface )가 있다. 웹서비스에는 수많은 Request가 발생한다.. Request가 들어올 때마다 Process를 생성하면 메모리 부담이 늘어나고 컨텍스트 스위칭은 잦은 오버헤드를 발생시킨다.
그러므로 하나의 프로세스에서 다수의 스레드가 동작하는 자바 런타임 환경이 웹서비스를 운영하기에 적합하다.
프로세스 하나를 여러 개의 작업으로 나누어 처리하는데, 이때의 작업단위를 스레드(Thread)라 부른다. Thread의 장점은 Process의 메모리를 공유하고 CPU 자원을 두고 Thread 간의 변경이 일어날 때, 커널이 개입하지 않아 오버헤드가 발생하지 않는다는 것이다. 프로세스가 CPU를 잡고 자체적으로 자원을 변경하는 것이다.
JAVA 환경에서 동작하는 WAS의 경우, Request 요청이 들어오면 JVM이 관리하는 스레드풀에서 스레드 하나를 Request에 할당한다. 스레드는 CPU를 점유하고 JVM 프로세스 내에 메모리를 할당받아 로직을 처리할 준비를 마친다. 요청이 들어온 URL을 기준으로 처리할 Servlet을 선택한다. Servlet이 없다면 web.xml을 참고하여 Servlet을 생성한다. 요청 데이터는 HttpServletRequest 객체에 담아 Servlet의 service 메소드의 매개변수로 넘긴다. service 메소드는 JAVA 로직으로 요청데이터를 처리한다. 요청을 처리하면 응답을 HttpServletResponse에 담아 반환한다. 서블릿은 스레드에 service 메소드 로직을 제공하는 역할을 한다. 그러므로 Request가 들어올 때마다 서블릿을 새로 생성할 필요가 없다. 서블릿은 하나만 생성하여 서블릿 컨테이너에 저장하고 생명주기를 관리하면 된다.
이것이 JAVA 환경의 웹서비스에서 Request가 들어올 때 이를 동적으로 처리하는 과정이다.
정리하면 JVM은 하나의 프로세스, 다수의 스레드를 지원하는 환경이다. JVM 프로세스가 동작하는 WAS는 Request가 들어오면 스레드풀에서 스레드 하나를 할당하여 서블릿 로직을 처리한다. 서블릿은 스레드에 로직을 제공하는 역할로 하나의 객체만 생성되어 서블릿 컨테이너에 저장되어 관리된다.
참고자료
'SPRING > Spring MVC' 카테고리의 다른 글
[SpringMVC] MVC 패턴 구현하기(3) - Model (0) | 2023.08.09 |
---|---|
[SpringMVC] MVC 패턴 구현하기(2) - Controller (0) | 2023.08.08 |
[SpringMVC] MVC 패턴 구현하기(1) - View (0) | 2023.08.08 |
[SpringMVC] 응답(Response)의 종류 ( Text, Html, Json ) (0) | 2023.08.08 |
[SpringMVC] 요청(Request)의 종류 ( GET, POST, JSON ) (0) | 2023.08.02 |