How Spring MVC Framework works


본 카테고리는 스프링 프레임워크를 다룬다.

좀 더 자세한 내용은 아래의 공식 사이트를 참고하자.

참고 스프링 프레임워크 공식 사이트


스프링 MVC 프레임워크의 동작 방식

이전 포스팅에서 사용한 설정 파일 코드를 다시 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Configuration
@EnableWebMvc // 스프링의 MVC 설정 활성화
public class MvcConfig implements WebMvcConfigurer {

// DispatcherServlet 매핑 경로를 위한 설정 추가
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

// 컨트롤러의 실행결과를 보여주기 위한 설정 추가
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
}

위의 설정을 하고 나서 남은 작업은 컨트롤러의 구현과 등록, 그리고 뷰 코드를 작성하는 것이다.

개발자는 스프링 MVC가 어떻게 컨트롤러를 실행하고 뷰를 찾는지 자세히 알지는 못해도 웹 애플리케이션을 개발할 수는 있다.

하지만 스프링 MVC를 구성하는 주요 요소가 무엇이고 각 구성 요소 들이 어떻게 연결되는 지 파악하면 다양한 환경에서 스프링 MVC를 빠르게 적용하는 데 도움이 될 것이다.

스프링 MVC의 핵심 구성 요소

스프링 MVC의 핵심 구성 요소와 그 요소들간의 관계는 위의 그림처럼 정리할 수 있다.

위의 그림에서 <<spring bean>> 이라고 표시한 것은 스프링 빈으로 등록해야하는 것을 의미하며, Controller JSP 영역은 개발자가 직접 구현해야하는 요소이다.

DispatcherServlet

각 요소들간의 모든 연결을 담당한다.

Web Browser로부터 요청이 들어오면 해당 요청을 처리하기 위한 컨트롤러 객체를 검색한다.

단, DispatcherServlet이 직접 검색하는 것이 아니라 HandlerMapping이라는 빈 객체에 컨트롤러 검색을 요청한다.

HandlerMapping 객체가 컨트롤러를 찾아주면 HandlerAdapter에게 해당 요청 처리를 위임한다.

해당 처리가 끝난 후 ModelAndView 객체를 반환 받으면 결과롤 보여줄 View를 찾기 위해 ViewResolver 빈 객체를 사용한다.

이후 ViewResolver가 반환한 View 객체에 응답 결과의 생성을 요청하고, View 객체는 JSP를 실행함으로써, Web Browser에 전송할 응답 결과를 생성한다.

HandlerMapping

클라이언트(여기서는 Web Browser)의 요청 경로를 이용해 이를 처리할 컨트롤러 빈 객체를 찾아 DispatcherServlet에 전달한다.

HandlerAdapter

DispatcherServlet이 위임한 요청을 처리한다.

ViewResolver

DispatcherServlet이 ModelAndView에 지정된 View를 찾기 위해 사용한다.

ViewResolver는 해당 View의 이름에 해당하는 View 객체를 매번 새롭게 생성하여 반환한다.

DispatcherServlet과 스프링 컨테이너

앞선 포스팅에서 설정한 web.xml 파일을 다시 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">

<servlet>
<servlet-name>dispatcher</servlet-name>
<!-- DispatcherServlet을 dispatcher라는 이름으로 등록 -->
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>

<!-- contextClass 초기화 파라미터 설정 -->
<!-- java 설정을 사용하는 경우 AnnotationConfigApplicationContext 사용 -->
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>

<!-- contextConfiguration 초기화 파라미터 설정 -->
<!-- 파라미터로 스프링 설정 클래스 목록을 지정한다 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
config.MvcConfig
config.ControllerConfig
</param-value>
</init-param>
<!-- 컨테이너가 웹 애플리케이션 초기화시 이 서블릿을 실행하도록 설정 -->
<load-on-startup>1</load-on-startup>
</servlet>

<!-- 이하 생략 -->
</web-app>

위의 web.xml파일에서 DispatcherServlet은 전달받은 설정 파일을 이용해 스프링 컨테이너를 생성한다.

DispatcherServlet은 이때 생성한 컨테이너에서 HandlerMapping, HandlerAdapter, ViewResolver, Controller 등의 빈 객체를 구해서 쓰게된다.

따라서 DispatcherServlet이 사용하는 설정 파일에 해당 빈 객체에 대한 정의가 포함되어 있어야 한다.