Servlet Config

2025. 2. 27. 23:29Spring Framework/Web on Servlet Stack

Spring MVC를 서블릿(Servlet) 환경에서 설정하는 방법은 크게 두 가지입니다.
1️⃣ web.xml을 이용한 XML 기반 설정
2️⃣ Java 코드로 서블릿 컨테이너를 직접 구성하는 방법

Spring에서는 web.xml 없이도 프로그램적으로 서블릿을 설정할 수 있는 기능을 제공합니다.


1. WebApplicationInitializer를 이용한 서블릿 설정

WebApplicationInitializerSpring MVC에서 제공하는 인터페이스로, 서블릿 3.x 이상을 지원하는 컨테이너에서 자동으로 감지되고 실행됩니다.

✅ 예제: DispatcherServlet 등록

import org.springframework.web.WebApplicationInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class MyWebApplicationInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext container) throws ServletException {
        XmlWebApplicationContext appContext = new XmlWebApplicationContext();
        appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");

        ServletRegistration.Dynamic registration = 
            container.addServlet("dispatcher", new DispatcherServlet(appContext));
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
    }
}

📌 설명

  • WebApplicationInitializer를 구현하면 서블릿 컨테이너가 이를 감지하고 실행합니다.
  • XmlWebApplicationContext를 사용하여 XML 설정 파일 (/WEB-INF/spring/dispatcher-config.xml)을 로드합니다.
  • DispatcherServlet을 등록하고, URL 패턴을 /로 설정하여 모든 요청을 처리하도록 합니다.

즉, 위 코드만으로 web.xml 없이 서블릿을 구성할 수 있습니다.


2. AbstractDispatcherServletInitializer 활용

AbstractDispatcherServletInitializerWebApplicationInitializer추상 클래스 버전으로, 기본적인 서블릿 등록을 쉽게 할 수 있도록 도와줍니다.

✅ XML 설정을 사용할 경우 (AbstractDispatcherServletInitializer)

import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.context.WebApplicationContext;

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null;  // 루트 컨텍스트 없음
    }

    @Override
    protected WebApplicationContext createServletApplicationContext() {
        XmlWebApplicationContext cxt = new XmlWebApplicationContext();
        cxt.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
        return cxt;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

📌 설명

  • AbstractDispatcherServletInitializer를 상속하면 기본적인 DispatcherServlet 설정이 간편해집니다.
  • createServletApplicationContext() 메서드에서 XML 설정 파일을 로드합니다.
  • getServletMappings()에서 서블릿이 처리할 URL 패턴을 /로 지정합니다.

3. Java 기반 Spring 설정을 사용할 경우

Java 설정을 사용할 경우, AbstractAnnotationConfigDispatcherServletInitializer를 활용하는 것이 좋습니다.

✅ Java 기반 설정 (AbstractAnnotationConfigDispatcherServletInitializer)

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;  // 루트 컨텍스트 없음
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { MyWebConfig.class };  // Java 설정 클래스
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

📌 설명

  • AbstractAnnotationConfigDispatcherServletInitializer를 사용하면 Java 설정을 쉽게 적용할 수 있습니다.
  • getServletConfigClasses()에서 Java 기반 설정 클래스(MyWebConfig)를 지정합니다.
  • XML이 아닌 Java 클래스를 설정 파일처럼 사용할 수 있습니다.

4. 필터(Filter) 자동 등록

Spring에서는 AbstractDispatcherServletInitializer를 사용하면 필터를 자동으로 DispatcherServlet에 매핑할 수 있습니다.

✅ 예제: HiddenHttpMethodFilter 및 CharacterEncodingFilter 추가

import javax.servlet.Filter;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.HiddenHttpMethodFilter;

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] {
            new HiddenHttpMethodFilter(), new CharacterEncodingFilter() 
        };
    }
}

📌 설명

  • HiddenHttpMethodFilterPUT, DELETE 같은 HTTP 메서드를 _method 파라미터를 이용해 처리할 수 있도록 도와줍니다.
  • CharacterEncodingFilter는 요청과 응답의 문자 인코딩을 UTF-8로 설정하는 필터입니다.
  • getServletFilters()를 오버라이드하면 필터가 자동으로 DispatcherServlet에 매핑됩니다.

5. 비동기(Async) 지원

AbstractDispatcherServletInitializer에는 isAsyncSupported()라는 메서드가 있으며, 기본적으로 비동기 처리를 지원하도록 설정되어 있습니다.

➡ 즉, DispatcherServlet 및 매핑된 필터들은 기본적으로 비동기 지원이 활성화되어 있습니다.


6. DispatcherServlet을 직접 커스터마이징

추가적인 설정이 필요할 경우, createDispatcherServlet()을 오버라이드하여 직접 커스텀할 수도 있습니다.

import org.springframework.web.servlet.DispatcherServlet;

public class MyWebAppInitializer extends AbstractDispatcherServletInitializer {

    @Override
    protected DispatcherServlet createDispatcherServlet(WebApplicationContext servletAppContext) {
        DispatcherServlet dispatcherServlet = new DispatcherServlet(servletAppContext);
        dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); // 핸들러가 없을 경우 예외 발생
        return dispatcherServlet;
    }
}

📌 설명

  • createDispatcherServlet()을 오버라이드하면 DispatcherServlet을 직접 설정할 수 있습니다.
  • setThrowExceptionIfNoHandlerFound(true): 핸들러를 찾을 수 없을 경우 404가 아닌 예외를 발생시킵니다.

🚀 Summary

  • Spring MVC는 web.xml 없이도 서블릿 컨테이너를 프로그래밍 방식으로 설정할 수 있습니다.
  • WebApplicationInitializer를 구현하면 서블릿 컨테이너가 이를 감지하고 실행합니다.
  • AbstractDispatcherServletInitializerAbstractAnnotationConfigDispatcherServletInitializer를 사용하면 XML 또는 Java 기반 설정을 쉽게 적용할 수 있습니다.
  • getServletFilters()를 이용하면 필터를 자동으로 등록할 수 있습니다.
  • 비동기 처리(isAsyncSupported())는 기본적으로 활성화되어 있습니다.
  • createDispatcherServlet()을 오버라이드하면 DispatcherServlet의 동작을 세부적으로 조정할 수 있습니다.

즉, 서블릿 환경에서 Spring MVC를 설정하는 가장 추천하는 방법은 AbstractAnnotationConfigDispatcherServletInitializer를 이용하여 Java 기반으로 설정하는 것입니다! 🚀

 

출처 : https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet/container-config.html

'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글

Path Matching  (0) 2025.02.27
Processing  (0) 2025.02.27
Web MVC Config  (0) 2025.02.27
Special Bean Types  (0) 2025.02.27
Context Hierarchy  (0) 2025.02.27