
- Servlet/JJP에서는 HttpServletRequest/HttpServletResponse라는 타입의 객체를 이용해 브라우저에서 전송한 정보를 처리하는 방식이다.
- 스프링 MVC의 경우 이 위에 하나의 계층을 더한 형태다.
- 스프링 MVC를 이용하게 되면 직접적으로 HttpServletRequest/HtppServletResponse 등과 같이 Servlet/JSP의 API를 사용할 필요성이 현저하게 줄어든다.
- 스프링은 중간에 연결 역할을 하므로 이러한 코드 작성 없이 원하는 기능 구현이 가능하다.
- 과거에는 스프링 MV의 특정한 클래스를 상속하거나 인터페이스를 구현하는 형태로 개발할 수 있었지만, 스프링 2/5버전부터 등장한 어노테이션 방식으로 인해 최근 개발에는 어노테이션이나 XML 등의 설정만으로 개발이 가능하게 되었다.
- 모델2 방식은 '로직과 화면을 분리'하는 스타일의 개발 방식이다.
- 모델 2방식은 MVC의 구조를 사용한다.
- 모델 2방식에서 사용자의 Request는 특별한 상황이 아니면 먼저 Controller를 호출한다.
- 이렇게 설계하는 이유는 나중에 View를 교체하더라도 사용자가 호출하는 URL 자체에 변화가 없게 만들어 주기 때문이다.
- 컨트롤러는 데이터를 처리하는 존재를 이용해 데이터(Module)를 처리하고 Response 할 때 필요한 데이터를 View 쪽으로 전달하게 된다.
- Servlet을 이용하는 경우 이를 직접 처리해 왔지만 스프링 MVC는 내부에서 이런 처리를 하고, 개발자들은 스프링 MVC의 API를 이용해 코드를 작성한다.
< 1 >
- 사용자의 Request는 Front-Controller인 DispatcherServlet을 통해 처리한다.
- 생성된 프로젝트의 web.xml을 보면 아래와 같이 모든 Request를 DispatcherServlet이 받도록 처리하고 있다.
<servlet> <servlet-name>appServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>< 2, 3 >
- HandlerMapping은 Request의 처리를 담당하는 컨트롤러를 찾기 위해 존재한다.
- HandlerMapping 인터페이스를 구현한 여러 객체들 중 RequestMappingHandlerMapping 같은 경우는 개발자가 @RequestMapping 어노테이션이 적용된 것을 기준으로 판단하게 된다.
- 적절한 컨트롤러가 찾아졌다면 HandlerMappingAdapter를 이용해 해당 컨트롤러를 동작시킨다.
< 4 >
- Controller는 개발자가 작성하는 클래스로 실제 Request를 처리하는 로직을 작성하게 된다.
- 이 때 View에 전달해야 하는 데이터는 주로 Model이라는 객체에 담아 전달한다.
- Controller는 다양한 타입의 결과를 반환하는데 이에 대한 처리는 ViewResolver를 이용하게 된다.
< 5 >
- ViewResolver는 Controller가 반환한 결과를 어떤 View를 통해 처리하는 것이 좋을지 해석하는 역할이다.
- 가장 흔하게 사용하는 설정은 servlet-context.xml에 정의된 InternalResourceViewResolver이다.
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="/WEB-INF/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean><6, 7>
- View는 실제로 응답 보내야 하는 데이터를 Jsp 등을 이용해 생성하는 역할을 하게 된다.
- 만들어진 응답은 DispatcherServlet을 통해 전송된다.
- 위의 그림을 보면 Request는 DispatcherServlet을 통하도록 설계되는데, 이런 방식을 Front-Controller 패턴이라 한다.
- Front-Controller 패턴을 이용하면 전체 흐름을 강제로 제한할 수 있다.
- Front-Controller 패턴을 이용하는 경우에는 모든 Request의 처리에 대한 분배가 정해진 방식대로만 동작하기 때문에 좀 더 엄격한 구조를 만들 수 있다.