[Spring 설정] 컨트롤러 경로 매핑과 디폴트 서블릿 설정
1. 서블릿 매핑에 따른 컨트롤러 매핑 및 디폴트 서블릿 설정
사진 1에서처럼 servlet-mapping의 url-pattern을 설정해주면 해당 경로로 들어오는 요청에 대해서 서블릿을 매핑해준다는 것을 의미한다. url-pattern은 여러 개를 등록할 수 있다.
위 사진과 같이 url-pattern을 '/' 으로 설정하게 되면 jsp 요청을 제외한 나머지 모든 요청을 DispatcherServlet이 받게 된다.
http://localhost:8080/springMaster/user/list
http://localhost:8080/springMaster/bootstrap/bootstrap.css
이 두개의 요청은 모두 DispatcherServlet이 받게 된다. /user/list 경로에 대한 컨트롤러가 존재하는 경우, 이 요청은 해당 컨트롤러에 의해서 처리된다. 하지만 /bootstrap/bootstrap.css 경로에 매핑된 컨트롤러가 존재하지 않는다고 가정한다면, DispatcherServlet은 매핑된 컨트롤러가 존재하지 않아 404 응답 코드를 웹 브라우저에게 전달한다. 이때, 404 에러 코드 대신에 컨테이너의 default servlet을 이용해 요청을 처리하도록 만들어주는 것이 <mvc:default-servlet-handler /> 설정이다.
사진 2에서의 설정을 추가하면, default servlet handler가 빈으로 등록되고 다음과 같은 동작 순서를 갖게 된다.
- request URL에 매핑되는 컨트롤러가 존재하는지 탐색한다.
- 존재하는 경우, 컨트롤러를 통해 요청을 처리한다.
- default servlet handler가 등록되어 있지 않은 경우, 404 에러 코드를 전송한다.
- default servlet handler가 등록되어 있는 경우, 해당 요청을 default servlet handler에게 전달한다.
- default servlet handler는 WAS의 디폴트 서블릿에게 요청을 전달한다.
각 WAS는 서블릿 매핑에 존재하지 않는 요청을 처리하기 위한 디폴트 서블릿을 제공한다. 대표적으로 JSP에 대한 요청을 처리하는 것이 해당된다. 사진 1에서와 같이 url-pattern을 '/'로 설정하게 되면 JSP 요청을 제외한 나머지 모든 요청을 DispatcherServlet이 받게된다고 앞서 설명했다. 따라서, *.html, *.css와 같은 요청은 WAS가 제공하는 디폴트 서블릿이 처리할 수 없게 된다. (WAS의 디폴트 서블릿에게 요청이 오는 것이 아니므로)
default servlet handler가 하는 일이 바로 이러한 상황에서 요청을 디폴트 서블릿에 전달해주는 것이다. 즉, URL에 매핑된 컨트롤러가 존재하지 않는 경우, 404 에러 코드를 전송하는 대신 디폴트 서블릿이 해당 요청을 처리하도록 하는 것이다.
자바 설정을 사용하는 경우
@Configuration
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter {
/**
* 디폴트 서블릿 핸들러 - css, js, jsp 등에 대한 요청이 들어오면 디폴트 서블릿에 다시 전달하는 핸들러
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}