다른 많은 웹 프레임워크와 마찬가지로 Spring MVC는 프런트 컨트롤러 패턴을 중심으로 설계되었습니다. 여기서 중앙 서블릿인 DispatcherServlet은 요청 처리를 위한 공유 알고리즘을 제공하고, 실제 작업은 구성 가능한 대리자 구성 요소에 의해 수행됩니다. 이 모델은 유연하며 다양한 워크플로를 지원합니다.

DispatcherServlet은 모든 Servlet과 마찬가지로 Java 구성이나 web.xml을 사용하여 Servlet 사양에 따라 선언하고 매핑해야 합니다. 그러면 DispatcherServlet은 Spring 구성을 사용하여 request mapping, view resolution, exception handling 등에 필요한 대리자 컴포넌트를 검색합니다.

다음은 Servlet 컨테이너에서 자동으로 감지되는 DispatcherServlet을 등록하고 초기화하는 Java 구성의 예입니다(Servlet Config 참조).

public class MyWebApplicationInitializer implements WebApplicationInitializer {

	@Override
	public void onStartup(ServletContext servletContext) {

		// Load Spring web application configuration
		AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
		context.register(AppConfig.class);

		// Create and register the DispatcherServlet
		DispatcherServlet servlet = new DispatcherServlet(context);
		ServletRegistration.Dynamic registration = servletContext.addServlet("app", servlet);
		registration.setLoadOnStartup(1);
		registration.addMapping("/app/*");
	}
}

WebApplicationInitializer는 ServletContext를 프로그래밍 방식으로 구성하기 위해 Servlet 환경에서 구현되는 인터페이스입니다. 이는 기존의 web.xml 기반 접근 방식과 대조되는 방식입니다. (또는 이와 함께 사용될 수도 있음).

이 SPI 구현은 SpringServletContainerInitializer에 의해 자동으로 감지되며, SpringServletContainerInitializer 자체는 모든 서블릿 컨테이너에 의해 자동으로 부트스트랩됩니다. 이 부트스트랩 메커니즘에 대한 자세한 내용은 Javadoc을 참조하십시오.

<aside>

NOTE

SPI는 Service Provider Interface의 약자로, Java에서 확장 가능한 플러그인 구조를 만들기 위한 인터페이스 설계 방식입니다.

SPI 는 라이브러리(또는 프레임워크)가 미리 확장 지점을 정의하고, 사용자가 그 인터페이스를 직접 구현하여 기능을 추가하거나 대체하도록 합니다. 반대로 API 는 라이브러리가 제공하고 사용자가 호출하는 방식이므로, SPI 는 “사용자가 구현하고 라이브러리가 호출”하는 역제어(Inversion of Control) 구조라고 보시면 됩니다.

</aside>

<aside>

NOTE

ServletContext API를 직접 사용하는 것 외에도 AbstractAnnotationConfigDispatcherServletInitializer를 확장하고 특정 메서드를 재정의할 수도 있습니다. (컨텍스트 계층 구조의 예를 참조하세요).

</aside>

<aside>

NOTE

프로그래밍 방식의 사용 사례에서 GenericWebApplicationContext를 AnnotationConfigWebApplicationContext의 대안으로 사용할 수 있습니다. 자세한 내용은 GenericWebApplicationContext javadoc을 참조하세요.

</aside>

다음은 web.xml 구성의 예이며 DispatcherServlet을 등록하고 초기화합니다.

<web-app>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/app-context.xml</param-value>
	</context-param>

	<servlet>
		<servlet-name>app</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value></param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>app</servlet-name>
		<url-pattern>/app/*</url-pattern>
	</servlet-mapping>

</web-app>

스프링 부트 Servlet Context Initialization