본문 바로가기
Spring Framework

디폴트 서블릿(Default Servlet)

by xogns93 2024. 10. 15.

디폴트 서블릿(Default Servlet)은 웹 서버에서 정적 자원(예: 이미지, CSS 파일, JavaScript 파일 등)을 처리하는 데 사용되는 서블릿입니다. 일반적으로 정적 파일들은 서블릿이 아닌 서블릿 컨테이너(예: 톰캣)에서 직접 제공되며, 서블릿 요청은 애플리케이션의 비즈니스 로직에 해당하는 요청을 처리합니다. 디폴트 서블릿은 이러한 정적 자원 요청을 처리하기 위한 기본적인 역할을 합니다.

서블릿과 디폴트 서블릿의 관계

서블릿은 자바 웹 애플리케이션에서 동적인 요청을 처리하기 위해 사용되며, JSP나 컨트롤러와 같은 동적인 웹 페이지 생성에 주로 사용됩니다. 하지만 웹 애플리케이션에는 정적인 리소스(예: 이미지, HTML, CSS, JavaScript 파일 등)도 포함됩니다. 이 정적인 리소스는 서블릿에서 처리되지 않고, 디폴트 서블릿에서 처리됩니다.

따라서 디폴트 서블릿은:

  • 애플리케이션에서 별도로 처리하지 않은 정적 파일 요청을 처리합니다.
  • 동적 요청(비즈니스 로직 처리)은 다른 서블릿이 처리하고, 그 외의 정적 파일 요청은 디폴트 서블릿이 처리합니다.

기본 동작 방식

웹 애플리케이션이 실행되면, 서블릿 컨테이너(예: Tomcat)는 정적 리소스(이미지, CSS, JS 등)를 처리하는 디폴트 서블릿을 등록합니다. 클라이언트가 요청한 URL이 정적 리소스에 해당할 경우, 이 요청을 디폴트 서블릿으로 전달해 처리합니다.

예를 들어:

  1. 클라이언트가 /images/logo.png 파일을 요청.
  2. Spring이나 Java 애플리케이션에서 이 경로와 매핑된 컨트롤러가 없으면, 요청은 디폴트 서블릿으로 전달.
  3. 디폴트 서블릿이 /images/logo.png 파일을 클라이언트에게 반환.

Spring에서 디폴트 서블릿 설정

Spring에서는 정적 리소스를 처리할 때, 디폴트 서블릿을 설정하여 자동으로 처리할 수 있습니다. 이때 사용하는 방법은 WebMvcConfigurerconfigureDefaultServletHandling 메서드를 오버라이드하는 것입니다.

예시: 디폴트 서블릿 핸들러 활성화

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        // 디폴트 서블릿 핸들링 활성화
        configurer.enable();
    }
}

위 코드에서 configureDefaultServletHandling() 메서드를 통해 디폴트 서블릿 핸들러를 활성화하면, Spring이 처리하지 않는 요청을 디폴트 서블릿이 처리하게 됩니다. 즉, DispatcherServlet에서 매핑되지 않은 정적 리소스(이미지, CSS, JS 등)는 서블릿 컨테이너의 디폴트 서블릿으로 전달됩니다.

디폴트 서블릿의 역할 요약

  1. 정적 리소스 처리: 정적 리소스(HTML, CSS, JS 파일 등)에 대한 요청을 처리합니다. 이를 통해 정적 파일이 서블릿 컨테이너에서 제공됩니다.
  2. 매핑되지 않은 요청 처리: 애플리케이션에서 명시적으로 처리되지 않은 모든 요청을 처리합니다. 애플리케이션에서 처리해야 할 URL 패턴과 매칭되지 않는 경우, 요청을 디폴트 서블릿이 처리합니다.
  3. Spring과의 연동: Spring 애플리케이션에서는 configureDefaultServletHandling() 메서드를 사용하여 디폴트 서블릿 핸들링을 활성화할 수 있습니다. 이렇게 하면 정적 자원 파일을 Spring이 직접 처리하지 않고 서블릿 컨테이너가 처리하게 됩니다.

예시: 정적 파일 요청 흐름

  1. 클라이언트가 http://example.com/css/style.css와 같은 URL로 CSS 파일을 요청합니다.
  2. Spring의 DispatcherServlet은 이 요청이 동적인 처리가 필요한지 확인합니다.
    • 만약 요청이 동적인 처리를 요구하지 않으면(즉, 해당 경로에 매핑된 컨트롤러가 없다면), 요청을 디폴트 서블릿으로 전달합니다.
  3. 디폴트 서블릿/css/style.css 경로에 해당하는 파일을 찾아 클라이언트에게 전달합니다.

정적 리소스 처리 방식 비교

  • 디폴트 서블릿: 기본적으로 서블릿 컨테이너에서 정적 리소스를 처리합니다. Spring이 아닌 컨테이너(Tomcat, Jetty 등)에서 처리합니다.
  • Spring Resource Handlers: Spring에서 특정 정적 리소스 경로를 직접 처리하도록 설정할 수 있습니다. 예를 들어, Spring의 addResourceHandlers 메서드를 사용하여 정적 리소스 경로를 추가로 설정할 수 있습니다.

Spring의 정적 리소스 핸들러 설정 예시:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**")
            .addResourceLocations("/public-resources/");
}

이 코드는 /resources/ 경로에 요청이 들어올 때 /public-resources/ 디렉토리에서 해당 파일을 찾아 반환하는 설정입니다. 디폴트 서블릿과 유사하지만 Spring 자체에서 정적 파일을 처리하게 됩니다.

결론

디폴트 서블릿(Default Servlet)은 웹 애플리케이션에서 정적 리소스(이미지, CSS, JS 등)를 처리하기 위한 기본 서블릿입니다. Spring에서는 WebMvcConfigurerconfigureDefaultServletHandling 메서드를 통해 디폴트 서블릿 핸들링을 활성화할 수 있으며, 이를 통해 정적 자원을 Spring이 아닌 서블릿 컨테이너가 처리하도록 할 수 있습니다. Spring 애플리케이션에서는 동적인 처리와 정적인 리소스 처리를 구분해 효율적으로 처리하는 데 유용한 역할을 합니다.