날아라쩡글이의 블로그입니다.

spring MVC가 jsp에서 실행되는 순서와 객체들 본문

중앙 HTA (2106기) story/spring java framwork story

spring MVC가 jsp에서 실행되는 순서와 객체들

날아라쩡글이 2022. 1. 5. 13:58
728x90
반응형

springMVC 실행순서 

  1. 클라이언트가 웹서버로 요청을 보낸다.
  2. 웹서버가 요청객체와 응답객체를 생성한다. 
  3. 웹서버가 DispatcherServlet의 Service(Request req, Response res :앞으로는 변수명으로 작성예정) 메소드를 실행한다. 
  4. Handler Mapping에게 요청 URL을 보낸다, 
  5. Handler Mapping은 요청 URL을 분석해서 요청URL과 mapping된 요청 핸들러 메소드를 실행할 HandlerAdapter객체를 반환한다.
  6. DispatcherServlet은 HandlerAdapter의 Handler(req, res)메소드를 실행한다. 
  7. HandlerAdapter는 Interceptor를 실행해서 요청핸들러메소드 실행전처리를 수행한다. 
  8. HandlerAdapter는 ArgumentResolver를 실행해서 요청핸들러 메소드의 멤버변수를 분석하고, 적절한 값 혹은 객체를 생성한다. 
  9. HandlerAdapter는 요청 핸들러 메소드를 실행한다. 8번에서 생성한 값 혹은 객체를 요청핸들러메소드의 매개변수로 전달한다. 
  10. 사용자가 정의한 요청핸들러메소드에서 클라이언트의 요청을 처리한다. 
  11. 뷰페이지에 전달한 데이터는 model객체에 저장한다. 
  12. 뷰페이지의 이름을 반환한다. 
  13. HandlerAdapter는 modelAndView객체를 생성해서, modelAndView에 11번의 model객체를 저장하고, 12번에서 반환할 뷰이름을 저장한다. 
  14. HandlerAdapter는 modelAndview객체를 DispatcherServlet에게 반환한다. 
  15. DispatcherServlet은 ciewResolver에게 뷰이름을 전달한다. 
  16. viewResolver는 뷰이름을 분석해서 JSTLView나 RedirectView를 반환한다. 
  17. DispatcherServlet은 JSTLView 혹은 RedirectView의 Render(model, req, res)를 실행한다. 
  18. JSTLView는 model의 값을 요청객체에 속성에 저장하고, 지정된 JSP로 내부이동해서 JSP를 실행한다. 
  19. jsp에서 EL, JSTL을 사용해서 요청객체의 속성에 저장된 값으로 동적 HTML컨텐츠를 생성하고, 응답으로 HTML을 보낸다. 
  20. RedirectView는 재요청 URl을 응답으로 보낸다. 
  21. 웹서버가 요청객체와 응답객체를 폐기시킨다. 

