`Spring5-최범균` 정리



Dispatcher-Servlet이란?

참고링크


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

    • 클라이언트로부터 어떤 요청이 오면 Tomcat과 같은 서블릿 컨테이너가 요청을 받는데, 이때 제일 앞에서 서버로 들어오는 모든 요청을 처리하는 프론트 컨트롤러를 Spring에서 정의하였고, 이를 Dispatcher-Servlet이라고 한다.
    • 공통처리 작업을 Dispatcher 서블릿이 처리한 후, 적절한 세부 컨트롤러로 작업을 위임해 준다.
  • [Dispatcher-Servlet의 흐름]
    dispatcher-servlet-flow

    1. 클라이언트가 해당 어플리케이션에 접근하면 접근한 URL요청을 DispatcherServlet이 가로챈다. 이렇게 요청을 가로챌 수 있는 이유는 web.xml에 등록 된 DispatcherServlet<url-pattern>/와 같이 해당 어플리케이션의 모든 URL로 등록되어 있기 때문이다. 만약 특정 URL만 적용하고 싶다면 <url-pattern>의 내용을 바꿔주어 범위를 변경 시켜주면 된다.
    2. 가로챈 정보를 HandlerMapping에게 보내 해당 요청을 처리할 수 있는 Controller를 찾아낸다.
      (이 부분은 스프링의 디폴트 전략에 의해 BeanNameUrlHandlerMapping과 DefaultAnnotationHandlerMapping`이 기본으로 스프링MVC에 탑재되어있기 때문에 특별한 경우가 아니라면 따로 설정할 필요가 없다.)
    3. 핸들러 매핑이 해당 요청을 처리할 컨트롤러를 찾아냈다면 요청을 컨트롤러에 보내준다. 컨트롤러는 사용자가 직접 구현해주는 부분이다.
    4. 해당 요청을 처리한 후에 보통 컨트롤러는 요청을 응답받을 View의 이름을 리턴하게 된다. (물론 다른 핸들러 매핑 전략을 이용한다면 다를 수도 있다.)
      그때 이 이름을 ViewResolver가 먼저 받아 해당하는 View가 존재하는지 검색한다.
    5. 해당 View가 있다면 처리결과를 View에 보낸다.
    6. 이 결과를 다시 DispatcherServlet에 보낸다.
    7. DispatcherServlet은 최종 결과를 클라이언트에 전송한다.

    실제 돌아가는 구조는 복잡해 보이지만 사용자가 직접 구현하는 부분은 Controller부분과 View부분밖에 없다. 나머지는 대략적인 흐름만 알고있자.

  • [모든 요청을 처리하다보니 이미지나 HTML파일, 게다가 JSP안의 자바스크립트나 CSS 파일도 다 요청을 가로채버릴 때]

    1. 디스패처 서블릿이 처리할 URL과 자바와 관련없는 리소스들의 영역을 분리 시키는 것
      • [예]
        /apps - 클라이언트가 이 URL로 접근하면 앞으로 디스패처 서블릿이 담당 /resources - 이 URL은 디스패처 서블릿이 컨트롤할 수 없는 영역으로 분리
      • 그러나..
        이런 처리방식은 괜찮지만 코드가 지저분해지고 form에서 모든 요청을 보낼때 apps라는 URL을 붙여줘야 하기 때문에 직관적인 설계가 불가
    2. 모든 요청을 컨트롤러에 등록하는 방법 절대금지 3.<mvc:resources /> 사용
      • Spring Template Projcect로 생성했다면 servlet-context.xml에서 해당 코드를 발견 할 것이다.
          <resources mapping="/resources/-*" location="/resources" />
        
      • 해당 전략은 먼저 디스패처 서블릿을 통해 들어온 요청을 처리하는데, 만약 디스패처 서블릿이 해당 요청에 대한 컨트롤러를 찾을 수 없다면 2차적으로 위의 설정된 경로를 검색하여 해당 자원을 찾아내게 되는 것이다.

      • 많은 대형 웹서비스들의 비 어플리케이션 자원 URL을 보면 철저하게 static 성격의 외부 자원들을 분리시켜 사용하고 있다. 네이버 같은 경우는 http://static.naver.net/이란 URL을 통해 자원을 분리한 것을 볼 수 있다. 차후 확장을 위해 비어플리케이션 자원은 반드시 분리해야할 영역이다.




© 2019. by mintheon

Powered by mintheon