1. 개요

이 기사에서는 최신 버전의 Spring Framework 에서 사용할 수 있는 DispatcherServlet 을 구성하는 세 가지 접근 방식을 다룰 것입니다 .

  1. XML 구성과 web.xml 파일로 시작하겠습니다.
  2. 그런 다음 Servlet 선언을 web.xml 파일에서 Java 구성으로 마이그레이션 하지만 다른 구성은 XML로 남겨 둡니다.
  3. 마지막으로 리팩토링의 세 번째이자 마지막 단계에서 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 블록을 사용하여 다음과 같은 서블릿을 선언합니다.

  1. " 발송자 "라고합니다.
  2. org.springframework.web.servlet.DispatcherServlet 의 인스턴스입니다.
  3. 구성 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("/");
    }
}

이 예에서 우리는 다음과 같습니다.

  1. WebApplicationInitializer 인터페이스 구현
  2. onStartup 메서드를 재정 의하여 XML 예제 에서 contextConfigLocation 으로 서블릿에 전달 된 동일한 파일로 구성된 XmlWebApplicationContext를 만듭니다.
  3. 그런 다음 방금 인스턴스화 한 새 컨텍스트 DispatcherServlet 의 인스턴스를 만듭니다.
  4. 마지막으로 매핑 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 은 당신이 선택한 모든 결정을 수용 할 것입니다.

이 기사의 소스 코드는 Github의 여기여기 에서 찾을 수 있습니다 .