백엔드

디스패처 서블릿이란?

anyway03 2026. 2. 14. 11:16

디스패처 서블릿이란?

 

 

역할 :

 

요청 라우팅 - 사용자의 url요청을 보고 어떤 컨트롤러의 어떤 메서드를 호출해야 하는지 찾아간다.

 

데이터 바인딩 - http파라미터를 자바 객체로 변환하거나, json데이터를 객체로 매핑한다.(핸들러 어댑터)

 

뷰 렌더링 - 컨트롤러가 데이터(model)와 뷰 이름을 넘겨주면 디스패처서블릿이 뷰 리졸버를 호출해 렌더링해 준다.

 

중앙 집중식 관리 - 과거에는 모든 서블릿을 web.xml에 일일이 등록해야 했으나 이제는 디스패처 서블릿이 모든 요청을 받아 적절한 컨트롤러로 배분한다.

= 프론트 컨트롤러 패턴

 

 

구조적 위치

톰캣 : 웹 서버이자 서블릿 컨테이너. 필터 단계를 관리.

 

스프링 컨테이너 : bean들이 위치. 인터셉터 단계.

 

 

실행 순서

필터(서블릿)

public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
            throws IOException, ServletException {
        System.out.println(">>> [1. Filter] 톰캣 단계: 요청이 들어옴");
        
        // 다음 필터나 서블릿(디스패처 서블릿)으로 전달
        chain.doFilter(request, response);
        
        System.out.println(">>> [5. Filter] 톰캣 단계: 응답이 나감");
    }
}

인터셉터(스프링)

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println(">>> [2. Interceptor] 스프링 단계: 컨트롤러 호출 직전");
        // handler 파라미터를 통해 어떤 컨트롤러 메서드가 호출되는지도 알 수 있음
        return true; // true여야 컨트롤러로 진행됨
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println(">>> [4. Interceptor] 스프링 단계: 뷰 렌더링까지 완료됨");
    }
}
  1. 사용자 요청 → 톰캣이 받음
  2. Filter 실행 (톰캣 단계)
  3. DispatcherServlet 도착 (스프링의 입구)
  4. Interceptor 실행 (스프링 단계 시작)
  5. Controller 실행 (개발자가 짠 코드)
  6. Interceptor 종료
  7. DispatcherServlet이 응답 생성
  8. Filter 종료 (톰캣 단계 마무리)
  9. 최종 응답 → 사용자

이렇게 계층이 나뉘어 있기 때문에, 보안(Spring Security)이나 인코딩처럼 애플리케이션 전반에 걸친 공통 작업은 필터에서, 로그인 체크나 권한 제어처럼 스프링 기능이 필요한 작업은 인터셉터에서 처리하는 것이 정석

 

preHandle과 afterCompletion은 스프링 프레임워크의 HandlerInterceptor 인터페이스에 정의되어 있는 추상 메서드들이다.

 

HandlerInterceptor 인터페이스에는 총 3개의 메서드가 정의되어 있다.

각 메서드는 컨트롤러(핸들러)가 실행되는 시점을 기준으로 호출된다.


  1. preHandle()컨트롤러 호출 전에 실행
    • 반환 타입이 boolean
    • true를 리턴하면 다음 단계(다음 인터셉터나 컨트롤러)로 진행하고, false를 리턴하면 거기서 요청을 중단 (주로 로그인 체크 시 사용)
  2. postHandle()컨트롤러 호출 후, 뷰(View)가 렌더링되기 전에 실행
    • 컨트롤러가 작업한 결과물(ModelAndView)을 가공할 수 있음.
    • 최근처럼 REST API(@RestController)를 주로 사용하는 환경에서는 자주 쓰이지는 않는다.
  3. afterCompletion()모든 작업(뷰 렌더링 포함)이 끝난 후에 실행
    • 요청 처리 중에 사용한 리소스를 반환하거나, 실행 시간을 측정하여 로그를 남길 때 유용
    • 컨트롤러에서 예외가 발생하더라도 이 메서드는 반드시 호출됨

'백엔드' 카테고리의 다른 글

배포 연습 서버로 Ubuntu를 선택한 이유  (0) 2025.04.27
JPA vs MyBatis  (0) 2025.04.27