2025. 2. 27. 23:29ㆍSpring Framework/Web on Servlet Stack
Spring MVC를 서블릿(Servlet) 환경에서 설정하는 방법은 크게 두 가지입니다.
1️⃣ web.xml
을 이용한 XML 기반 설정
2️⃣ Java 코드로 서블릿 컨테이너를 직접 구성하는 방법
Spring에서는 web.xml
없이도 프로그램적으로 서블릿을 설정할 수 있는 기능을 제공합니다.
1. WebApplicationInitializer를 이용한 서블릿 설정
WebApplicationInitializer
는 Spring 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 활용
AbstractDispatcherServletInitializer
는 WebApplicationInitializer
의 추상 클래스 버전으로, 기본적인 서블릿 등록을 쉽게 할 수 있도록 도와줍니다.
✅ 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()
};
}
}
📌 설명
HiddenHttpMethodFilter
는PUT
,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
를 구현하면 서블릿 컨테이너가 이를 감지하고 실행합니다.AbstractDispatcherServletInitializer
와AbstractAnnotationConfigDispatcherServletInitializer
를 사용하면 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 |