Spring 요청 및 응답 흐름

1. Spring MVC

  • 스프링 프레임워크를 이용해 MVC디자인 패턴으로 만들어진 어플리케이션을 말한다.

  • MVC 디자인 패턴이란 화면을 담당하는 View와 서비스(업무로직, 데이터)에 해당하는 Model을 Controller라는 중계자를 통해 필요한 기능을 제공해주는 소프트웨어 설계 아키텍쳐를 의미한다. 스프링 프레임워크는 기본적인 MVC아키텍쳐가 적용된 템플릿을 제공한다.

2. Spring MVC 요청 처리 과정

  • 1-1) 클라이언트가 브라우저의 URL창을 통해 HTTP방식으로 Request(요청)을 하면 해당 요청내용은 WEB SERVER를 거쳐 WAS SERVER를 통해 Dispatcher Servlet으로 전송된다 * 참고) 수업때 사용한 apache tomcat은 WEB-WAS가 하나로 통합된 서버로 설명의 예시와 정확히 일치하지는 않으나 일반적인 서버는 WEB-WAS가 분리 되어 있으므로 일반적인 서버기준으로 이해하면된다. WEB-WAS?

  • 1-2) DispatcherServlet을 거치기 전에 등록된 Filter가 있다면 Filter를 통해 요청 내용에 대한 인코딩처리, 보안처리, 로깅처리등이 먼저 수행된 후 DispatcherServlet으로 요청내용이 전달된다.

  • 2) DispatcherSevlet은 요청 uri정보를 분석하여 요청내용을 처리할수 있는 컨트롤러를 HandlerMapping에게 찾도록 요청한다. 응답받은 컨트롤러가 있다면 3번과정으로 , 응답받은 컨트롤러가 없다면 404에러를 클라이언트에게 반환한다.(이미지상에는 생략되어 있지만, controller의 메서드 실행전 HandlerAdapter를 통해 메서드를 "어떻게" 실행할지 결정한다)

    • HandlerAdapter

    • 메서드의 파라미터를 검사하여 파라미터를 바인딩 할 수 있는 적절한 ArgumentResolver를 찾는다.

    • ArgumentResolver는 HTTP데이터의 값을 추출하여 적절하게 매개변수에 값을 바인딩한다.

  • 3) DispatcherServlet은 HandlerMapping에게 응답받은 컨트롤러를 찾아가 요청 url에 대한 업무를 처리하도록 지시한다.

  • 4) 요청 url에 맞는 업무로직을 실행한후 결과값을 controller에게 반환한다

  • 5) 컨트롤러는 DispatcherServlet에게 결과값을 반환하며 , 응답내용을 처리할수 있는 View의 경로를 반환한다 ex) 응답페이지가 /WEB-INF/views/board/list.jsp일경우 "board/list"가 처리할수 있다고 알려줌.

  • 6) DispatcherServlet은 응답받은 View의 이름을 ViewResolver에게 넘기고 응답내용을 처리할 jsp페이지를 찾으라고 지시함.

  • 7) ViewResolver는 알맞은 응답jsp를 선택한 후 선택된ㄷ jsp는 응답화면을 그려 클라이언트에게 반환한다.

3. Spring MVC 구성요소

DispatcherServlet

  • 스프링 프레임워크는 1개의 Servlet으로 구성되어 있는데 해당 서블릿의 클래스명이 DispatcherServlet이다.

  • DispatcherServlet은 클라이언트의 요청을 받은 후 HandlerMapping, Controller, ViewResolver등에 요청내용을 위임하여 적절한 응답을 생성한다.

  • servlet-context.xml의 설정정보를 통해 DispatcherServlet의 기능을 정의할 수 있다.

HandlerMapping

  • 클라이언트의 요청 url을 담당할 컨트롤러에 대한 정보, 핸들러 메서드에 대한정보를 기록하고 있는 객체

  • @requestMapping("/member")를 컨트롤러 상단에 기술하면 클라이언트가 /contextPath/member로 요청을 보냈을때 해당 컨트롤러가 요청내용을 응답할 수 있는 컨트롤러로써 선택된다.

  • DispatcherServlet객체가 초기화(init)될 때 Mapping-url에 대한 정보들도 함께 수집하여 HandlerMapping에 key:value형태로 기록해 둔다.

Controller

  • 클라이언트의 요청(업무로직)을 처리한 뒤 응답 view에 대한 정보를 DispatcherServlet에게 전달하는 객체.

  • MVC 패턴에서 Model과 View를 이어주는 Controller의 역할을 수행한다.

Model

  • 클라이언트의 응답화면을 꾸며줄 데이터를 보관하는 객체

  • DispatcherServlet에게 응답화면에 대한 정보를 반환할때 함께 전달하는 객체이다

  • Model안에 저장된 데이터는 기본적으로 request Scope를 가지고 있다.

ModelAndView

  • Model객체와 응답화면에 대한 정보를 동시에 가지고 있는 객체

  • DispatcherServlet에는 viewName 혹은 ModelAndView형태로 데이터를 반환하면 알맞은 이중 view에대한 정보만 추출하며 알맞은 응답화면을 선택할때 사용된다

ViewResolver

  • 컨트롤러의 처리결과를 생성할 view를 결정하는 객체

  • 컨트롤러가 문자열형태의 viewName만 지정시 "/WEB-INF/views"+viewName+".jsp"를 viewName에 추가하여 알맞은 jsp로 포워딩시키고, ModelAndView객체로 값을 반환하면 객체 내부에 저장한 viewName값만 추출하며 마찬가지로 "/WEB-INF/views"+viewName+".jsp"를 붙인후 jsp로 포워딩시킨다.

  • 스프링 프레임워크의 내장 ViewResolver는 InternalResourceViewResolver 클래스로 위에 기술한 기능을 수행하며 그밖에 다양한 VIewResolver가 존재한다.

View

  • 컨트롤러의 처리 결과화면에 해당하는 JSP파일 혹은 템플릿파일등을 일괄적으로 View라고 지칭한다.

  • 클라이언트의 응답화면을 랜더링하는 역할을 담당한다.

스프링 컨테이너 전체 동작 정리

  • 1) 아파치 톰캣 서버실행시 WAS서버에 의해 web.xml의 문서가 읽혀진다

  • 2) web.xml에 등록된 ContextLoaderListener가 생성된다.

  • 3) 생성된 ContextLoaderListener는 root-context.xml을 로딩한다

  • 4) root-context.xml에 정의한 bean객체가 Context에 등록된다(ApplicationContext)

  • 5) DispatcherServlet이 생성된다.(설정에 따라 사용자의 요청이 들어오는 경우 생성도 가능)

  • 6) DispatcherServlet은 servlet-conext.xml의 정보를 읽어 들여서 IOC Contaeinr에 빈객체를 등록한다.

  • 7) DispatcherServlet은 요청 url과 그를 처리할수 있는 컨트롤러에 대한 정보를 HandlerMapping에 기록하며, 응답화면을 처리할수있는 viewResolver를 또한 IOC Container에 Bean객체로 등록한다.

  • 8) HandlerMapping으로 클라이언트의 요청 url을 분석하여 알맞은 Controller를 생성하고 업무로직을 완료한 후, viewResolver를 통해 알맞은 응답View를 생성하여 클라이언트에게 반환한다.

Last updated