Spring MVC 프레임워크
어제 토비의스프링 vol2 3장 스프링 MVC에 대하여 공부를 하였다. 공부를 수행한 시각은 약 2뽀모도리(1시간 가량)이다. 50분가량 공부하면서 느낀점은 내가 스프링에 대해 빙산의 일각정도의 지식만 갖고 프로젝트를 임해왔었다는 것이다.
토비의 스프링을 보기전에 본 책은 토비의 스프링 1/6분량의 얇은 책이었는데 지금와서 생각해보면 필요한 내용은 모두 담겨있었으나 토비의 스프링처럼 통찰을 갖다주는 책이 아닌 레퍼런스의 번역서 정도로 생각할 수 있을것 같다.
오늘 2뽀모도리동안 공부한 양에 내가 기본적으로 알고있던 내용보다 더 많은 통찰을 얻게되었고 아직 공부할 것이 많이 남아 있다는 점에서 얼마나 모르고 있었는지 반성하게 된다.
스프링의 MVC 패턴은 아래의 그림과 같이 동작한다.
스프링 웹 MVC가 수행되는 과정
-
외부로부터 DispatcherServlet으로 Http요청이 온다.
-
HandlerMapping클래스가 http요청을 해석하여 요청에 따라 어떠한 Controller가 작업을 수행할 지 결정한다.
- Servlet과 Controller사이에 Handler Interceptor체인이 있는데 Tomcat Filter와 비슷한 역할을 하지만 Controller로 부터 반환되는 Model, View등에 추가작업을 하는등 더욱 세밀한 필터링이 가능
-
Controller가 서비스, 데이터액세스 객체에게 작업을 위임하여 비즈니스 로직을 처리한 후 Model 과 View 정보를 반환한다.
-
ViewResolver가 Controller로 부터 반환된 Model과 View 정보를 바탕으로 View 객체를 생성한다.
-
일반적으로 자바 웹 프로젝트에서 jsp를 뷰로 사용하지만 스프링에서는 JstlView객체가 jsp를 템플릿으로 하여 HTML을 생성하여 반환한다. 그렇기 때문에 모델등의 데이터가 jsp에 ${} 치환식으로 표현이 가능한 것으로 보임.
자, 그럼 이 스프링 웹 MVC에서 빈은 어디서 어떤 빈들을 생성되는 것일까 하는 궁금증이 생겨서 소스코드를 살펴보니까 DispatcherServlet에서 다음과 같이 servlet-context.xml 설정 파일을 참고해서 빈을 생성한다.
[web.xml]
````````````````` 중략 `````````````````
<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>
````````````````` 중략 `````````````````
[/WEB-INF/spring/appServlet/servlet-context.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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>
<context:component-scan base-package="com.copocalypse.www" />
</beans:beans>
그리고 책에서는 웹과 관련된 빈을 서비스와 관련된 빈 설정을 분리하라고 하는데 이는 listener를 이용해서 빈을 생성하고 있다.
(참고로, ContextLoaderListener는 ServletContextListner인터페이스를 상속받아서 WAS가 최초 로드 될 때 필요한 초기 작업이나 WAS가 종료될 때 특정 작업을 수행할 수 있다.)
[web.xml]
``````````````` 중략 ```````````````
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/*-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>
``````````````` 중략 ```````````````
[root.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myBean" class="com.copocalypse.www.util.MyBean"/>
</beans>
공부하면서 내가 가진 지식을 체계화 할 수 있었는데 지식 체계화 과정을 거치면서 새롭게 얻은 지식은 다음과 같다.
-
HandlerMapping에서 Handler란 곧, Controller를 말함
-
jsp파일은 뷰가아니라 JstlView의 템플릿으로 사용됨.