티스토리 뷰
1. Dispatcher-Servlet 이란?
Servlet Container에서 HTTP프로토콜을 통해 들어오는 모든 요청을 프레젠테이션 계층의 제일앞에 둬서 중앙집중식으로 처리해주는 프론트 컨트롤러(Front Controller)를 말한다.
쉽게 말하자면, 클라이언트로부터 어떠한 요청이 오면 Tomcat(톰캣)과 같은 서블릿 컨테이너가 요청을 받는다. 이때 제일 앞에서 서버로 들어오는 모든 요청을 처리하는 프론트 컨트롤러를 Spring에서 정의하였고, 이를 Dispatcher-Servlet이라고 한다. 그래서 공통처리 작업을 Dispatcher-Servlet이 처리한 후에 적절한 세부 컨트롤러로 작업을 위임해준다.
흐름은 다음과 같다. 기존의 방식은 컨트롤러 하나당 서블릿을 만들었었는데, 프론트 컨트롤러 패턴을 적용하면 dispatcher-servlet 하나로만 공통처리 작업을 할 수 있어 간편하다.
2. Dispatcher-Servlet의 장점
Spring MVC는 Dispatcher-Servlet의 사용으로 web.xml의 역할을 축소시켜준다. 기존에는 모든 서블릿에 대해 URL 매핑을 활용하기 위해서 web.xml에 모두 등록해주어야 했지만, dispatcher-servlet이 해당 어플리케이션으로 들어오는 모든 요청을 처리해주면서 작업이 상당히 편리해졌다.
3. dispatcher-servlet 설정
[ web.xml ]
다음 내용을 web.xml에 추가하여 dispatcher를 등록한다.
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring-config/dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
은 web.xml에 dispatcher라는 서블릿을 추가한다는 것이다.
는 그 위치에 있는 설정 파일을 읽어들이고 그 파일이 dispatcher라는 서블릿으로 만들겠다는 것이다.
으로 DispatcherServlet이 처리할 url-mapping을 작성해준다.
[ dispatcher-servlet.xml ]
url을 맵핑하기 위해서 컨트롤러가 되는 클래스와 연결한다.
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="/index" class="webprj.IndexController"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
현재 /index를 컨트롤러와 연결하도록 등록했다. 이런식으로 컨트롤러와 url을 맵핑한다.
그리고 ViewResolver를 등록했는데, 이는 컨트롤러에서 결과를 출력하기 위해 보내온 view 이름에 위에 지정해놓은 정보를 붙여서 경로를 찾아준다. 예를 들어 property로 prefix를 지정했는데 이는 보내온 view 이름 앞에, suffix는 뒤에 붙여주는 것이다.
컨트롤러 클래스의 내용이 다음과 같다.
package webprj;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class IndexController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("data","Hello Spring MVC");
//mv.setViewName("/WEB-INF/views/index.jsp");
mv.setViewName("index");
return mv;
}
}
setViewName 함수를 통해서 결과를 보낼 view 이름을 dispatcher-servlet에 보낸다.
가령 mv.setViewName("/WEB-INF/views/index.jsp"); 이렇게 사용한다고 생각해보자.
문제는 없을 것이다. 그치만 모든 컨트롤러에서 보내는 view 이름은 앞에 /WEB-INF/views/ 경로와 뒤에 확장자인 .jsp가 같을 것이다.
그렇기 때문에 그냥 간단하게 mv.setViewName("index"); 이렇게만 써도 ViewResolver에서 붙이고 찾도록 dispatcher-servlet.xml에 등록한다.
4. ViewResolver 설정
<!--ViewResolver-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="2"/>
</bean>
컨트롤러에서 보내온 뷰 이름을 토대로 처리 View를 검색하는 ViewResolver를 dispatcher-servlet.xml에 설정한다.
뷰 이름의 앞에 붙일 prefix (접두어)와 뒤에 붙일 suffix (접미사)를 설정해준다.
이를 붙여서 최종적으로 사용할 jsp파일 경로를 결정한다.
'백엔드 및 서버' 카테고리의 다른 글
[ Spring ] Service 객체 및 DB연결 정보 분리 (0) | 2021.01.27 |
---|---|
[ Spring ] tiles 설명 및 설정 방법 (0) | 2021.01.27 |
[ Spring ] AOP 설명 및 구현방식(xml) (0) | 2021.01.23 |
[ Spring ] DI (Dependency Injection) Annotation 방식 설명 및 사용법 (0) | 2021.01.22 |
[ Spring ] DI (Dependency Injection) xml 방식 설명 및 사용법 (0) | 2021.01.22 |