Default Servlet

2024. 10. 15. 05:27Spring 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는 다음과 같은 방식으로 정적 리소스를 처리합니다:

  1. 클라이언트가 /resources/image.png와 같은 정적 파일 요청을 보냅니다.
  2. DispatcherServlet이 해당 경로를 확인합니다.
  3. 해당 경로가 동적 요청으로 처리되지 않는 경우, DefaultServletHttpRequestHandler가 동작하여 요청을 서블릿 컨테이너의 디폴트 서블릿으로 전달합니다.
  4. 서블릿 컨테이너의 디폴트 서블릿이 정적 리소스를 처리하고, 클라이언트에게 응답을 반환합니다.

정리

  • 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