inblog logo
|
LifeLog, DevLog
    Spring

    DispatcherServlet의 흐름

    프론트 컨트롤러 패턴, 어댑터 패턴 및 전체적 흐름에 관해
    KYJTHEYJ's avatar
    KYJTHEYJ
    Dec 24, 2025
    DispatcherServlet의 흐름
    Contents
    사전 지식DispatcherServlet

    사전 지식

    프론트 컨트롤러 패턴

    공통 기능이 포함되어 있는 각각의 컨트롤러
    프론트 컨트롤러 패턴을 통해 모든 요청을 하나의 컨트롤러로 받고 요청에 따라 컨트롤러 배분
    • 요청에 관한 공통 처리는 중앙제어

    • 개별적인 세부 요청사항들은 각각의 컨트롤러로 배분

    어댑터 패턴

    • 서로 다른 인터페이스를 가진 클래스들을 연결하는 패턴

    • 동일한 인터페이스를 갖도록 구성하면
      한 개의 인터페이스 타입으로 내부 처리를 전부 할 수 있다

    // DispatcherServlet 에서 사용하는 HandlerAdapter
    // HandlerAdapter 인터페이스 (공통 인터페이스)
    public interface HandlerAdapter {
        boolean supports(Object handler); // 처리 가능 여부 판단(boolean)
        
        ModelAndView handle( // 어떻게 처리할 것인지에 대한 로직
          HttpServletRequest request,
          HttpServletResponse response, 
          Object handler) throws Exception;
    }
    
    // Controller 구현 1 (HandlerAdapter를 implements)
    public class RequestMappingHandlerAdapter implements HandlerAdapter {
        @Override
        public boolean supports(Object handler) {
            return handler instanceof HandlerMethod;  // @RequestMapping 메서드인지 확인
        }
        
        @Override
        public ModelAndView handle(HttpServletRequest request, 
                                 HttpServletResponse response, 
                                 Object handler) {
            // @Controller 방식으로 처리
            return invokeHandlerMethod((HandlerMethod) handler, request, response);
        }
    }
    
    // Controller 구현 2 (HandlerAdapter를 implements)
    public class SimpleControllerHandlerAdapter implements HandlerAdapter {
        @Override
        public boolean supports(Object handler) {
            return handler instanceof Controller;
        }
        
        @Override
        public ModelAndView handle(HttpServletRequest request, 
                                 HttpServletResponse response, 
                                 Object handler) {
            // Controller 인터페이스 방식으로 처리
            return ((Controller) handler).handleRequest(request, response);
        }
    }

    DispatcherServlet

    클라이언트의 요청을 앞서 받는 프론트 컨트롤러

    • 디스패쳐 서블릿은 클라이언트의 요청을 전부 처리하고 있는데
      이게 어떻게 가능한가는 프론트 컨트롤러와 어댑터 패턴을 적절하게 사용 했기 때문

    • 우선 HTTP 요청을 프론트 컨트롤러 패턴을 통해 전부 공통적으로 받았고
      그 이후엔 HandlerMapping 를 통하여 URL 요청에 따라
      핸들러들을 찾는데, HandlerAdapter 인터페이스들을 통해
      핸들러들 구현하였기 때문에 이들을 이용하여 전부를 처리하고 있다

    Share article
    Contents
    사전 지식DispatcherServlet

    LifeLog, DevLog - https://github.com/KYJTHEYJ

    RSS·Powered by Inblog