2024. 10. 15. 05:27ㆍSpring Framework/Web on Servlet Stack
🌐 Spring MVC에서 Default Servlet 개념 정리
Spring MVC에서 Default Servlet 은 정적 리소스(이미지, CSS, JavaScript 파일 등) 를 처리하는 서블릿입니다. 일반적으로 서블릿 컨테이너(예: Tomcat, Jetty, WebLogic 등) 가 /
경로로 요청된 정적 리소스를 처리하는 역할을 담당합니다.
Spring MVC는 DispatcherServlet이 모든 요청을 처리하도록 설정 할 수 있지만, 이 경우 정적 리소스 요청이 정상적으로 처리되지 않을 가능성 이 있습니다. 이를 해결하기 위해 DefaultServletHttpRequestHandler 를 활용할 수 있습니다.
⚡ DispatcherServlet과 정적 리소스 처리 문제
📌 문제 상황
- DispatcherServlet을
/
경로에 매핑하면, 서블릿 컨테이너의 Default Servlet이 처리해야 할 정적 리소스 요청(이미지, CSS, JS 파일 등) 을 덮어쓸 수 있음 - 결과적으로 정적 파일이 정상적으로 서빙되지 않을 가능성 발생
📌 해결 방법
- DefaultServletHttpRequestHandler 를 사용하여 정적 리소스 요청을 서블릿 컨테이너의 Default Servlet으로 전달 하도록 설정
- 이를 통해 Spring MVC는 동적 요청을 처리 하고, 서블릿 컨테이너는 정적 리소스를 처리 하도록 분리 가능
🔄 DefaultServletHttpRequestHandler란?
DefaultServletHttpRequestHandler 는 /
경로에 매핑된 DispatcherServlet이 정적 리소스 요청을 가로채지 않도록 하며,
📌 /**
경로에 대한 요청을 서블릿 컨테이너의 Default Servlet으로 전달 하는 역할을 수행합니다.
✅ 주요 특징
- DispatcherServlet이
/
경로에 매핑된 경우에도 정적 리소스를 서블릿 컨테이너가 직접 처리하도록 설정 - 최하위 우선순위로 동작 하며, Spring MVC가 처리하지 않는 요청만 Default Servlet으로 전달
- 서블릿 컨테이너의 기본 서블릿 이름을 자동으로 탐지 하여 설정 가능
🛠 DefaultServletHttpRequestHandler 설정 방법
✅ 1. 디폴트 서블릿 처리 활성화 - 자동 탐지
가장 간단한 방법은 DefaultServletHandlerConfigurer 를 사용하여configureDefaultServletHandling()
메서드를 오버라이드하고 enable()
메서드를 호출하는 것입니다.
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable(); // 디폴트 서블릿 핸들링 활성화
}
}
📌 설명
configureDefaultServletHandling()
→ DefaultServletHttpRequestHandler 활성화configurer.enable();
→ 서블릿 컨테이너의 Default Servlet을 자동으로 탐지하여 정적 리소스를 처리하도록 설정- 대부분의 주요 서블릿 컨테이너(Tomcat, Jetty, GlassFish 등) 에서 정상적으로 동작
✅ 2. 디폴트 서블릿 이름을 명시적으로 설정
만약 서블릿 컨테이너에서 Default Servlet의 이름이 변경되었거나, Spring이 이를 자동으로 탐지할 수 없는 경우
명시적으로 서블릿 이름을 설정해야 합니다.
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable("myCustomDefaultServlet"); // 커스텀 서블릿 이름 설정
}
}
📌 설명
configurer.enable("myCustomDefaultServlet")
→ Default Servlet의 이름이myCustomDefaultServlet
일 경우,
해당 서블릿으로 정적 리소스 요청을 전달- 만약 서블릿 컨테이너의 Default Servlet 이름이 다르다면, 그 이름을 명시적으로 지정해야 함
🔄 정적 리소스 처리 흐름
Spring MVC에서 정적 리소스 요청 처리 방식 은 다음과 같습니다.
1️⃣ 클라이언트 가 /resources/image.png
와 같은 정적 파일 요청을 보냄
2️⃣ DispatcherServlet 이 해당 요청을 확인
3️⃣ 해당 요청이 동적 요청이 아닐 경우, DefaultServletHttpRequestHandler 가 동작
4️⃣ DefaultServletHttpRequestHandler 가 요청을 서블릿 컨테이너의 Default Servlet으로 전달
5️⃣ 서블릿 컨테이너의 Default Servlet 이 정적 리소스를 처리 하고 클라이언트에게 응답 반환
📌 정리 (Summary)
✅ DefaultServletHttpRequestHandler 를 사용하면,
- DispatcherServlet이 모든 경로를 처리하면서도 정적 리소스 요청을 서블릿 컨테이너가 처리할 수 있도록 설정 가능
✅ Spring MVC는 주요 서블릿 컨테이너(Tomcat, Jetty, GlassFish 등)의 기본 서블릿 이름을 자동으로 탐지
- 하지만, 디폴트 서블릿의 이름이 변경된 경우에는 명시적으로 서블릿 이름을 설정해야 함
✅ 이 설정은 /
경로에 DispatcherServlet을 매핑할 때 필수적
- 이를 통해 동적 요청과 정적 리소스를 동시에 처리할 수 있도록 함
⚠️ 주의 사항
📌 HandlerMapping 우선순위 설정 필요
DefaultServletHttpRequestHandler
는 모든 다른 URL 매핑 뒤에 마지막으로 동작해야 함- Spring MVC가 처리하지 않는 요청만 Default Servlet으로 전달하도록 하기 위함
- HandlerMapping을 직접 설정할 경우,
DefaultServletHttpRequestHandler
의 우선순위를Integer.MAX_VALUE
보다 낮게 설정해야 함
📌 DispatcherServlet의 매핑 경로 고려
/
경로에 DispatcherServlet을 매핑하면 정적 리소스가 가로채질 가능성이 있음/api/*
와 같이 특정 경로에 DispatcherServlet을 매핑하면 별도의 설정 없이 정적 리소스 처리가 가능
🎯 결론
📌 Spring MVC에서 DispatcherServlet이 모든 요청을 처리하면서도 정적 리소스를 정상적으로 서빙하기 위해 DefaultServletHttpRequestHandler를 활용하는 것이 필요함
📌 DefaultServletHttpRequestHandler를 활성화하면 서블릿 컨테이너의 기본 서블릿이 자동으로 정적 리소스를 처리하도록 설정 가능
📌 필요한 경우, Default Servlet의 이름을 명시적으로 설정하여 문제를 해결할 수 있음
🔌 이러한 설정을 통해 Spring MVC 애플리케이션에서 정적 및 동적 리소스를 효과적으로 처리할 수 있습니다. 🚀
'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 |