
서블릿은 클라이언트의 요청을 처리하고 그 결과를 반환한는 자바 웹 프로그래밍 기술이다.물론 검증 로직을 통과했을 때의 이야기지만 검증에 관하여서는 다른 글을 통해 정리할 예정이다.

서블릿을 관리하기 위해서는 서블릿 컨테이너가 필요하다. 일반적으로 톰캣(Tomcat)처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 부른다. (WAS가 더 큰 개념이다.) 서블릿 컨테이너는 상당히 많은 역할을 가지고 있는데, 다음과 같다.
서블릿 컨테이너 내부에는 ThreadPool이라는 공간이 존재해서 필요한 쓰레드를 미리 쓰레드 풀에 보관해놓고 관리한다. 개발자의 설정으로 최대치를 관리할 수 있으며, 서블릿 컨테이너는 쓰레드가 필요하면 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용하고, 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다.
최대 쓰레드 수를 너무 높게 잡으면 서버 리소스가 과하게 사용될 수 있고, 너무 낮게 잡으면 클라이언트가 접속에 불편을 겪게될 수 있기 때문에 개발자가 적절하게 컨트롤할 수 있어야 한다.
기존의 서블릿도 당시에는 나름 획기적인 기술이였으나 기존의 서블릿은 객체를 일일히 생성하고 web.xml 문서에 기록해줘야 했다.게다가 매번 공통적으로 처리해야할 작업이 많아 중복 코드가 많아졌고 HttpServlet에 의존하기 때문에 의존성 문제까지 존재했다. Dispatcher Servlet은 이러한 문제들의 상당 부분을 해결해준다.

Dispatcher Servlet은 모든 요청을 가로채서 공통으로 관리하기 때문에 web.xml에 대한 의존을 극적으로 낮출 수 있게 해주며, 하나의 서블릿으로 모든 것을 관리하기 때문에 당연히 공통 코드도 깨끗하게 사라졌다. (자세한 원리는 front-controller pattern을 찾아보자.)
또한 HttpServlet 클래스에 대한 의존성 문제도 완벽하게 해결해서 @Controller같은 사랑스러운 어노테이션들을 활용할 수 있게된 것이다.
다만 Dispatcher Servlet을 사용하게 되면 정적 자원에 대한 처리가 상당히 특이해지는데, 수문장 역할을 하면서 정적 자원까지 모두 가로채버리는 것이다. 이런 경우 Dispatcher Servlet은 우선 웹 어플리케이션에서 우선 컨트롤러를 탐색한 다음, 2차적으로 설정된 경로(일반적으로 static)을 탐색하게 된다.
인용 및 래퍼런스
https://7357.tistory.com/180