Dispatcher Servlet이란
HTTP프로토콜로 들어오는 모든 요청을 제일 먼저 받아서 적당한 컨트롤러에 매핑시켜주는 프론트 컨트롤러이다.
Dispatcher Servlet
도HttpServlet
(Servlet 클래스) 를 상속 받는Servlet
의 일종이기 때문에Dispatcher Servlet
를 이해하기 위해서는Servlet
을 먼저 이해해야한다.
웹 애플리케이션에서 HTTP 프로토콜을 이용해 요청처리하고 응답을 하는 자바 클래스
스프링 부트 먼저 공부한 사람이라면Controller
라는 명칭이 익숙할텐데Servlet
을 더 간단하게 작성하도록 도와준게Controller
라고 생각하면 된다.
service()
코드 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
if (method.equals("GET")) {
// 내용이 더있지만 생략
this.doGet(req, resp);
} else if (method.equals("HEAD")) {
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
요청이 오면
service()
함수가 method에 따라서 동작할 함수를 실행한다.
Servlet Container
는Servlet
을 관라하는 역할을 한다.
Servlet Container
동작 순서
- 사용자가 요청을 하면 요청한 URL을 확인한다.
- Url에 맞는 인스턴스가 인스턴스화된 목록에 있으면 그 인스턴스를 반환한다.
- Url에 맞는 인스턴스가 인스턴스화된 목록에 없으면
init()
함수와 함께 생성하여 저장한다.
여기에서init()
은 위에서 나온Servlet
의init()
함수이다.
앞서
Servlet Container
의 동작순서 첫번째인 요청한 URL을 확인하는 과정을Dispatcher Servlet
이 한다고 생각하면 된다.
포스팅 맨 위에서도 설명했듯이Dispatcher Servlet
은 HTTP프로토콜로 들어오는 모든 요청을 제일 먼저 받아서 적당한 컨트롤러에 매핑시켜주는 프론트 컨트롤러이다.
받은 요청의 URL에 대한 컨트롤러를 검색하고, 있다면 그 컨트롤러를 실행시킨다.
void initStrategies(ApplicationContext context)
void doService(HttpServletRequest request, HttpServletResponse response) // doDispatch() 호출
void doDispatch(HttpServletRequest request, HttpServletResponse response) // 실제 요청 처리
void processDispatchResult(HttpServletRequest request, HttpServletResponse response,HandlerExecutionChain) //render() 호출
void render(ModelAndView mv, HttpServletRequest, HttpServletResponse response) // 응답결과 생성 및 전송
Servlet의 한종류로 상속을 받기 때문에
doService()
가 실행되는 것을 볼 수 있다.
DispatcherServlet
이 맨 처음 요청을 받는다.HandlerMapping
이 "/hello"에 대한 컨테이너가 있는지 검색한다.HandlerAdapter
에 위임한다.HandlerAdapter
는 ServletContainer
에서 생성된 Servlet
인스턴스가 이미 있다면 그 Servlet
을 가져오고, 없다면 새로 생성해서 저장하고 가져온다.HandlerAdapter
는 이렇게 가져온 Servlet
의 동작을 수행시키고 그 결과값을 DispatcherServlet
에게 전달한다.DispatcherServlet
는 HandlerAdapter
가 보낸 결과값을 Client에게 보낸다.참고
7번과정에서 Controller의 결과가 @ResponseBody나 @RestController와 같은 값을 전달한다면 그대로 Client에게 보내지만,
Thymleaf, JSP처럼 View를 반환한다면, ViewResolver
한번 더 거쳐 View가 있는지 체크하고 있다면 그 View를 반환하게 된다.
https://velog.io/@ejung803/Spring-Web-MVC%EC%9D%98-Dispatcher-Servlet%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC
https://velog.io/@hsw0194/Spring-MVC-HandlerMapping%EC%9D%98-%EB%8F%99%EC%9E%91%EB%B0%A9%EC%8B%9D-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1%ED%8E%B8
https://mangkyu.tistory.com/18
https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-%EB%9E%80