ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SPRING] DispatcherServlet
    study/spring 2020. 8. 4. 23:53

    DispatcherServlet

     : 서블릿 컨테이너에서 HTTP 프로토콜을 통해 들어오는 모든 요청을 프레젠테이션 계층의 제일 앞에 둬서 중앙 집중식으로 처리해주는 프론트 컨트롤러

    클라이언트로부터 요청이 들어오면 Tomcat 같은 서블릿 컨테이너가 요청을 받는데 이때 제일 앞에서 서버로 들어오는 모든 요청을 처리하는 프론트 컨트롤러

     

    장점

    web.xml의 역할을 축소시켰다. 

    <servlet-mapping>
    	<servlet-name>default</servlet-name>
    	<url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
    	<servlet-name>jsp</servlet-name>
    	<url-pattern>*.jsp</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
    	<servlet-name>jsp</servlet-name>
    	<url-pattern>*.jspx</url-pattern>
    </servlet-mapping>

    기존엔 위처럼 모든 서블릿에 대해서 URL 매핑을 위해 반드시 web.xml에 등록해야 했지만

    <servlet>
           <servlet-name>dispatcher</servlet-name>
           <servlet-class>
               org.springframework.web.servlet.DispatcherServlet
           </servlet-class>
           <load-on-startup>1</load-on-startup>
    </servlet>
      
    <servlet-mapping>
           <servlet-name>dispatcher</servlet-name>
           <url-pattern>/</url-pattern>
    </servlet-mapping>
      

    <servlet>으로 DispatcherServlet을 등록해주어 DispatcherServlet이 해당 애플리케이션으로 들어오는 모든 요청을 핸들링해준다.

     

    아래의 게시물에서 스프링의 동작원리를 확인할 수 있다.

    2020/07/21 - [study/spring] - [SPRING] 스프링의 정의 / 특징 / 동작 원리

     

    [SPRING] 스프링의 정의 / 특징 / 동작 원리

    스프링 프레임워크란? 자바 엔터프라이즈 개발을 편하게 해주는 경량급 오픈 소스 애플리케이션 프레임워크 Lightweight Java Application Framework POJO 기반의 Enterprise Application 개발을 쉽고 편하게 할..

    jaeho214.tistory.com

    DispatcherServlet이 모든 요청을 Controller로 넘겨주는 방식은 효율적으로 보이나 약간의 문제가 있다.

    모든 요청을 처리하다보니 정적인 파일, 즉 이미지 파일이나 HTML 파일을 불러오는 요청마저 전부 Controller로 넘겨버리게 된다.

    게다가 JSP파일 안의 javascript나 css 파일에 대한 요청까지도 가로채기 때문에 불러오지 못하는 상황도 발생하곤 했다.

    이에 대한 해결책은 두가지가 있다.

     

    1. 클라이언트의 요청을 2가지로 분리하여 구분하는 것

    2. 모든 요청을 컨트롤러에 등록하는 것

     

    첫 번째 방법은

    /apps 와 /resources로 url을 구분하여 DispatcherServlet을 거칠지 거치지 않을지를 결정한다.

    이 방식은 코드가 지저분해지며 모든 요청에 대해 저런 url을 붙이기 때문에 직관적인 설계가 될 수 없다는 단점이있다.

    두 번째 방법은 언뜻 보아도 무식한 방법으로 보인다.

     

    Spring은 이러한 문제들을 해결함과 동시에 편리한 방법을 제공해주는데 바로  <mvc:resources /> 를 이용한 방법이다.

    스프링 프레임워크를 사용하면 servlet-context.xml 파일에서

    <resources mapping="/resources/-*" location="/resources/" />

    위 코드를 볼 수 있다.

    이것은 만약 DispatcherServlet에서 해당 요청에 대한 컨트롤러를 찾을 수 없는 경우에 2차적으로 설정된 경로에서 요청을 탐색하여 자원을 찾아내는 것이다.

    이러한 방법을 이용하면 리소스 관리를 지원할 뿐아니라 확장에도 용이하다.

     

     

    참고

    http://egloos.zum.com/springmvc/v/504151

Designed by Tistory.