HomeBlogGuestbookLab 

JDM's Blog

온갖 테스트 결과가 기록되는 이곳은 JDM's Blog입니다. :3

Spring DispatcherServlet

스프링 프레임워크를 쓰다보면 DispatcherServlet(이하 "디스패처 서블릿")이라는 단어가 자주 보입니다. 이게 뭔데 자주 등장하는걸까요? 한 번 알아봅시다.

DispatcherServlet

디스패처 서블릿모든 HTTP Request/Response를 관리하는 서블릿입니다. 간단하게 다이어그램을 그려보면 아래와 같습니다.

╋───────╋
┃HTTP Request  ┃
╋───────╋
       ┃(1)
       ▼
   ╋───╋  (2) ╋────────╋
   ┃  D   ┃──▶┃HandlerMapping  ┃
   ┃  i   ┃◀──┃                ┃
   ┃  s   ┃  (3) ╋────────╋
   ┃  p   ┃
   ┃  a   ┃  (4) ╋────────╋
   ┃  t   ┃──▶┃Controller      ┃
   ┃  c   ┃◀──┃                ┃
   ┃  h   ┃  (5) ╋────────╋
   ┃  e   ┃
   ┃  r   ┃  (6) ╋────────╋
   ┃  S   ┃──▶┃ViewResolver    ┃
   ┃  e   ┃◀──┃                ┃
   ┃  r   ┃  (7) ╋────────╋
   ┃  v   ┃
   ┃  l   ┃  (8) ╋────────╋
   ┃  e   ┃──▶┃View            ┃
   ┃  t   ┃◀──┃                ┃
   ╋───╋  (9) ╋────────╋
       ┃(10)
       ▼
╋───────╋
┃HTTP Response ┃
╋───────╋
  • (1) 클라이언트로부터 HTTP 요청을 받습니다.
  • (2) 디스패처 서블릿은 Controller를 호출하기 위해 Handler Mapping을 참조합니다.
  • (3) HandlerMapping에서 요청에 해당하는 Controller 정보를 반환합니다.
  • (4) 디스패처 서블릿은 Handler Mapping에서 반환 받은 Controller 정보로 실제 Controller를 호출합니다.
  • (5) Controller는 @RequestMapping과 GET/POST 메소드 등에 기반해서 관련 Model을 호출하고 비즈니스 로직을 처리합니다. 그리고 디스패처 서블릿한테 Model Data(또는 "ModelAndView")와 View Name을 전달합니다.
  • (6) 디스패처 서블릿은 Controller에서 받은 View Name을 인자로 ViewResolver에게 넘겨줍니다.
  • (7) ViewResolver는 전달 받은 View Name에 맞는 참조할 View 정보를 디스패처 서블릿에 반환합니다.
  • (8) 디스패처 서블릿은 View Resolver에게 전달 받은 View 정보를 참조로 해서 View에 Model Data를 보냅니다.
  • (9) View는 전달받은 Model Data를 적절하게 렌더링합니다. 그리고 완성 결과를 디스패처 서블릿에게 반환합니다.
  • (10) 디스패처 서블릿은 전달받은 최종 View를 클라이언트에 응답(Response)으로 돌려줍니다.

Analyze DispatcherServlet

전체적인 부분을 알아봤으니 이번엔 개별로 하나씩 차근차근 뜯어서 확인해봅시다.

HandlerMapping

Handler Mapping(이하 "핸들러 매핑")은 디스패처 서블릿이 클라이언트에서 요청이 왔을 때 처리할 Controller를 참조할 용도로 사용합니다. 이 핸들러 매핑은 종류가 몇가지 있는데 간단하게 알아봅시다.

  • SimpleUrlHandlerMapping
    URL을 기반으로 합니다. "mappings"이라는 프로퍼티 데이터에 따라서 매핑합니다.
  • BeanNameUrlHandlerMapping
    URL의 슬래시("/")부터 시작하는 이름과 동일한 이름을 가진 Bean을 매핑합니다.
  • DefaultAnnotationHandlerMapping
    @RequestMapping 어노테이션을 통한 HTTP Path 표현식에 기반합니다.

더 많은 정보를 보시려면 HandlerMapping을 참조하세요.

ViewResovler

ViewResolver(이하 "뷰 리졸버")는 디스패처 서블릿이 실제 Model data를 렌더링할 View를 참조할 때 사용합니다. 간단하게 몇가지만 알아봅시다.

  • BeanNameViewResolver
    현재 어플리케이션 컨텍스트 안의 Bean 이름과 동일한 View name을 반환해 줍니다.
  • UrlBasedViewResolver
    WEB-INF에 위치한 JSP 파일을 반환해줍니다. 해당 파일의 경로는 접두사(ex. "/WEB-INF/jsp/")와 접미사(ex. ".jsp")를 붙여 결정합니다.
  • InternalResourceViewResolver
    UrlBasedViewResolver 인터페이스를 구현한 하위 인터페이스입니다. JstlView 같은 서브 클래스와 InternalResourceView(Servlet, JSP)를 지원합니다.

특이한 것은 UrlBasedViewResolver, InternalResourceViewResolver 같은 경우 뷰 리졸버가 여러개일 때는 제일 마지막에 위치해야 합니다. 두 리졸버는 마지막에 다른 리졸버가 처리할 수 있도록 데이터를 넘기지 않기 때문이죠. 마지막에 넣어줍시다.

순수하게 JSP만을 사용한다면 UrlBasedViewResolver을 사용해도 되지만 JSTL을 사용하고자 한다면 InternalResourceViewResolver을 사용하면 됩니다. :D

더 많은 정보를 보시려면 ViewResolver를 참조하세요.