Jinhyuk Kim

Software Development Engineer @ Amazon

reniowood at gmail.com
resume

Spring Web MVC - 1. DispatcherServlet

2018-10-03

다음 내용은 Spring Web MVC 5.1.0.RELEASE 버전의 공식 문서인 Web On Servlet Stack의 Spring Web MVC 부분 중 일부분을 발췌해 번역해 놓은 것입니다. 링크된 공식 문서의 내용과 다른 부분이나 생략된 부분이 있을 수 있습니다.

Spring Web MVC

DispatcherServlet

Spring MVC는 위임된 컴포넌트가 요청을 처리할 수 있는 공통된 알고리즘을 제공하는 Servlet과 프론트 컨트롤러 패턴을 바탕으로 설계되었다.

DispatcherServlet은 여느 Servlet과 마찬가지로 자바 configuration이나 web.xml을 이용해 정의하고 설정한다. DispatcherServlet은 Spring configurtaion을 이용해 요청 할당, 뷰 처리, 예외 처리에 필요한 위임된 컴포넌트를 찾는다.

Context Hierarchy

DispatcherServletApplicationContext의 확장인 WebApplicationContext를 자신의 configurtaion으로 설정한다. WebApplicationContextServletContextServlet에 대한 링크를 가지고 있다. WebApplicationContext도 마찬가지로 ServletContext에 연결되어 있다.

대부분의 어플리케이션은 하나의 WebApplicationContext만 가지고 있어도 충분하다. 하나의 최상위 WebApplicationContext를 여러 DispatcherServlet이 공유하고, 각 DispatcherServlet은 자식 WebApplicationContext를 가질 수도 있다.

최상위 WebApplicationContext는 여러 Servlet이 공유하는 데이터 저장소나 비즈니스 서비스와 같은 기본적인 bean을 가진다. 이 bean들은 자식 WebApplicationContext이 상속하고 재선언할 수도 있다.

Special Bean Types

DispatcherServlet은 요청을 처리하고 응답을 만들기 위해 특별한 bean에 위임한다. 이 beans들은 Spring이 관리한다.

Web MVC Config

어플리케이션은 특별한 bean 목록에 있는 bean을 선언할 수 있다. DispatcherServletWebApplicationContext를 확인하고, 필요한 bean이 없을 경우엔 DispatcherServlet.properties에 나열된 기본 bean을 사용한다.

대부분의 경우엔 MVC Config(@EnableWebConfig를 사용한 Java configuration 등)에 필요한 bean을 정의한다.

Servlet Configuration

WebApplicationInitializer는 Servlet 구현을 찾아내고 Servlet 컨테이너를 자동으로 초기화하는 데 사용하는 Spring MVC가 제공하는 인터페이스이다. AbstractDispatcherServletInitializerDispatcherServlet을 좀 더 쉽게 등록할 수 있도록 해주는 WebAplicationInitializer의 추상 클래스이다.

AbstractDispatcherServletInitializerFilter 인스턴스를 추가할 수 있는 편리한 방법을 제공하고 자동으로 DispatcherServlet에 추가해준다.

DispatcherServlet을 맞춤 설정하기 위해서는 createDispatcherServlet을 오버라이드하면 된다.

Processing

DispatcherServlet은 다음과 같은 방식으로 요청을 처리한다.

WebApplicationContext에 정의된 HandlerExceptionResolver bean이 처리 도중 발생한 예외를 처리한다. 예외를 처리하기 위한 로직을 따로 설정할 수도 있다.

Spring DispatcherServlet은 Servlet API에 명시된 last-modification-date를 반환할 수 있도록 지원한다. DispatcherServletLastModified 인터페이스를 구현한 핸들러를 찾아 해당 인터페이스의 log getLastModified(request) 메소드의 반환값을 전달한다.

web.xml의 Servlet 선언에 Servlet 초기화 파라미터를 추가함으로써 개별 DispatcherServlet 인스턴스를 설정할 수 있다.