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