Tomcat(WAS, Servlet Container)
Tomcat은 Java 웹 애플리케이션을 호스팅하기 위한 서버(Web Application Server)로, Servlet Container라고도 할 수 있다.
Tomcat은 웹 애플리케이션을 호스팅하기 위해 WAR(Web Application Archive) 파일 형태로 배포한다. WAR 파일은 웹 애플리케이션의 모든 구성 요소와 리소스를 하나로 묶은 일종의 압축파일이다. 주로 Java 웹 애플리케이션을 배포하는데 사용된다.
Tomcat은 위에서 언급한 것처럼 Servlet 컨테이너 역할을 수행하는데, Servlet 인스턴스 생성 및 관리, Servlet의 멀티 스레딩 지원 등이 이뤄진다.
Tomcat의 동작 원리를 좀더 자세히 알아보면 다음과 같다.

- 클라이언트가 정적 파일을 요청하는 경우 웹서버에서 처리되고 동적 파일을 요청하는 경우 웹서버는 Http Request 요청을 Servlet Container(WAS)로 보낸다.
- 요청을 받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성한다. 여기서 HttpServletRequest 객체는 클라이언트의 요청 정보를 담고 있고, HttpServletResponse 객체는 Servlet 생성한 응답을 담고 있다.
- Servlet Container는 사용자가 요청한 URL을 분석하여 어느 Servlet에 대한 요청인지 탐색한다. 이때 Servlet Mapping은 web.xml이나 annotation 방식을 통해 지정된다.
- 요청한 Servlet 객체가 이전에 한번도 생성되지 않았다면 Servlet Container는 Servlet 객체를 생성 후 init() 메서드를 통해 초기화 작업을 수행하고, 메모리에 로드시킨다. 만약 이전에 Servlet 객체가 생성한 적이 있다면 객체를 다시 생성하지 않고 재사용한다.
- 요청에 맞는 Servlet 객체가 생성되었다면, Servlet Container는 Thread Pool에서 Thread를 가져와 할당한다. Thread 생성은 많은 비용이 들고, 너무 많이 생성하면 CPU나 메모리의 한계를 넘어서 서버가 죽어버릴 수 있기 때문에 Thread Pool에 정해진 수의 Thread를 미리 생성해놓고 사용한다.
- Thread가 할당되고나서 Servlet 객체의 service() 메서드를 호출한다. 이때 요청이 Get방식이면 doGet() 메서드를 호출하고, Post방식이면 doPost() 메서드를 호출한다. 이 단계에서 Servlet은 HttpServletRequest, HttpServletResponse 객체를 인자로 전달받아서 클라이언트 요청에 대한 처리를 수행한다.
- 클라이언트 요청에 대한 처리가 끝나면 HttpServletResponse 객체에 응답을 담아서 웹서버로 전달하고 웹서버는 클라이언트에게 응답을 전송한다.
- 응답이 다 끝나면 HttpServletRequest, HttpServletResponse 객체를 소멸시킨다. Servlet 인스턴스는 재사용이 가능하므로, 다음 요청이 오면 해당 인스턴스를 재사용한다.
Resource Links
서블릿 컨테이너 요청 처리 과정
Tomcat의 동작원리