ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Servlet/JSP URL패턴과 DispatcherServlet
    프로그래밍/Spring 2021. 12. 30. 20:52

    URL 패턴

    @WebServlet으로 서블릿을 URL에 매핑할 때 사용한다. Spring에서도 동일한 URL 패턴을 사용한다.

    종류 URL pattern 매칭 URL
    1. exact(정확한) mapping /login/hello.do http://localhost/login/hello.do
    2. path(경로) mapping /login/* http://localhost/login/
    http://localhost/login/hello
    http://localhost/login/hello.do
    http://localhost/login/test/
    3. extension(확장자) mapping *.do http://localhost/hi.do
    http://localhost/login/hello.do
    4. default mapping / http://localhost/
    http://localhost/hello.do
    http://localhost/login/
    http://localhost/login/hello
    http://localhost/login/hello.do

    각 번호는 우선순위를 나타낸다. default mapping은 모든 주소와 매칭이 된다. 하지만 우선순위가 제일 낮기 때문에 앞선 우선순위에서 매칭이 안될 때만 default mapping으로 매칭된다.

     

    HelloServlet

    @WebServlet("/hello")
    public class HelloServlet extends HttpServlet {

     

    Spring에서도 URL 패턴 사용 가능

    @RequestMapping("/hello")
    private void main() {
        System.out.println("Hello - private");
    }

     

    ServletContext

    서블릿의 이름과 URL 매핑이 Map형태로 저장되어있다. 요청이 오면 servletMappings 에서 요청과 일치한 URL패턴(key)의 value 값(서블릿 이름)을 찾는다. children(서블릿) 에서 해당 서블릿 이름에 해당하는 서블릿으로 처리한다.

     

    ex)

    1. 브라우저에서 /hello 로 요청

    2. servletMappings에서 /hello에 대한 key값 찾기

    3. 해당 value값(서블릿이름)에 해당하는 children(서블릿)의 key값을 찾는다.

    4. 해당 값에 대응하는 서블릿을 처리한다.

     

    요청 URL에 대응하는 서블릿이 없다면??

    404 NOT FOUND 에러가 발생한다.

     

    스프링의 DispatcherServlet

    스프링에서는 요청 URL에 대응하는 서블릿이나 JSP를 사용하지 않기 때문에 모든 요청을 "/" 즉, Default Servlet으로 처리한다. 이를 DispatcherServlet이라고 한다.

     

    모든 요청을 먼저 이 곳에서 받고 DispatcherServlet 안에서 내부적으로 요청에 해당하는 URL을 해당 Controller로 매핑시켜준다. 

     

    스프링의 기본 설정

    Tomcat에 있는 web.xml (전체 설정)

    <servlet>
            <servlet-name>default</servlet-name>
            <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
            <init-param>
                <param-name>debug</param-name>
                <param-value>0</param-value>
            </init-param>
            <init-param>
                <param-name>listings</param-name>
                <param-value>false</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

     

    spring 프로젝트의 web.xml (프로젝트별 개별 설정)

    <!-- Processes application requests -->
    <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>

    기존 톰캣에 설정되어있던 DefaultServlet을 spring이 엎어치기해서 appServlet이라는 이름의 서블릿으로 등록했으며 서버로 오는 모든 요청을 DispatcherServlet로 받게 된다.

     

     

     

     

    댓글

Designed by Tistory.