Servlet 과 DispatcherServlet
Servlet
자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램
자바로 구현된 CGI(Common Gateway Interface, 서버와 애플리케이션 간에 데이터를 주고받는 방식)
사진 출처 - https://electricalfundablog.com/common-gateway-interface-cgi/
서블릿의 동작
(0. 로딩시점 혹은 최초 요청 시점에 Servlet 이 생성) -> 서버 설정에 따라 다름
1. Client 가 Http 요청
2. HTTP 요청을 통해 매핑된 URL 이 호출
3. ServletContainer 가 HttpServletRequest, HttpServletResponse 객체 생성 (Http 요청 메시지 기반으로 생성)
4. ServletContainer 가 Servlet 호출
5. 실행
6. 종료 시 Response 객체 정보로 Http 응답 생성
7. 해당 Response 를 웹 브라우저로 날림
(서블릿은 복잡한 Http 요청 메시지를 파싱해서 HttpServletRequest 객체에 담아 제공)
(HttpServletRequest, HttpServletResponse 는 Http 요청과 응답 메시지를 편리하게 이용하도록 도와주는 객체)
서블릿 컨테이너는 요청이 올 때 마다 새로운 자바 스레드를 하나 생성한다
해당 스레드가 로직을 다 처리하고 나면 스레드는 자동으로 소멸된다
서블릿이 가진 문제
서블릿에 대한 내용을 Web.xml 에 넣어놓고 자바 클래스로 해당 서블릿에 대한 로직도 구현해놓으면 웹페이지를 만들수 있다
HTML 만 사용한다면 정적인 화면만 만들 수 있었겠지만 서블릿을 사용하면서 동적인 웹페이지까지 만들 수 있다
하지만 과하게 복잡하다
그래서 동적으로 변경해야 하는 부분을 템플릿 엔진이 처리하도록하는 방법이 이후에 나오게 되었다
=> 자바 코드로 HTML 찍어내는 방식에서 HTML 문서에 자바코드를 넣는 템플릿 엔진을 사용하게 되었다
(ex. JSP, Thymeleaf 등등)
템플릿 엔진을 사용하는 방법으로 진행하다보면 특정 문제가 생길 수 있다
비즈니스 로직과 view 로직이 섞인다는 것인데 이를 해결하기 위해 MVC 패턴이 나오게 되었다
(비즈니스 로직과 뷰 로직 분리)
하지만 여전히 남아있는 문제는 URL 맵핑을 위해 모든 서블릿을 각각 Web.xml 에 등록하여야 했다
또한 중복되는 코드와 공통적으로 처리해야하는 부분이 많다
이런 문제를 해결시켜준 것이 DispatcherServlet 이다
DispatcherServlet
서블릿이 가진 '모든 서블릿을 Web.xml 에 등록해주어야 하고 중복되는 코드가 많다' 라는 문제점을 DispatcherServlet 이 해결해주었다
해결 방법은 컨트롤러 호출 전에 먼저 공통적으로 처리해야 하는 부분을 해결해주는 것이다
-> Front Controller 역할을 하는 것이다
DispatcherServlet 은 FrontController 로서 모든 클라이언트의 요청을 받은 후에 요청에 맞는 컨트롤러를 찾아서 호출해버린다
따라서 공통 기능을 처리해줄 수 있으며, DispatcherServlet 을 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다
(서블릿에 종속되는 부분을 FrontController 에서 제거한 후 종속성이 제거된 객체를 컨트롤러에 넘겨준다)