spring

day3 class05 Spring MVC 구조

일상다반ㅅㅏ 2019. 1. 27. 22:17

1. 스프링 MVC의 수행 흐름

1) 클라이언트로부터의 모든 ".do" 요청을 DispatcherServlet이 받는다.

2) DispatcherServlet은 HandlerMapping을 통해 요청을 처리할 Controller를 검색한다.

3) DispathcerServlet은 검색된 Controller를 실행하여 클라이언트의 요청을 리턴한다.

4) Controller는 비즈니스 로직의 수행 결과로 얻어낸 Model 정보와 Model을 보여줄 View 정보를 ModelAndView 객체에 저장하여 리턴한다.

5) DispatcherServlet은 ModelAndView로부터 View 정보를 추출하고, ViewResolver를 이용하여 응답으로 사용할 View를 얻어낸다.

6) DispatcherServlet은 ViewResolver를 통해 찾아낸 View를 실행하여 응답을 전송한다.



2. DispatcherServlet 등록

- 스프링 프레임워크에서 제공하는 서블릿 컨테이너로 변경한다.

1
2
3
4
5
6
<!-- web.xml -->
 
<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
cs


2-1. 스프링 컨테이너 구동

- 클라이언트의 요청으로 DispatcherServlet 객체가 생성되고 나면 DispatcherServlet 클래스에 재정의된 init() 메소드가 자동으로 실행되어 XmlWebApplicationContext라는 스프링 컨테이너가 구동된다. 

- Spring MVC의 구성 요소 중에서 DispatcherServlet 클래스가 유일한 서블릿이다. 따라서 스블릿 컨테이너는 web.xml에 등록된 DispatcherServlet만 생성해준다. 하지만 DispatcherServlet 객체 혼자서는 클라이언트의 요청을 처리할 수 없고, 반드시 HandlerMapping, Controller, ViewResolver 객체들과 상호작용해야한다. 이 객제들을 메모리에 생성하기 위해서 DispatcherServlet은 스프링 컨테이너를 구동한다.


2-2. 스프링 컨테이너(XmlWebApplicationContext)의 구동과정

1) 서블릿 컨테이너가 DispatcherServlet 객체를 생성하고 나면 재정의된 init() 메소드가 자동으로 실행된다.

2) init() 메소드는 스프링 설정 파일(action-servlet.xml)을 로딩하여 XmlWebApplictionContext를 생성한다. 즉, 스프링 컨테이너가 구동된다.

* 결국 스프링 설정 파일(action-servlet.xml)에 DispatcherServlet이 사용할 HandlerMapping, Controller, ViewResolver 클래스를 <bean> 등록하면 스프링 컨테이너가 해당 객체들을 생성해준다.



3. 스프링 설정 파일 등록

- web.xml파일에 등록된 서블릿 이름 뒤에 '-servlet.xml'을 붙여서 스프링 설정파일을 찾는다.

- WEB-INF 폴더 우클릭 > new > other > Spring Bean configuration file > file name : action-servlet.xml

- WEB-INF 폴더 아래에 config 폴더 생성 > action-servlet.xml 파일 옮기고 presentation-layer.xml로 이름 변경

1
2
3
4
5
6
7
8
9
<!-- web.xml -->
<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>/WEB-INF/config/presentation-layer.xml</param-value>
  </init-param>
</servlet>
cs



4. 인코딩 설정

- 앞에선 POST 방식에 인코딩을 설정해서 사용하고 있었지만 CharacterEncodingFilter 클래서를 이용하여 인코딩을 처리한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- web.xml -->
<filter>
    <filter-name>characterEncoding</filter-name>
      <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
          <param-name>encoding</param-name>
          <param-value>EUC-KR</param-value>
      </init-param>
</filter>
  
<filter-mapping>
      <filter-name>characterEncoding</filter-name>
      <url-pattern>*.do</url-pattern>
</filter-mapping>
 
<!-- web.xml -->
cs