1. 개요
이 기사에서는 최신 버전의 Spring Framework 에서 사용할 수 있는 DispatcherServlet 을 구성하는 세 가지 접근 방식을 다룰 것입니다 .
- XML 구성과 web.xml 파일로 시작하겠습니다.
- 그런 다음 Servlet 선언을 web.xml 파일에서 Java 구성으로 마이그레이션 하지만 다른 구성은 XML로 남겨 둡니다.
- 마지막으로 리팩토링의 세 번째이자 마지막 단계에서 100 % Java로 구성된 프로젝트가 있습니다.
2. DispatcherServlet
의 핵심 개념 중 하나는 스프링 MVC는 는 IS 의 DispatcherServlet . Spring 설명서 를 같이 정의한다 :
HTTP 요청 핸들러 / 컨트롤러 (예 : 웹 UI 컨트롤러 또는 HTTP 기반 원격 서비스 내보내기)를위한 중앙 디스패처. 웹 요청을 처리하기 위해 등록 된 핸들러로 디스패치하여 편리한 매핑 및 예외 처리 기능을 제공합니다.
기본적으로 DispatcherServlet 은 모든 Spring MVC 애플리케이션 의 진입 점입니다 . 그 목적은 HTTP 요청 을 가로 채서 이를 처리하는 방법을 알 수있는 올바른 구성 요소로 보내는 것입니다.
3. 구성 w eb.xml
레거시 Spring 프로젝트 를 다루는 경우 XML 구성 을 찾는 것이 매우 일반적 이며 Spring 3.1 까지 DispatcherServlet 을 구성하는 유일한 방법 은 WEB-INF / web.xml 파일이었습니다. 이 경우 두 단계가 필요합니다.
예제 구성을 보겠습니다. 첫 번째 단계는 Servlet 선언입니다.
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
이 XML 블록을 사용하여 다음과 같은 서블릿을 선언합니다.
- " 발송자 "라고합니다.
- org.springframework.web.servlet.DispatcherServlet 의 인스턴스입니다.
- 구성 XML에 대한 경로를 포함하는 contextConfigLocation 이라는 매개 변수로 초기화됩니다.
load-on-startup 은 여러 서블릿이로드되는 순서를 지정하는 정수 값입니다. 따라서 둘 이상의 서블릿을 선언해야하는 경우 초기화 될 순서를 정의 할 수 있습니다. 낮은 정수로 표시된 서블릿은 높은 정수로 표시된 서블릿보다 먼저로드됩니다.
이제 서블릿이 구성되었습니다. 두 번째 단계는 servlet-mapping을 선언하는 것입니다 .
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
서블릿 매핑을 사용하면 이름 으로 처리 할 HTTP 요청 을 지정 하는 URL 패턴 에 바인딩합니다.
4. 하이브리드 구성
Servlet API 3.0 버전이 채택됨에 따라 web.xml 파일이 선택 사항이되었으며 이제 Java를 사용하여 DispatcherServlet 을 구성 할 수 있습니다 .
WebApplicationInitializer를 구현하는 서블릿을 등록 할 수 있습니다 . 이것은 위 의 XML 구성 과 동일합니다 .
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
이 예에서 우리는 다음과 같습니다.
- WebApplicationInitializer 인터페이스 구현
- onStartup 메서드를 재정 의하여 XML 예제 에서 contextConfigLocation 으로 서블릿에 전달 된 동일한 파일로 구성된 새 XmlWebApplicationContext를 만듭니다.
- 그런 다음 방금 인스턴스화 한 새 컨텍스트 로 DispatcherServlet 의 인스턴스를 만듭니다.
- 마지막으로 매핑 URL 패턴으로 서블릿을 등록합니다.
그래서 우리는 자바 를 사용 하여 서블릿을 선언하고 URL 매핑에 바인딩 했지만 구성은 별도의 XML 파일 인 dispatcher-config.xml에 보관했습니다 .
5. 100 % Java 구성
이 방법을 우리의 서블릿은 자바 선언 , 하지만 우리는 여전히 필요 XML의 를 구성하는 파일을. WebApplicationInitializer 를 사용하면 100 % Java 구성을 달성 할 수 있습니다.
이전 예제를 어떻게 리팩토링 할 수 있는지 살펴 보겠습니다.
가장 먼저해야 할 일은 서블릿에 대한 애플리케이션 컨텍스트를 만드는 것입니다.
이번에는 어노테이션 기반 컨텍스트를 사용 하여 구성에 Java 및 어노테이션을 사용하고 dispatcher-config.xml 과 같은 XML 파일 의 필요성을 제거 할 수 있습니다 .
AnnotationConfigWebApplicationContext context
= new AnnotationConfigWebApplicationContext();
이 유형의 컨텍스트는 구성 클래스를 등록하여 구성 할 수 있습니다.
context.register(AppConfig.class);
또는 구성 클래스를 검색 할 전체 패키지를 설정합니다.
context.setConfigLocation("com.example.app.config");
이제 애플리케이션 컨텍스트가 생성 되었으므로 컨텍스트를로드 할 ServletContext에 리스너를 추가 할 수 있습니다 .
container.addListener(new ContextLoaderListener(context));
다음 단계는 디스패처 서블릿을 만들고 등록하는 것입니다.
ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
이제 WebApplicationInitializer 는 다음과 같아야합니다.
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) {
AnnotationConfigWebApplicationContext context
= new AnnotationConfigWebApplicationContext();
context.setConfigLocation("com.example.app.config");
container.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = container
.addServlet("dispatcher", new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
Java 및 어노테이션 구성은 많은 이점을 제공합니다. 일반적으로 더 짧고 간결한 구성으로 이어지며 어노테이션은 구성하는 코드와 함께 배치되므로 선언에 더 많은 컨텍스트를 제공합니다.
그러나 이것이 항상 바람직하거나 가능한 방법은 아닙니다. 예를 들어 일부 개발자는 코드와 구성을 분리하여 유지하거나 수정할 수없는 타사 코드로 작업해야 할 수 있습니다.
6. 결론
이 기사에서는 Spring 3.2 이상 에서 DispatcherServlet 을 구성하는 다양한 방법을 다루었 으며 선호도에 따라 사용할 방법을 결정하는 것은 사용자에게 달려 있습니다. Spring 은 당신이 선택한 모든 결정을 수용 할 것입니다.