Bigfat

[Spring] Overview of Spring MVC Architecture 본문

Java/web

[Spring] Overview of Spring MVC Architecture

kyou 2017. 4. 18. 10:20

스프링 MVC 구조에 대해 간략히 알아보자

  아래는 이전에 모델2 구조로 구현했던 게시판(BBS)을 스프링 MVC구조(Model-View-Controller Architecture)로 재구현한 프로젝트의 구조를 볼 수 있다.


  먼저 /WEB-INF/web.xml을 살펴보자. 기존의 프로젝트에서는 클라이언트의 요청(GET, POST)을 받았을 때 init()메서드로 properties파일을 읽고, **Impl클래스들의 인스턴스들을 생성한다. 그리고 요청을 처리할 인스턴스의 메서드를 실행시켜 return값(/*.jsp)을 얻어 RequestDispatcher클래스의 메서드를 통해 클라이언트에게 요청에 대한 화면을 출력해주게 된다(BBSServlet.java 참고).

  스프링에서는 기존 프로젝트에서 개발자가 작성한 servlet을 appServlet이라는 이름의 DispatcherServlet이 담당하게 된다. 그리고 이 servlet의 초기 파라미터(init-param)들은 servlet-context.xml에 작성한다. load-on-startup을 설정하여 서블릿이 로딩되는 시점을 정할 수 있는데, 0이거나 0보다 큰 정수일 때 오름차순으로 로딩된다(참고1).

  그리고 context-paramcontextConfigLocation라는 이름으로, 값(value)은 /WEB-INF/spring/root-context.xml로 정의되어 있다. 이 컨텍스트 파라미터는 컨텍스트, 즉 애플리케이션에서 공유되어 사용하는 자원을 root-context.xml에 작성하여 사용할 수 있다. 공유 자원으로는 예를 들면 기존 프로젝트의 pageSize, pageBlock이나 파일 업로드 디렉토리 등이 있다. JSP에서는 application 내장 객체로, Java에서는 request.getServletContext().getInitParameter()로 값을 얻을 수 있다. 참고로 JSP application 내장 객체의 타입은 ServeltContext이다.

  appServlet의 url-pattern은 기존 프로젝트와 동일하게 *.bbs로 변경하였다.

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
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>
    
    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
 
    <!-- Processes application requests -->
    <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>*.bbs</url-pattern>
    </servlet-mapping>
</web-app>
cs


  서버를 실행하면 콘솔에 서버 구동 정보들이 뜨는데, appServlet으로 찾아보니 아래와 같은 정보를 확인할 수 있었다. appServlet이 배치(deploy)될 때, 즉 컨텍스트가 인식될 때 서블릿이 로딩되는 것을 알 수 있다.

4월 17, 2017 8:36:32 오후 org.apache.catalina.core.ApplicationContext log
정보: Initializing Spring FrameworkServlet 'appServlet'
INFO : org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'appServlet': initialization started
INFO : org.springframework.web.context.support.XmlWebApplicationContext - Refreshing WebApplicationContext for namespace 'appServlet-servlet': startup date [Mon Apr 17 20:36:32 KST 2017]; parent: Root WebApplicationContext
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from ServletContext resource [/WEB-INF/spring/appServlet/servlet-context.xml]


  아래는 Spring MVC Architecture다. DispatcherServlet은 *.bbs(서블릿과 맵핑된 URL패턴)에 대한 요청을 받고, 작업(task)을 HandlerMapping, HandlerAdapter, ViewResolver순으로 보내서 클라이언트 요청(Request)에 대한 응답(Response)을 처리하게 된다.

Request Life cycle (출처 http://terasolunaorg.github.io)



[Spring Framework 4.3.7.RELEASE API 참고]

[Spring - MVC Framework 참고]

[[Spring MVC] 스프링 MVC 구성요소 참고]

[서블릿 load-on-startup 참고1]