DispatchServlet

이종찬·2023년 4월 20일
0

📖 DispatcherServlet?

Servlet은 HTTP를 통해 웹 클라이언트의 요청 수신 및 응답하는 역할을 담당합니다. DispatcherServlet은 SpringMVC의 핵심이며 Front Controller(서버로 오는 모든 요청을 받아 처리하는 컨트롤러)를 담당하고 있습니다.

클라이언트로부터 요청이 오는 경우 서블릿 컨테이너가 요청을 받습니다. 이러한 모든 요청을 DispatcherServlet이 가장 먼저 받게 되며 공통적인 작업을 마친 이후에 알맞은 컨트롤러에게 작업을 위임하는 구조입니다. 모든 요청 및 공통작업을 처리해주어 컨트롤러만 구현해주면 되기 때문에 편리합니다.

하지만 모든 요청을 전부 처리하기 때문에 이미지,HTML와 같은 정적 파일에 대한 요청을 처리하는 과정에서 정적자원을 불러오지 못하는 상황이 나올 수 있습니다. 이러한 문제는 요청을 처리할 컨트롤러를 먼저 탐색하고 없다면 리소스경로를 탐색하여 자원을 찾아내는 것으로 해결이 가능합니다. 또한 영역 분리로 인한 효율적인 리소스 관리 및 확장을 용이하게 하는 것도 기대할 수 있습니다.

✅ 역할

  1. 요청을 분석하여 경로, 파라미터, 헤더와 같은 정보 추출
  2. HandlerMapping을 통해 요청에 맞는 컨트롤러 탐색
  3. HandlerAdapter를 통해 컨트롤러의 메서드를 실행하고 ModelAndView객체를 받는다.
  4. ViewResolver를 통하여 ModelAndView객체에 담긴 뷰 이름을 실제 뷰 객체로 변환.
  5. 뷰 객체를 통해 응답 화면 생성 및 HttpServletResponse 객체에 담아 클라이언트에게 전송.

HandlerMapping

스프링 MVC에서 클라이언트의 요청을 처리할 컨트롤러를 찾아주는 인터페이스입니다. DispatcherServlet에서 해당 인터페이스를 통해 요청된 것을 처리할 수 있는 객체인 Handler를 찾아주는 역할을 담당하고 있습니다. SpringMVC에서 다양한 구현체를 제공하고 있으며 우선순위에 따라 적용되는 특징이 있습니다.

HandlerAdapter

DispatcherServlet이 핸들러를 실행할 수 있도록 할 수 있는 인터페이스입니다. 해당 인터페이스의 supports()메서드를 통해 탐색한 핸들러를 지원하는 어댑터를 찾고 handle()메서드를 통해 핸들러를 실행합니다. 이 과정을 통해 핸들러의 파라미터와 리턴값을 처리,예외,검증 등의 로직을 수행합니다.

ViewResolver

DispatcherServletViewResolver라는 Bean를 사용하여 컨트롤러가 ModelAndView 를 리턴한 것을 전달 받아 HttpServletResponse객체에 담을 수 있게 변환하는 역할을 담당하고 있습니다.

다양한 타입의 뷰를 지원하며 요청에 맞는 뷰를 찾아 모델 데이터와 함께 뷰에 전달합니다.

😮 동작 순서

참조 - https://mangkyu.tistory.com/18

  1. 요청을 DispatchServlet이 받습는다.
  2. HandlerMapping 인터페이스를 통해 요청을 처리할 수 있는 Handler를 찾습는다.
  3. 탐색한 핸들러를 실행할 수 있는 어댑터를 찾습니다.
  4. 핸들러를 실행하여 Controller에 위임하기 전에 거치는 과정을 실행합니다.
  5. 비즈니스 로직 처리
  6. 처리된 로직을 ResponseEntity로 반환합니다.
  7. 컨트롤러에서 반환한 ResponseEntity를 ModelAndView로 변환하여 DispatcherServlet에게 반환합니다.
  8. 최종적으로 DispatcherServlet에서 클라이언트에게 반환합니다. ModelAndView에서 Model인 경우 그대로 반환하지만 View인 경우 이름에 맞게 반환할 수 있게 해주는 ViewResolver를 통해 적절한 화면으로 적용할 수 있게 합니다.

✅ 요약

DispatcherServlet에서 모든 요청을 처리한다. 이러한 과정에서 HandlerMapping,HandlerAdapter를 통해 알맞은 Controller에 위임하여 처리한다. 반환값이 데이터인 경우 그대로 응답하지만 뷰인경우 ViewResolver를 통해 알맞게 반환할 수 있도록 한다.

profile
왜? 라는 질문이 사라질 때까지

0개의 댓글