SpringMVC를 활용한 JSP기반의 웹 구성요소 

  • DispatcherServlet
    • web.xml에서 설정한다. 
    • <servlet>
      // DispatcherServlet을 "bookstore"라는 이름으로 Tomcat 웹서버에 배포한다. 
      <servlet-name>bookstore</servlet-name>
      //식별자로 보통 web project의 이름을 붙인다. mall, BookStore동일한 이름만 아니면 된다.
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
      //init-param으로 설정된 메소드는 서블릿에서 조회할 수 있다.
      <param-name>contextConfigLocation</param-name>
      //contextConfigLocation라는 이름으로 파라미터값을 조회하면 스프링빈설정파일의 경로를 알수 있다. 
      //경로를 지정하면, DispatcherServlet이 스프링컨테이너를 생성하고, 빈설정파일을 읽어서 객체를 생성/조립/보관한다. 
      <param-value>/WEB-INF/spring/context-web.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
      //Tomcat웹서버가 시작되면 DispatcherServlet객체를 생성하고, 초기화작업을 수행해서 요청을 처리하는 상태가 되게 한다. 
      </servlet>
      <servlet-mapping>
      <servlet-name>bookstore</servlet-name>
      //식별자로 보통 web project의 이름을 붙인다. mall, BookStore동일한 이름만 아니면 된다.
      <url-pattern>*.do</url-pattern>
      //Tomcat웹서버에 *.do패턴의 클라이언트 요청이 오면 위의 bookstore라는 이름으로 배포된 서블릿이 그요청을 처리한다. 
      </servlet-mapping>
    • load-on-startup
      • 클라이언트의 요청이 한번도 안오면 클래스상태지만 이 설정을 해놓는다면 컨테이너를 우선적으로 만들어서 바로바로 사용할 수 있게 한다. 
      • 숫자는 우선순위를 나타내며, 숫자가 낮을수록 우선순위가 높다. 
      • 여러개의 서블릿을 등록할 수 있으며, 해당 숫자가 몇이냐에 따라서 순서를 정하여 만들어진다. 
      • 지우고 서버를 들어가면 만들어지지않으며, 검색을 해야 그때서야 요청객체를 만든다. 
    • 클라이언트의 모든 요청을 처리한다.
    • 혹은 특정URL패턴을 지정하면 해당 URL패턴의 모든 요청을 처리한다. 
    • *.do, *.hta, *.doum, /cafe/*, /mail/.*,/news/.* URL패턴을 지정할 수 있다. 
  • HandlerMapping(interface)
    • 컨트롤러에 @RequestMapping, @GetMapping, @PostMapping, @PutMapping, @DeleteMapping어노테이션 정보를 분석해서 요청 URI와 요청핸들러메소드의 mapping정보를 알아낸다. 
    • DispatcherServlet로부터 요청URL를 전달받아서 해당 요청 URL과 매핑된 핸들러 메소드를 실행할 HandlerExcutionChain을 반환한다. 
    • RequestMappingHandlerMapping (거의사용), BeanNameUrlHandlerMapping, RouterfunvtionHandlerMapping이 기본 구현객체이다. 
    • HandlerExcutionChain은 Handler객체, Interceptor개개체등의 객체를 포함하고 있고, 해당 객체들의 실행순서에 맞게 실행하는 객체다. 반복처리를 해준다. 
  • HandlerAdapter(interface)
    • 클라이언트의 요청을 처리하는 요청핸들러 메소드를 실행하는 객체이다.
    • 요청핸들러메소드의 매개변수를 분석해서 필요한 객체를 제공한다. 
    • 요청핸들러 메소드의 매개변수를 분석해서 요청파라미터값, 폼입력값, 요청메세지를 매개변수에 제공한다. 
    • 요청핸들러메소드가 반환하는 값을 분석하서 modelAndView객체에 저장하고, modelAndView를 DispatcherServlet에게 반환한다. 
    • modelAndView객체
      • modelAndView객체는 데이터, 뷰이름, 뷰객체를 저장하는 객체다. 
      • 요청핸들러메소드안에서 model의 객체에 저장한 데이터가 modelAndView객체의 데이터에 저장된다. 
      • 요청핸들러메소드가 반환한 JSP페이지 경로 혹은 리다이렉션경로가 modelAndView객체의 뷰이름으로 저장된다.
    • SimpleControllerHandlerAdapter, RequstMappingHandlerAdapter, HandlerfunctionAdapter가 기본구현객체이다. 
  • DispatcherServlet 2번째 등장
    • 요청 URL을 HandlerMapping에게 전달해서 클라이언트의 요청을 처리할 HandlerAdapter객체를 반환받는다. 
    • HandlerAdapter객체를 실행해서 사용자의 요청을 처리할 요청핸들러 메소드를 실행시키고, HandlerAdapter로부터 modelAndView객체를 반환받는다. 
    • HandlerAdapter객체가 반환한 modelAndView객체에는 model(데이터) 와 String(뷰페이지의 이름: jsp경로 또는 Redirect의 경로)가 포함되어 있다. 
    • ViewClass인 render메소드를 실행하고, view객체가 존재하지 않으면 viewResolver를 사용한다.
  • ViewResolver(interface)
    • HandlerAdapter가 반환한 modelAndView객체에 view객체가 없을 때 DispatcherServlet에게 뷰이름을 전달받아서 적절한 view의 객체를 반환한다. 
    • InterResourceViewResolver가 기본viewResolver객체이다. 
    • InterResourceViewResolver는 InternalResourceView, JSTLView, RedirectView중에 하나를 반환하는 뷰리졸브이다. 
    • InternalResourceView와 JstlView는 Jsp페이지로 내부이동시키는 view구현객체로 forward시키는 코드가 구현되어 있다. 
    • RedirectView는 클라이언트에게 재요청 URL을 응답으로 보내는 View구현객체이다. 
    • InterReSourceViewResoulver는 뷰이름이 "redirect :"으로 시작하면 Redicrectview객체를 반환한다. 그렇지 않으면 JstlView를 반환한다. 
  • View(interface)
    • 클라이언트에게 응답컨텐츠를 제공하는 객체이다. 
    • void render(map<String, ?> model, HttpServletRequest, HttpServletResponse)메소드를 재정의해서 model로 전달받은 데이터를 다양한 컨텐츠타입의 응답을 생성해서 클라이언트에게 보낸다. 
    • view, abstractview, abstractXlsview,abstractJackSon2View등의 인터페이스나 추상클래스를 구현/상속해서 다양한 사용자 정의 view객체를 정의할 수 있다. 
  • DispatcherServlet 3번째 등장
    • modelAndView객체에 View객체가 포함되어 있지 않으면 ViewResolver에게 뷰이름을 전달해서 적절한 view객체를 제공받는다. 
    • DispatcherServlet은 view객체의 render(model,req,res)을 실행해서 클라이언트에게 응답컨텐츠를 전달한다. 
반응형
Comments