Spring MVC란 무엇인가? - 구조 및 설정

1. Spring MVC의 기본 구조

앞에서 살펴 봤듯 스프링은 MVC와 Front Controller 디자인 패턴을 따른다.
본격적으로 Spring MVC 구조에 대해 알아보고자 한다.
Spring의 MVC 구조

기본적인 구조는 번호 순서대로 읽어보면 파악할 수 있다.

클라이언트(브라우저)가 URL을 요청하면 DispatcherServlet이 가장 먼저 해당 요청을 낚아챈다.

DispatcherServlet은 HandlerMapping에게 URL에 적합한 컨트롤러를 요청하며 이를 찾았다면 다시 HandlerAdapter에게 메소드를 요청한다.

결과적으로 적합한 Controller의 메소드는 처리 결과와 View 이름을 DispatcherServlet에 반환한다.

다시 DispatcherServlet은 ViewResolver에게 적합한 View를 찾도록 요청하며 최종적으로 View와 처리결과(Model and View)를 클라이언트에게 반환한다.

2. Dispatcher Servlet

  • 중앙에 위치하여 모든 연결을 중계 및 담당한다.
  • 중앙에 위치한 배치관리자로써 클라이언트로부터 URL 요청을 가장 먼저 받는다.
  • HandlerMapping에게 클라이언트가 요청한 URL과 맞는 컨트롤러를 검색 요청한다.
  • ViewResolver로부터 리턴 받은 View와 처리 결과를 클라이언트에게 돌려준다.

Dispatcher Servlet 설정 방법

DispatchServer을 설정하는 방법은 web.xml 해당 내용을 추가합니다.
url-pattern 설정을 통해 다음과 같은 요청이 들어올 경우 동작하도록 합니다.
contextConfigLocation을 통해 서블릿 설정 파일 목록을 초기화 해줍니다.
만약 설정하지 않을 경우 [servlet-name-servlet.xml]을 읽습니다.
서블릿 설정 파일에는 HandlerMapping, ViewResolver 등에 대한 빈을 설정합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<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>

3. HandlerMapping

  • 클라이언트의 요청에 따라 적합한 Controller를 결정한다.
  • order 속성을 통해 다수의 HandlerMapping와 적용 순서를 설정할 수 있다.
  • 별도의 HandlerMapping을 설정하지 않으면 DefaultAnnotationHandlerMapping이 설정된다.

HandlerMapping의 종류

1. DefaultAnnotationHandlerMapping

  • 흔히 사용하는 어노테이션을 이용한 HandlerMapping
  • @RequestMapping 어노테이션을 통해 매핑 Key를 설정한다.

2. SimpleUrlHandlerMapping

  • 매핑 Key와 Bean Name을 직접 매핑한다.
  • Bean을 등록한 후 mappings에 별도로 설정한다.
1
2
3
4
5
6
7
8
9
<bean id="handler"  class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.do">hello</prop>
</props>
</property>
</bean>

<bean id="hello" class="com.devjh.mvc.HelloController" />

3. BeanNameUrlHandlerMapping

  • 매핑 Key와 Bean을 함께 지정한다.
1
2
3
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

<bean name="/hello.do" class="com.devjh.mvc.HelloController"/>

ViewResolver

  • View 객체를 생성하고 결과 화면으로 보여주도록 반환한다.
  • ViewResolver를 통해 Controller 내에서 View 객체를 생성하지 않고 이름만을 리턴한다. 이를 통해 Controller와 View의 역할이 분리될 수 있다.

Spring의 대표적인 ViewResolver



대표적인 ViewResolver인 InternalResourceViewResolver의 설정 방법


InternalResourceViewResolver 설정

위와 같이 prefixsuffix를 설정하면 ‘/WEB-INF/views/[view 이름].jsp’의 뷰 객체를 반환한다.

Share