본문 바로가기
Spring

[Spring] Dispatcher Servlet

by 가드 2022. 11. 13.
728x90

이전 글인 HttpReqeust부터 HttpResponse까지 동작 과정을 살펴보다 Spring Framework에서 동작되는 과정도 정리할 필요성이 있어서 Dispatcher Servlet에 대한 내용도 기록해 보려고 한다.

 

Dispatcher Servlet

Servlet Request에 특정 Controller로 매핑하기 위해 Front Controller 패턴을 적용한 Servlet이다.

Front Controller 패턴은

dispatcher servlet

웹 애플리케이션에서 주로 사용되는 디자인 패턴으로 컨트롤러에서 중복으로 처리해야 하는 사항을 공통 기능을 한 곳에서 관리하는 입구 역할을 하는 컨트롤러의 개념이다.

다수의 Servlet이 아닌 하나의 Servlet으로 클라이언트로부터 요청을 받을 수 있고 Http 요청에 대한 공통 처리와 코드 재사용, 유연성을 높여 코드 중복화를 줄이며 한 곳에서 관리는 중앙 제어 방식을 통해 보안 강화 등 Tracking에 유리하다.

 

Dispatcher Servlet 동작

dispatcher servlet

1. Servlet Filter

Servlet Container에 의해 가장 먼저 실행되는 Filter이며 사용자 인증이나 로깅과 같은 웹 공통 관심사를 처리할 때 사용한다.

public class TestFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 서블릿 컨네이너가 필터 인스턴스 생성 후 초기화 단계
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 필터 로직 구현부
        
        // 처리 전
        chain.doFilter(request, response);
        // 처리 후
    }

    @Override
    public void destroy() {
        // 필터 인스턴스 종료 전에 호출되는 메소드
    }
}

2. Dispatcher Servlet

Dispatcher Servlet은 스프링 애플리케이션이 실행되면 자동으로 등록되고 Component Scaning을 통하여 @RequestMapping 어노테이션이 있는 핸들러 정보들을 전부 매핑해둔다.

Http Request가 들어오면 Servlet Filter를 거쳐 Dispatcher Servlet으로 들어오게 되는데 이때 매핑 정보를 가지고 있는 HandlerMapping에서 요청된 핸들러(Controller)를 조회하고 호출한다.

 

3. Interceptor

Controller 동작 여부에 따라 메소드가 호출되며 Controller 정보에 의한 공통 관심사를 처리하는 인터페이스이다.

public class TestInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // Controller 호출 전 (Handler Adapter 호출 전) - return true : 다음 단계, false : 종료
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // Controller 호출 후 (Handler Adapter 호출 후) - Controller Exception 발생 시 호출되지 않는다.
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // Http 요청 종료 후 - Controller Exception 상관없이 호출
    }
}

 

4. Controller

HttpRequest에 의한 데이터 구현체이며 로직에 의해 생성된 동적 데이터를 제공한다. (비즈니스 코드 로직은 Service Layer에서 처리)

 

Controller에서 무사히 동적 데이터가 생성되었으면 반대로

Controller -> Interceptor -> Dispatcher Servlet -> Servlet Filter -> WAS -> Web Server 마지막으로는 클라이언트까지 전달되는 과정이다.

300x250

댓글