본문 바로가기
Java

[Servlet-jsp] 첫 화면에 접근했을 때 사용자 요청부터 응답까지의 흐름

by bkuk 2023. 3. 31.

doFilter() 메서드 실행

  • 클라이언트가 localhost:8080으로 접근하면 요청을 처리할 서블릿에 접근하기 전에 먼저 ResourceFilter와 CharacterEncodingFilter의 doFiltre() 메서드가 실행된다. ResourceFilter의 경우 해당 요청이 정적 자원( CSS, 자바스크립트, 이미지 ) 요청이 아니기 때문에 서블릿으로 요청을 위임한다.

 

service() 메서드 실행

  • 요청 처리는 "/" 으로 매핑되어 있는 DispatcherServlet이므로 이 서블릿의 service() 메서드가 실행된다.

 

URL 분석 후 Controller 객체 찾음

  • service() 메서드는 요청받은 URL을 분석해 해당 Controller 객체를 Request Mapping에서 가져온다. 요청 URL은 "/"이며, 이와 연결되어 있는 HomeController가 반환된다.

 

serivce() 메서드는 excute() 메서드로 작업을 위임

  • service() 메서드는 HomeController의 execute() 메서드에게 작업을 위임한다. 요청에 대한 실질적인 작업은 HomeController의 execute() 메서드에서 진행된다. execute() 메서드의 반환 값은 ModelAndView이다.

 

render() 메서드가 실행

  • service() 메서드는 반환 받은 ModelAndView의 모델 데이터를 뷰의 render() 메서드에 전달한다. 이 요청에서 View는 JspView이다. JspView는 render() 메서드로 전달된 모델 데이터를 home.jsp에 전달해 HTML을 생성하고, 응답함으로써 작업을 끝낸다.

 

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String requestUri = req.getRequestURI();
    logger.debug("Method : {}, Request URI : {}", req.getMethod(), requestUri);

    Controller controller = rm.findController(req.getRequestURI());
    ModelAndView mav;
    try {
        mav = controller.execute(req, resp);
        View view = mav.getView();
        view.render(mav.getModel(), req, resp);
    } catch (Throwable e) {
        logger.error("Exception : {}", e);
        throw new ServletException(e.getMessage());
    }
}

댓글