DispatchServlet에 대해 설명하기전 먼저, web.xml과 FrontController, RequestDispatcher에 대해 언급하겠다.
web.xml의 역할으로는 다음과 같다
- ServletContext의 초기 파라미터
- Session의 유효시간 설정
- Servlet/JSP에 대한 정의
- Servlet/JSP 매핑
- Mime Type 매핑
- Error Pages 처리
- 리스너/필터 설정
- 보안
여기에서 Servlet/JSP 매핑시(web.xml에 직접 매핑 or @WebServlet 어노테이션 사용)에 모든 클래스에 매핑을 적용시키기에는 코드가 너무 복잡해지기 때문에 FrontController 패턴을 이용함.
최초 앞단에서 request 요청을 받아서 필요한 클래스에 넘겨준다.
왜? web.xml에 다 정의하기가 너무 힘듬.
이때 새로운 요청이 생기기 때문에 request와 response가 새롭게 new될 수 있다. 그래서 아래의 RequestDispatcher가 필요하다.
RequestDispatcher이란 현재 request에 담긴 정보를 저장하고 있다가 그 다음 페이지 그 다음 페이지에도 해당 정보를 볼수있게 계속 저장하는 기능이다 즉, 필요한 클래스 요청이 도달했을 때 FrontController에 도착한 request와 response를 그대로 유지시켜준다.
예를들어,
A.jsp 에 담겨있는 param 이라는 이름의 파라미터를
B.jsp에서도 C.jsp에서도 받아 볼수 있다는 뜻.
물론 그 중간에 가공을 하지 않는다는 가정.
request - response 의 단계에서 forward와 sendRedirect 방식이 있는데 forward에서는 A.jsp -> Servlet -> B.jsp 로 넘어감에 따라 A.jsp가 가지고 있는 파라미터 정보를 가지고 B.jsp로 넘겨주는 반면, sendRedirect 방식에선 모든 파라미터 정보를 제외하고 단순 페이지 호출만 하는 차이가 있다. 하지만 RequestDispatcher 없이 forward를 하게 되면 A.jsp -> Servlet -> B.jsp까지는 파라미터 정보가 넘어가지만 그 다음 단계에서 A.jsp의 파라미터를 별도로 저장하지 않는다면 소실되게 된다.