[Web/Servlet JSP] Servlet 매핑에서 /와 /* 차이
1. Servlet 매핑에서 /와 /* 차이
과거에는 서블릿 매핑값이 다음과 같았습니다.
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>MvcConfig.java</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
url-pattern을 *.do 또는 *.action 처럼 특정 확장자를 붙여 지정했습니다. 그러던 중 RESTful 스타일의 url을 사용하자는 열풍이 불었죠. RESTful 스타일의 URL이란 한마디로 확장자를 쓰지 말자는 것입니다. (확장자를 쓰면 가독성도 떨어지고 별로 이쁘지도 않습니다.)
그럼 확장자 없는 URL을 만들려면 다음처럼 위의 url-pattern을 *.do에서 /*로 바꾸면 되지 않을까요?
... 생략
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
위처럼 설정한 후 jsp 페이지에 직접 접근해보면 안되는 것을 알 수 있습니다. 저희가 WAS라는 미들웨어를 두는건 동적인 처리를 하기 위함입니다. 만약에 브라우저에서 요청 url로 jsp 파일을 요청한다고 해보겠습니다. 브라우저가 jsp 페이지를 처리해서 사용자에게 보여줄 수 있을까요? 당연히 안 될겁니다. 즉, jsp 페이지 요청에 대한 매핑을 가진 서블릿이 있어야 된다는 뜻입니다.
<servlet-mapping>
<servlet-name>jspServlet</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
위와 같은 매핑을 담당하는 서블릿 설정은 어디에 있을까요? WAS(Tomcat, Jetty 등)의 web.xml에 정의되어 있습니다.
참고로 web.xml 파일은 에만 있는게 아니라, WAS(톰캣, 제티 등)에도 있습니다.
(Servlet의 라이프사이클을 담당하는게 Tomcat과 같은 WAS니 당연히 그렇겠죠? 🙂 )
어쨋든 위와 같은 설정을 가진 서블릿이 있었기 때문에 그 동안 jsp 페이지에 대한 요청이 처리가 됬던건데 url-pattern이 /*로 바뀌게 되면서 모든 요청이 해당 서블릿으로 들어가게 되었습니다. 그럼 어떻게 할까요? url-pattern을 /로 설정하면 됩니다.
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
/ 패턴을 가진 Servlet을 Default Servlet이라고 하고, 어떤 요청에 대한 패턴을 가진 서블릿이 없을 때 모든 요청을 디폴트 서블릿이 받아들입니다. 그런데 한 가지 문제가 발생합니다. / 패턴을 가진 디폴트 서블릿도 *.jsp 패턴을 가진 서블릿과 마찬가지로 WAS가 이미 정의해놨는데, 저희가 / 패턴의 디폴트 서블릿을 설정함으로써 톰캣(WAS)에서 만들어놓은 Default Servlet을 오버라이딩해버렸습니다.
이를 해결하기 위해 다음과 같은 코드가 필요합니다.
@Configuration
@EnableWebMvc
public class WebAppConfig extends WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){
configurer.enable();
}
}
'Web > Servlet JSP' 카테고리의 다른 글
[Web/Servlet JSP] 필터 (Filter) (0) | 2020.08.09 |
---|---|
[Web/Servlet JSP] 서블릿(Servlet)과 JSP (0) | 2019.06.15 |
댓글
이 글 공유하기
다른 글
-
[Web/Servlet JSP] 필터 (Filter)
[Web/Servlet JSP] 필터 (Filter)
2020.08.09 -
[Web/Servlet JSP] 서블릿(Servlet)과 JSP
[Web/Servlet JSP] 서블릿(Servlet)과 JSP
2019.06.15