본 포스팅은
https://chanho0912.tistory.com/5
해당 과정의 내용을 이해하고 있다고 가정하고 진행하겠습니다.
위 포스팅에서 WAS 호출 과정에 사용한 그림은 다음과 같다.
간략히 요약하자면,
JSP 즉 Java Request가 오면 Web Server는 해당 요청을 이해하지 못하기 때문에 WAS(Tomcat)으로 제어권을 넘긴다. 그러면 WAS에서 해당 파일을 컴파일, 실행하여 결과물을 다시 정적인 데이터로 변경하여 WebServer에게 제공하여 준다.
그리고 Servlet의 개념을 조금 더 명확히 이해하기 위해 URL과 URI의 차이에 대해 이해하고 있으면 좋다.
URL은 해당 data의 위치를 명시해서 직접적으로 접근을 요청하지만, (ex https://~~~/ChanHo.png)
URI는 식별자에 의해 접근을 요청한다. (ex https://~~~/Images/ChanHo)
Spring Framework는 기본적으로 URL에 의한 접근을 막아놨다. 이는 즉 모든 data에 대해 URI 접근을 시도해야 한다는 것이고 해당 파일은 Java를 거쳐야 한다.
Servlet이란?
서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스
Request가 오면 해당 요청을 자바를 활용하여 처리하는 것 이것을 Servlet이라 한다.
요약하자면,
Spring framework에서는 URI를 통한 data 접근만 허용, 따라서 어떠한 요청이 들어왔을 때 바로 Tomcat이 낚아챈다. 이 Tomcat에서 Servlet을 활용하여 Java를 거쳐 Request에 대해 처리한다. 정도로 이해할 수 있다.
자 그러면 이제 Servlet이 어떻게 동작하는지 살펴보자.
Servlet의 생명주기는 크게 세 가지로 나눌 수 있다.
Init : Servlet instance 생성
Service : 실제 요청에 대한 기능 수행.
Destroy : Servlet instance 삭제
어떠한 요청(Request)이 들어오면, 기존에 생성되어있는 thread가 없거나, thread를 추가할 수 있으면 새로운 Servlet instance를 생성해준다. 하나의 Request와 하나의 Servlet instance는 1:1로 매핑된다고 생각하면 된다.
Service에서는 실제로 해당 instance가 요청에 대한 로직을 처리한다.
마지막으로 instance가 삭제될 때에 Destroy가 호출된다.
한번 그림으로 여러개의 요청이 들어온 상황을 그려보자.
처음 A라는 요청이 들어왔을 때 생성되어있는 스레드가 없기 때문에 스레드를 생성하고 Servlet instance를 생성해준다.
같은 방식으로 B, C 의 요청이 들어왔을 때에도 새로 스레드를 생성하고 Servlet instance를 생성해준다.
하지만 무한으로 스레드를 생성할 수는 없기 때문에 사전에 정의된 개수만큼만 스레드를 생성한다. 만약 20개로 설정했다면, 21번째 Request는 대기열에 존재한다.
A 요청에 대한 처리가 끝났다고 가정해보자
그러면 A가 사용하고 있던 스레드와 Servlet instance를 삭제하지 않고, 그대로 21번째 Request가 사용하게 된다.
즉 모든 요청에 대해 스레드 생성과 init 과정을 실행하지 않고, 기존에 사용할 수 있는 스레드와 instance가 존재한다면 그것을 바로 사용한다.
다음 포스팅에서는 실제로 Spring에서 사용하는 DispatchServlet에 대한 포스팅이 이어질 예정이다.
*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.
'CS 이야기' 카테고리의 다른 글
[ 네트워크 이야기 #1 ] OSI 7 Layers(4-7), HTTP, TCP, UDP (0) | 2021.10.03 |
---|---|
운영체제란? (0) | 2021.08.30 |
Rest API란? (0) | 2021.08.30 |
Cloud Native Architecture란? (0) | 2021.08.25 |
Web Server와 WAS(web application server)란? (2) | 2021.06.13 |