본문 바로가기

WEB

[Spring] MVC의 기본구조 #2

Spring MVC의 기본 구조를 알아보자.

 

 

웹 어플리케이션을 제작해 본적이 있다면 Servlet/JSP 기술을 활용해서 제작하는 방식을 먼저 배운다.

이러한 부분을 개발자들에게 보여주지 않고 개발자들이 필요한 부분만을 집중해서 개발할 수 잇는 구조로 만든 것스프링 MVC이다.

 

 

[브라우저에서 전송한 정보를 처리하는 방식]


  • Servlet/JSP : HttpServletRequest/HttpServletResponse
  • MVC : Servlet/JSP 위에 하나의 계층을 더함

 

 

 

 

 

스프링 MVC를 사용하게 되면 개발자들은 직접적으로 HttpServletRequest/HttpServletResponse 등 과 같이 Servlet/JSP의 API를 사용할 필요성이 줄어든다. 스프링은 중간에 연결 역할을 하기 때문에 이러한 코드를 작성하지 않고도 원하는 기능을 구현할 수 있게 된다.

 

개발자의 코드는 스프링 MVC에서 동작하기 때문에 과거에는 스프링 MVC의 특정한 클래스를 상속하거나 인터페이스를 구현하는 형태로 개발할 수 있었지만, 스프링 2.5버전부터 등장한 어노테이션 방식으로 인해 최근 개발에는 어노테이션이나 XML 등의 설정만으로도 개발이 가능하다.

 

 

위 그림에서 보여주듯이 스프링 MVC역시 내부적으로는 Servlet API를 사용한다. 스프링 MVC는 '모델 2'(로직과 화면을 분리하는 개발방식)을 사용한다. 

 

 

 

 

[스프링의 모델2방식 구조]


 

 

 

 

 

1. 사용자의 Request는 Front-Controller인 DispatcherServlet을 통해서 처리한다. 생성된 프로젝트의 web.xml을 보면 아래와 같은 모든 Reequest를 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 어노테이션이 적용된 것을 기준으로 판단한다. 적절한 컨트롤러가 찾아졌다면 HandlerAdapter을 이용해서 해당 컨트롤러를 동작시킨다.

 

 

4. Controller는 개발자가 작성하는 클래스로 실제 Request를 처리하는 로직을 작성하게된다. 이때 View에 전달해야하는 데이터는 주로 Model이라는 객체에 담아서 전달한다. Controller는 다양한 타입을 반환하는데 이에 대한 처리는 ViewResolver를 이용한다.

 

 

5. ViewResolver는 Controller가 반환한 결과를 어떤 View를 통해서 처리하면 좋을지 해석한다. 가장 흔하게 사용하는 설정은 servlet-context.xml에 정의된 InternalResourceViewResolver이다.

 

ex) servlet-context.xml

<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는 DispatchServlet을 통하도록 설계되는데, 이런 방식을 Front-Controller 패턴이라고 한다. 이 패턴을 사용하면 모든 Request의 처리에 대한 분배가 정해진 방식대로만 동작하기 때문에 좀 더 엄격한 구조를 만들어 낼 수 있다.

 

 

출처 - 코드로 배우는 스프링 웹 프로젝트