Spring MVC (2) DispatcherServlet의 흐름

Minkyeong Kim·2021년 11월 28일
0

[boostcourse] Web-Backend

목록 보기
38/55

DispatcherServlet

  • 프론트 컨트롤러 (Front Controller)
  • 클라이언트의 모든 요청을 받은 후 이를 처리할 핸들러에게 넘기고, 핸들러가 처리한 결과를 받아 사용자에게 응답 결과를 보여줌
  • 여러 컴포넌트를 이용해 작업 처리

내부 동작 흐름

요청 선처리 작업

  • Locale 결정

    • 언어 등과 같은 기본 설정 정보를 받아와 Locale 결정
    • org.springframework.web.servlet.LocaleResolver
      • 지역 정보를 결정해주는 전략 오브젝트,
      • 디폴트인 AcceptHeaderLocalResolver는 HTTP 헤더의 정보를 보고 지역정보를 설정해줌
  • RequestContextHolder에 요청 저장

    • 요청받아 응답할때까지 스프링이 관리하는 객체 안에서 사용할 수 있도록 함
    • org.springframework.web.context.request.RequestContextHolder
      • 일반 빈에서 HttpServletRequest, HttpServletResponse, HttpSession 등을 사용할 수 있도록 함
      • 해당 객체를 일반 빈에서 사용하게 되면, Web에 종속적이 될 수 있음
  • Flashmap 복원

    • redirect로 값을 전달할 때 사용됨,
      URL의 복잡함을 지원하기 위해 값을 유지시킬 수 있도록 함
    • org.springframework.web.servlet.FlashMapManager
      • FlashMap 객체 조회(retrieve), 저장을 위한 인터페이스
      • RedirectAttributes의 addFlashAttribute메소드를 이용해 저장
      • 리다이렉트 후 조회하면 바로 정보 삭제
  • 멀티파트 요청
    파일 업로드 할 경우 사용됨

    • org.springframework.web.multipart.MultipartResolver
      • 멀티파트 파일 업로드를 처리하는 전략

요청 전달

  • org.springframework.web.servlet.HandlerMapping

    • 어떤 핸들러가 요청을 처리할지에 대한 정보 포함
    • 디폴트로 설정되는 있는 핸들러매핑: BeanNameHandlerMapping, DefaultAnnotationHandlerMapping
  • org.springframework.web.servlet.HandlerExecutionChain

    • 실제로 호출된 핸들러에 대한 참조 포함
    • 무엇이 실행되어야 될지 알고 있는 객체, 핸들러 실행전과 실행후에 수행될 HandlerInterceptor 참조
  • org.springframework.web.servlet.HandlerAdapter

    • 실제 핸들러를 실행하는 역할 담당
    • 선택된 핸들러를 실행하는 방법과 응답을 ModelAndView로 변화하는 방법 포함
    • 디폴트로 설정되어 있는 핸들러어댑터: HttpRequestHandlerAdapter, SimpleControllerHandlerAdapter, AnnotationMethodHanlderAdapter
    • @RequestMapping과 @Controller 애노테이션을 통해 정의되는 컨트롤러의 경우 DefaultAnnotationHandlerMapping에 의해 핸들러가 결정되고, 그에 대응되는 AnnotationMethodHandlerAdapter에 의해 호출이 일어남

요청 처리

  • 인터셉터: 특정 조건에 따라 한번 필터링하는 것

  • org.springframework.web.servlet.ModelAndView

    • Controller의 처리 결과를 보여줄 view와 view에서 사용할 값을 전달하는 클래스
  • org.springframework.web.servlet.RequestToViewNameTranslator

    • 컨트롤러에서 뷰 이름이나 뷰 오브젝트를 제공해주지 않았을 경우 URL과 같은 요청정보를 참고해서 자동으로 뷰 이름을 생성해주는 전략 오브젝트
    • 디폴트: DefaultRequestToViewNameTranslator

예외 처리

  • org.springframework.web.servlet.handlerexceptionresolver
    • 기본적으로 DispatcherServlet이 DefaultHandlerExceptionResolver를 등록함
    • 예외가 던져졌을 때 어떤 핸들러를 실행할 것인지에 대한 정보를 제공

뷰 렌더링

  • org.springframework.web.servlet.ViewResolver
    • 컨트롤러가 리턴한 뷰 이름을 참고해서 적절한 뷰 오브젝트를 찾아주는 로직을 가진 전략 오프젝트
    • 뷰의 종류에 따라 적절한 뷰 리졸버 추가 설정 가능
    • 해당 구현체를 찾지 못하면 ServletException 발생

요청 종료

0개의 댓글