Default Servlet

2024. 10. 15. 05:27Spring 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