2024. 10. 15. 05:27ㆍSpring Framework/Web on Servlet Stack
Default Servlet in Spring MVC
Spring MVC에서 Default Servlet은 정적 리소스(이미지, CSS, JavaScript 파일 등)를 처리하는 서블릿입니다. 일반적으로 서블릿 컨테이너(예: Tomcat, Jetty, WebLogic 등)가 /
경로로 요청된 정적 리소스를 처리하는 역할을 담당합니다. Spring MVC는 이러한 기본 서블릿을 그대로 사용하면서, DispatcherServlet이 애플리케이션의 모든 요청을 처리하도록 설정할 수 있습니다.
문제: DispatcherServlet과 정적 리소스 처리
Spring MVC에서 DispatcherServlet을 /
경로에 매핑하면, 이는 서블릿 컨테이너의 디폴트 서블릿이 처리해야 하는 정적 리소스 요청을 덮어쓸 수 있습니다. 즉, /
경로에 대한 모든 요청이 DispatcherServlet으로 처리되어 이미지, CSS, JS 파일과 같은 정적 파일이 제대로 서빙되지 않을 수 있습니다.
이를 해결하기 위해 Spring MVC는 DefaultServletHttpRequestHandler를 사용하여 정적 리소스를 서블릿 컨테이너의 디폴트 서블릿이 처리할 수 있도록 설정할 수 있습니다. 이 설정을 통해 Spring MVC는 동적 요청을 처리하고, 서블릿 컨테이너는 정적 리소스를 처리하게 됩니다.
DefaultServletHttpRequestHandler란?
DefaultServletHttpRequestHandler는 /**
경로에 대한 요청을 서블릿 컨테이너의 디폴트 서블릿으로 전달하는 역할을 합니다. 이를 통해 DispatcherServlet이 /
경로에 매핑되어 있는 경우에도, 정적 리소스 요청은 서블릿 컨테이너가 처리할 수 있게 합니다.
이 DefaultServletHttpRequestHandler는 최하위 우선순위로 설정되어야 하며, 다른 모든 URL 매핑 뒤에 배치됩니다. 이를 통해 Spring MVC가 처리하지 않는 요청만 디폴트 서블릿으로 전달됩니다.
DefaultServletHttpRequestHandler 설정 방법
다음은 디폴트 서블릿을 활성화하는 설정입니다:
1. 디폴트 서블릿 처리 활성화 - 자동 탐지
Spring MVC에서 디폴트 서블릿을 활성화하는 가장 간단한 방법은 DefaultServletHandlerConfigurer를 사용하여 configureDefaultServletHandling()
메서드를 오버라이드하고 enable()
메서드를 호출하는 것입니다. 이 설정을 통해 Spring MVC는 서블릿 컨테이너의 디폴트 서블릿을 자동으로 탐지하고, 정적 리소스를 처리하도록 합니다.
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable(); // 디폴트 서블릿 핸들링 활성화
}
}
설명:
configureDefaultServletHandling()
: 이 메서드는 DefaultServletHttpRequestHandler를 활성화하여 정적 리소스 요청을 서블릿 컨테이너의 디폴트 서블릿으로 전달할 수 있도록 합니다.configurer.enable()
: 이 호출은 Spring이 서블릿 컨테이너의 디폴트 서블릿을 자동으로 탐지하여 정적 리소스 요청을 처리하도록 설정합니다. 대부분의 주요 서블릿 컨테이너(Tomcat, Jetty, GlassFish 등)는 이 방식으로 잘 동작합니다.
2. 디폴트 서블릿 이름을 명시적으로 설정
만약 서블릿 컨테이너에서 디폴트 서블릿의 이름이 변경되었거나, Spring이 자동으로 서블릿 이름을 탐지할 수 없는 경우에는 디폴트 서블릿의 이름을 명시적으로 설정해야 합니다.
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable("myCustomDefaultServlet"); // 커스텀 서블릿 이름 설정
}
}
설명:
configurer.enable("myCustomDefaultServlet")
: 디폴트 서블릿의 이름이 "myCustomDefaultServlet"일 경우, Spring은 이 서블릿으로 정적 리소스 요청을 전달합니다. 만약 서블릿 컨테이너의 디폴트 서블릿 이름이 다르다면, 그 이름을 명시해야 합니다.
정적 리소스 처리 흐름
Spring MVC는 다음과 같은 방식으로 정적 리소스를 처리합니다:
- 클라이언트가
/resources/image.png
와 같은 정적 파일 요청을 보냅니다. - DispatcherServlet이 해당 경로를 확인합니다.
- 해당 경로가 동적 요청으로 처리되지 않는 경우, DefaultServletHttpRequestHandler가 동작하여 요청을 서블릿 컨테이너의 디폴트 서블릿으로 전달합니다.
- 서블릿 컨테이너의 디폴트 서블릿이 정적 리소스를 처리하고, 클라이언트에게 응답을 반환합니다.
정리
- DefaultServletHttpRequestHandler를 사용하면, Spring MVC에서 DispatcherServlet이 모든 경로를 처리하면서도 정적 리소스 요청을 서블릿 컨테이너가 처리할 수 있게 할 수 있습니다.
- Spring MVC는 Tomcat, Jetty, GlassFish와 같은 주요 서블릿 컨테이너의 기본 서블릿 이름을 자동으로 탐지합니다. 하지만, 디폴트 서블릿의 이름이 변경된 경우에는 명시적으로 서블릿 이름을 설정해야 합니다.
- 이 설정은 주로
/
경로에 DispatcherServlet을 매핑할 때 사용되며, 이를 통해 동적 웹 애플리케이션과 정적 리소스를 동시에 처리할 수 있습니다.
주의 사항
- HandlerMapping 우선순위: DefaultServletHttpRequestHandler는 모든 다른 URL 매핑 뒤에 마지막으로 동작해야 합니다. 이는 Spring MVC가 처리하지 않는 요청만 디폴트 서블릿으로 전달되도록 하기 위함입니다. 직접 HandlerMapping을 설정할 경우, DefaultServletHttpRequestHandler의 우선순위를
Integer.MAX_VALUE
보다 낮은 값으로 설정해야 합니다.
'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글
Advanced Java Config (0) | 2024.10.15 |
---|---|
Path Matching (0) | 2024.10.15 |
View Resolvers (0) | 2024.10.15 |
View Controllers (1) | 2024.10.15 |
Message Converters (0) | 2024.10.15 |