본문 바로가기

plming/Java - Spring

Spring MVC 기본

1. 클라이언트의 요청(request)을 처리하는 과정
    Spring MVC가 하나의 요청(Request)에 대한 처리를 완료한 다음 응답(Response)을 완료할 때까지의 생명주기를 살펴보면 다음 그림과 같다.



모델 2 개발 방식의 최초 진입지점은 컨트롤러를 담당하고 있는 서블릿이였다.
① Spring MVC 또한 클라이언트의 요청이 처음으로 진입되는 지점은 DispatcherServlet이다.  DispatcherServlet은 Spring MVC에서 가장 핵심적인 기능을 구현하고 있는 클래스로서 하나의 요청을 처리하기 위하여 필요한 클래스들의 중계를 담당하는 역할을 한다.
② 클라이언트로부터 요청이 들어오면 DispatcherServlet은 빈 설정파일에 정의되어 있는 HandlerMapping을 이용하여 요청 URL에 해당하는 Controller 객체를 얻게 된다.  빈 설정파일에 정의되어 있는 Controller는 일반적으로 요청 URL을 기반으로 정의되어 있다.  따라서 HandlerMapping은 요청 URL에 Mapping되어 있는 Controller를 DispatcherServlet에 반환하게 된다.
③ DispatcherServlet은 HandlerMapping으로부터 Controller를 얻게되면 요청에 대한 모든 작업을 Controller에게 위임하게 된다.  Controller는 Spring MVC를 구현하기 위하여 개발자들이 직접 구현을 담당하게 되는 부분으로 클라이언트로부터 전달된 인자에 대한 유효성 검증작업, 비즈니스 계층과의 통신, 비즈니스 계층에서 발생한 에러에 대한 처리, 작업 완료후 이동하게 될 뷰화면등에 대한 모든 처리를 담당하게 된다.
④ Controller는 비즈니스 계층과의 통신을 완료한다음 비즈니스 계층에서 전달된 모델 데이터와 클라이언트에게 보여줄 뷰화면에 대한 정보를 ModelAndView 클래스에 담아서 DispatcherServlet에 반환하게 된다.
⑥ DispatcherServlet으로 전달된 ModelAndView 클래스의 View정보는 View 객체(View Object) 또는 논리적인 View 이름(String)을 가지게 된다.  ModelAndView 클래스에 저장되어 있는 View정보가 View 객체를 통하여 Controller에서 반환되었다면 DispatcherServlet은 View 객체를 이용하여 클라이언트에 화면을 출력하게 된다.
⑤ 그러나 ModelAndView에 저장되어 있는 View 정보가 논리적인 View 이름일 경우에는 빈 설정파일에 정의되어 있는 ViewResolver 클래스를 이용하여 클라이언트에게 출력할 View 객체를 얻게 된다.


위 그림을 보면 하나의 요청을 처리하기 위하여 관여하고 있는 클래스가 상당히 많다는 것을 알 수 있다.  그러나 그림에서의 요청을 처리하기 위하여 모든 클래스를 개발자들이 직접 구현할 필요는 없다.  하나의 요청이 추가될 때마다 개발자들이 구현할 필요가 있는 클래스는 Controller 클래스 하나뿐이다.  나머지 클래스는 Spring MVC에서 제공하는 클래스를 이용하여 구현하는 것이 가능하다.  물론 모델 데이터를 출력할 뷰화면(JSP 또는 Velocity등) 또한 개발자들이 직접 구현해야 하는 것은 두말할 필요 없다.

Spring MVC가 하나의 요청을 처리하기 위하여 실행되는 단계를 살펴보면 Spring MVC가 그리 복잡하지 않은 것처럼 생각될 수 있다.  물론 그림의 각 단계를 제대로 이해할 경우 Spring MVC를 이해하는데 많은 도움이 되는 것은 사실이다.  그러나 Spring MVC의 복잡도는 유연성을 제공하기 위하여 지원하는 무수히 많은 옵션들 때문이다.  Spring MVC는 웹 애플리케이션의 유연성을 지원한다는 명목하에 다양한 종류의 HandlerMapping, Controller, ViewResolver, View 클래스들을 지원하고 있다.


2. 웹 애플리케이션 설정
   웹 애플리케이션을 개발할 때 Spring MVC를 이용하기 위해서는 DispatcherServlet을 web.xml에 다음과 같이 설정해야 한다.

 web.xml - DispatcherServlet 설정 부분

 <web-app>
     <servlet>
         <servlet-name>action</servlet-name>
         <servlet-class>
             org.springframework.web.servlet.DispatcherServlet</servlet-class>
         <load-on-startup>1</load-on-startup>
     </servlet>

     <servlet-mapping>
         <servlet-name>action</servlet-name>
         <url-pattern>*.do</url-pattern>
     </servlet-mapping>
 </web-app>


DispatcherServlet이 모든 요청에 대한 최초 진입지점이 되도록 하기 위해서는 클라이언트의 모든 요청 URL 확장자를 ".do"로 사용해야 한다.
애플리케이션이 시작할 때 DispatcherServlet의 init() 메써드가 호출되면서 빈 설정파일의 초기화가 진행된다("<load-on-startup>1</load-on-startup>").
DispatcherServlet이 초기화할 때 디폴트로 사용하는 빈 설정 파일의 이름은 "서블릿 이름-servlet.xml"이 된다. 서블릿 이름으로 "action"을 사용하는경우 "action-servlet.xml"이 Spring MVC에서 사용할 디폴트 빈 설정파일이 된다.

DispatcherServlet이 초기화할 때 사용할 빈 설정파일과 ApplicationContext 클래스에 대한 정보는 web.xml에서 <init-param> 태그를 이용하여 변경하는 것이 가능하다.  DispatcherServlet을 설정하는 방법에 관한 더 자세한 내용은 http://www.springframework.org/docs/reference/mvc.html#mvc-servlet 문서를 참고하기 바란다.


[출처] http://www.javajigi.net/pages/viewpage.action?pageId=28377092
[출처] Spring 프레임워크 워크북