본문 바로가기

Spring

DispatcherServlet

스프링 MVC가 제공하는 servlet 중에 DispatcherServlet이라는 클래스가 있다.

이 클래스는 스프링 MVC 프레임워크의 가장 중요한, 핵심이되는 클래스라고 해도 과언이 아니니 잘 알아두는 것이 좋다.

 

FrontController 역할을 하는 Servlet

서블릿으로 웹 어플리케이션을 개발할 때 보편적으로 여러 url을 처리하는 서블릿을 여러개 만들어서 매핑한다.

이런식으로 해도 요청을 처리하는 것에는 문제없지만 처리할 요청이 늘어날 수록 서블릿을 더 만들어야 할 수도 있다.

서블릿을 만들면 서블릿 컨테이너에 등록해줘야하는데, 부가적인 작업 또한 늘어가고 web.xml과 같은 설정파일은 점점 장황해질 것이다.

 

이런 단점을 극복하고자 하는 패턴 중 FrontController라는 패턴이 있다.

(http://www.corej2eepatterns.com/FrontController.htm)

 

단순하게, 앞단에 위치해서 요청을 받아서 처리하는 것이라고 생각해도 된다.

 

즉, 서블릿으로서 서블릿 컨테이너로부터 요청을 받아서 적절한 Controller에게 요청을 전달하는 역할을 하는 것이 DispatcherServlet이다.

 

 

ApplicationContext를 생성한다.

Dispatcher Servlet은 ContextClass와 ContextConfigLocation 라는 이름의 정보를 가지고 있는데, 이를 활용하여 application context를 독자적으로 생성해낼 수 있다.

 

그리고 이 application context에 존재하는 핸들러들을 분석하여 특정 요청을 처리하는 핸들러가 무엇인지 확인한다.

이 결과로 다수의 HandlerMapping 객체를 생성하여 가지고 있다가, 요청이 들어오면 doDispatch함수에서 요청을 처리할 핸들러를 찾아내어 dispatch(요청처리를 핸들러에게 위임)한다.

 

 

요청을 처리하기 위해 역할별로 구분된 객체들을 가지고 있다.

  • HandlerMapping: 요청을 처리할 핸들러를 맵핑해두고 이를 찾아주는 역할
  • HandlerAdaptor: 핸들러에게 요청을 위임하여 처리하도록 하고, 결과값을 처리하는 역할
  • HandlerExceptionResolver: 요청 처리 중 에러가 발생하면 에러 처리를 위임
  • ViewResolver: 어떤 뷰를 그러야할지 판단하고 그려주는 역할
  • MultipartResolver: multipart-form 형식의 http 요청을 처리할 수 있는 역할
  • ThemeResolver: 웹페이지 테마를 결정할 수 있는 역할
  • localeResolver: 요청이 어느 지역으로부터 왔는지 판단하는 역할
  • FlashMapManager: 특정 요청에 처리할 공통적인 설정을 할 수 있는데, 보통 리다이렉션처리할 때 유용하다.

이 구성원들은 Dispatcher Servlet이 서블릿 생명주기 상에서 초기화 될 때 초기화하게 된다.

즉, Dispatcher Servlet이 생성되는 시점에 초기화 작업을 하게되는데, Dispatcher Servlet의 

	/**
	 * Initialize the strategy objects that this servlet uses.
	 * <p>May be overridden in subclasses in order to initialize further strategy objects.
	 */
	protected void initStrategies(ApplicationContext context) {
		initMultipartResolver(context);
		initLocaleResolver(context);
		initThemeResolver(context);
		initHandlerMappings(context);
		initHandlerAdapters(context);
		initHandlerExceptionResolvers(context);
		initRequestToViewNameTranslator(context);
		initViewResolvers(context);
		initFlashMapManager(context);
	}

 

이 구성원들을 우리가 직접 세팅해주는 일은 드물다.

Dispatcher Servlet은 이 구성원들을 디폴트로 설정하는 설정정보를 가지고 있다.

바로 DispatcherServlet.properties 파일에 디폴트 설정 정보를 담아두었다.

 

'Spring' 카테고리의 다른 글

RequestMapping  (0) 2019.06.29
HandlerMapping  (0) 2019.06.27
Resource Handler  (0) 2019.06.24
ContextLoaderListener  (0) 2019.06.09
ContextLoaderListener의 역할  (0) 2019.01.02