💡MVC 진행 과정
- 클라이언트가 url 을 요청하면 웹 브라우저에서 스프링으로
request
가 보내짐
Dispatcher Servlet
이 request
를 받으면 Handler Mapping
을 통해 해당 url을 담당하는 Controller를 탐색 후 찾아냄
- 찾아낸
Controller
로 request
를 보내주고, 보내주기 위해 필요한 Model을 구성
Model
에서는 페이지 처리에 필요한 정보들을 Database
에 접근하여 쿼리문을 통해 가져옴
- 데이터를 통해 얻은
Model
정보를 Controller
에게 Response
해주면 Controller
는 이를 받아 Model
을 완성시켜 Dispatcher Servlet
에게 전달해줌
Dispatcher Servlet
은 View Resolver
를 통해 request
에 해당하는 view
파일을 탐색 후 받아냄
- 받아낸
View
페이지 파일에 Model
을 보낸 후 클라이언트에게 보낼 페이지를 완성시켜 받아냄
- 완성된
View
파일을 클라이언트에 response
하여 화면에 출력
💡구성 요소
Dispatcher Servlet
- 모든 request를 처리하는 중심 컨트롤러
- 서블릿 컨테이너에서 http 프로토콜을 통해 들어오는 모든 request에 대해 제일 앞단에서 중앙 집중식으로 처리해주는 핵심적인 역할
- 기존에는 web.xml에 모두 등록해주어야 했지만 dispatcher servlet이 모든 request를 핸들링하면서 작업을 편리하게 할 수 있음
DispatcherServlet 생성
- Dispatcher Servlet은 Spring MVC 프로젝트를 생성한다면, 아래에 경로와 같이 이미 생성되어 있음
<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>/</url-pattern>
</servlet-mapping>
/WEB-INF/spring/appServlet/servlet-context.xml
- DispatcherServlet의 매핑 url-pattern이 '/*'일 때, jsp안에서 사용하는 js, css, img 등 resource 파일을 불러오는 데 문제가 생김
- resource file만 매핑하기 위해
<resources mapping="/resources/**" location="/resources/" />
작성
- 즉, resource file들은 /resource/ 위치에 만들어 사용해야 함
- view의 prefix, suffix 지정 -> @Controller 에서 뷰 리턴시 적용!
e.g. HomeController 에서 "home" 리턴시 /WEB-INF/views/home.jsp 파일 리턴
<annotation-driven />
<resources mapping="/resources/**" location="/resources/" />
<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.mycom.myboard.controller, com.mycom.myboard.common, com.mycom.myboard.config" />
Handler Mapping
- 클라이언트의
request url
을 어떤 컨트롤러가 처리해야 할 지 찾아서 Dispatcher Servlet에게 전달해주는 역할
- 컨트롤러 상에서 url을 매핑 시키기 위해
@RequestMapping
을 사용하는데, 핸들러가 이를 찾아주는 역할을 함
HandlerMethod
를 찾아 HandlerMethodExecutionChain
으로 감싸서 반환 -> 컨트롤러로 요청을 넘겨주기 위해 처리해야 하는 인터셉터 등을 포함하기 위해
Controller
- 실질적인 요청을 처리하는 곳
- Dispatcher Servlet이 front controller라면 이곳은 backend controller 라고 볼 수 있음
- Model의 처리 결과를 담아
Dispatcher Servlet
에게 반환
View Resolver
- Controller의 처리 결과를 만들 view를 결정해주는 역할
- 다양한 종류가 있기 때문에 상황에 맞게 활용 해야 함