Spring MVC

SpringMVC 분석

k9e4h 2016. 4. 28. 15:01

MVC Pattern


Model
Application 로직을 담당하는 부분으로 Database나 Legacy System과의 로직을 담당하는 부분을 말한다. Model은 View나 Controller 로 부터 독립되어있다.
View
사용자가 직접 사용하는 부분으로 Presentation 로직을 담당하는 부분이다. Controller와 Model에 의해 생성된 결과물을 보여주는 역할을 한다.
Controller
Business Logic을 담당하는 부분으로 사용자의 요청을 받아 요청에 해당하는 작업을 한 후 작업 결과에 따라 응답을 결정하는 역할을 한다. 
Model과 View사이에서 데이터를 전달하는 역할을 한다.

mvc model 1 

request 요청에 대한 처리, 비지니스 로직 핸들링 등 모든 것이 JSP(view 단)에서 처리됨

coupling이 발생

변경할 것이 생기거나 오류가 생기면 수정해야 하는 범위가 커지는 위험이있다 (유지보수가 어려워 진다)

mvc model 2

MVC구조를 웹에 적용하여 개발하는 방식
View : jsp, Controller : servlet, Model:application(java Bean)

SpringMVC

client, view, dispatcherServlet,HandlerMapping, controller, viewResolver 등 역할분리가 확실해짐






SpringMVC에서 각각의 역할


1. DispatcherServlet

- 어플리케이션으로 들어오는 모든 Request를 받음. 

- HandlerMapping에게 request를 전달

- 실제로 처리할 Controller 에게 전달하고 그 결과값을 받아서 View에게 전달하여 적절한 응답등 생성할 수 있도록 흐름을 제어한다.


2. HandlerMapping 

Request URL 각각을 어떤 Controller 가 실제로 처리할 것인지 찾아주는 역할을 한다.


3. Controller 

Request를 직접 처리한 후 그 결과를 다시 DispatcherServlet 에게 돌려준다.

bussiness logic 수행, M/V 연결


4. ModelAndView 

Controller가 처리한 결과와 그 결과를 보여줄 View에 관한 정보를 담고 있는 객체이다.

M/V를 연결할때 데이터를 전달하기 위해 사용


 

M/V 연결

Navigation 

Static ( 명사 모델링) 

data 

JSP file 

Dynamic ( 동사 모델링) 

setXXX() 

forword / sendRedirect 


static modeling + dynamic modeling = Object Modeling

static : url에 넣는 정보를 말하는 듯 user,product,purchase등으로 명사로 하라는 의미.


[2016.10.07 추가 내용] sendRedirect 더보기

5. ViewResolver 

View 관련 정보를 갖고 실제 View를 찾아주는 역할을 한다.

page Navigation


6. View 

Controller가 처리한 결과값을 보여줄 View를 생성한다.


SpringMVC 동작순서

Dispatcher Servlet -> Handler Mapping -> Controller -> View Resolver -> View


Dispatcher Servlet이 request를 받아 어떤 controller가 처리해야 하는지 Handler Mapping에게 물어본다.
Handler Mapping은 Dispatcher Servlet 에게서 받은 request를 어떤 controller 가 처리 해야하는지 판단하여 controller를 전달한다.
Dispatcher Servlet은 Handler Mapping에서 받은 controller에게 request를 전달한다.
controller는 받은 request를 처리하여 ModelAndView를 Dispathcer Servlet에게 준다.
Dispatcher Servlet은 View Resolver에게 view name을 통하여 어떤 view로 가야할지를 알아오고

그에 맞는 view를 생성하여 Model을 전달한다.





web.xml 분석

0.전체 소스 코드

1. wiring

15
16
17
18
19
<context:component-scan base-package="com.model2.mvc.web">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan> 
cs

어노테이션 기반 :: Spring Framework 사용.
@Controller annotation 선언된 Bean 만 Wiring
@Service / @Repository  annotation 선언된 Bean 은 Scan 제외 -->


2. anotion 기반 설정 변경

21
<mvc:annotation-driven />
cs

DefaultAnnotationhandlermapping 설정 등 기타 Annotation 기반 모든 기능 사용가능
이것 설정하면 interceptor를 직접 DefaultAnnotationhandlerMapping에 주입할 수 없음


3. ViewResolver 선언

23
24
<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver" />
cs


4. 자원 요청 처리

26
27
28
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/javascript/**" location="/javascript/" />

cs


 / 형식의 Mapping 은 모든(정적,동적 자원) 요청시 처리책임
정적자원 요청시 DispatcherServlet 에게 처리방법지정 -> 처리 경로 location 지정


5. Negotiation ViewResolver

50
51
52
53
54
55
56
57
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  <property name="defaultContentType" value="text/html"/>
    <property name="defaultViews">
      <list>
        <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
      </list>
    </property>
</bean>
cs


Client로 전달되는 Domain Object를 JSON Data로 변환하기 위한 설정
Client Response 받기 원하는 Content type을 선택, 협상하는 ViewResolver
Client가 원하는 contents type을 만족시키는 몇가지 view resolver에서 생성한 최적의 뷰를 선택
media type 정보를 활용하여 다른 resolver에게 view를 찾도록 위임
viewresolver를 결정해 주는 resolver 이다
우선순위 존재 xxx
spring 3.0이상에서 제공


6. exception이 발생했을때 보여줄 View

30
31
32
33
34
35
36
37
38
39
<bean id="exceptionResolver"
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
  <property name="exceptionMappings">
    <props>
      <prop key="java.lang.NullPointerException">/common/nullError.jsp</prop>
      <prop key="java.lang.NumberFormatException">/common/numberFormatError.jsp</prop>
    </props>
  </property>
  <property name="defaultErrorView" value="/common/error.jsp" />
</bean>
cs


Serlvet에서 선언적 예외처리 하듯이 exception이 발생하면 보여줄 page 지정
일반적인 경우에는 3번의 view resolver로 가지만 exception이 발생하면 SimpleMappingExceptionReslover에 따라 지정한 page로 이동
key에 해당하는 class 들어있음 그곳으로 이동

7. JSON Data 변환

40
41
42
43
44
45
46
47
48
19
50
51
<bean id="jsonConverter" 
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
  <property name="supportedMediaTypes" value="application/json" />
</bean>
<!-- /////// AnnotationMethodHandlerAdapter 에 jsonConverter  DI /////// -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  <property name="messageConverters">
    <list>
      <ref bean="jsonConverter" /> 
    </list>
  </property>  
</bean>
cs

Client에서 전달되는 JSON Data를 Domain Object로 변환함 (json과 controller가 리턴하는 object와의 호환)
Controller에서 Domain을 return 하고 이곳을 거치면 JSON으로 변환된다
Controller에 @ResponseBody라고 되있는 곳에서 json으로 return 됨

MarshallingHttpMessageConverter : xml과 호환
RssChannelHttpMessageConverter: RSS

전자정부표준프레임워크

egovframe.go.kr => spring framework를 확장가능 하게 만든 / maven 사용


[참고] http://www.slideshare.net/exnis/ksug-20121208



[참고] Filter, Interceptor 동작 순서 https://doublesprogramming.tistory.com/133

반응형

'Spring MVC' 카테고리의 다른 글

Spring Batch  (0) 2019.01.18
Spring Transaction 관련  (0) 2016.11.30
Spring Annotation 정리  (0) 2016.10.07
[#1] spring 개요  (0) 2016.05.03
[#2] Spring 기초  (3) 2016.03.22