• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Spring MVC 마스터하기 1
        2022년 04월 17일
        • starryeye
        • 작성자
        • 2022.04.17.:47
        반응형

        Spring MVC의 구조를 하나씩 뜯어보자

         

         

        0. DispatcherServlet 초기화

        - DispatcherServlet은 Client에서 요청이 오면 가장 먼저 대응하는 Front Controller이다.

        - 어떤 요청이 와도 무조건 적용되는 controller이다.(Front Controller)

        - 기존에 DispatcherServlet이 없던.. 서블릿 방식에서

        개발자들이 공통적으로 많이 코딩 해야했던 부분들을 상당수 공통화 하였다.

        - HttpServlet을 상속 받았다.

         

        DispatcherServlet의 initStrategies 메서드

        initStrategies는 서블릿 컨테이너가 시작되며 실행된다.

        - 여기서 눈여겨 볼 것은 initHandlerMappings와 initHandlerAdapters, initViewResolvers 이다.

         

        DispatcherServlet의 initHandlerMappings 메서드

        initHandlerMappings는 HandlerMapping.class타입의 빈으로 등록되어있는 모든 빈을 추가한다.

        - HandlerMapping의 구체클래스 RequestMappingHandlerMapping, BeanNameUrlHandlerMapping 등이 존재

        initHandlerAdapters는 HandlerAdpater.class타입으로 추가

        initViewResolvers는ViewResolver.class타입으로 추가

         

         

        1~2. DispatcherServlet의 Handler 및 Adapter 조회

        DispatcherServlet의 doDispatch 메서드

        DispatcherServlet의 doDispatch의 일부이다.

        (doService에서 호출되는 메서드로 HttpServlet의 Service 메서드에서 출발하여 호출 됨)

         

        <getHandler>

        getHandler메서드를 통해 요청에 매칭되는 Handler를 찾는다.

         

        DispatcherServlet의 getHandler 메서드

        초기화때 등록해 놓은 HandlerMapping 구현체 객체들을 순회하면서 각 객체의 getHandler를 호출하여 Handler찾기

        - 1순위 : RequestMappingHandlerMapping

        --> @Contoller, @RequestMapping을 가지고있는 class의 메서드 들에서 찾음

        //RequestMappingHandlerMapping는 메서드를 어떻게 가질까?

        //-> 빈 생성 단계인 afterPropertiesSet 메서드에서 호출되는 initHandlerMethods 부터 보면 된다.

        //RequestMappingHandlerMapping 추상객체인 AbstractHandlerMethodMapping 에서 일어남

         

        - 2순위 : BeanNameUrlHandlerMapping

        --> 스프링 빈의 이름으로 Handler(Controller)를 찾는다. (@Component(이름))

         

        - 3순위 : 더 많음.. (직접 찾아봐야함)

         

        <getHandlerAdapter>

        getHandlerAdapter 역시 동일하다. (HandlerAdpater 구현체 객체 순회)

        - surports 라는 메서드로 해당 파라미터로 넘겨준 Handler를 지원하는지 여부를 보고 Adapter를 찾는다.

        - 1순위 : RequestMappingHandlerAdapter

        --> HandlerMapping과 동일하게 에노테이션 기반의 컨트롤러인 @RequestMapping 에서 사용됨.

         

        - 2순위 : HttpRequestHandlerAdapter

        --> HttpRequestHandler "인터페이스"를 구현한 구현객체일 경우

         

        - 3순위 : SimpleControllerHandlerAdapter

        --> Controller "인터페이스"를 구현한 controller일 경우 사용됨

         

         

        3~5. 얻은 Handler Adapter 에서 handle 메서드를 호출

        어댑터 패턴을 사용하여, 다양한 형식의 컨트롤러를 Handler Adapter에서 실행 해준다.

        호출을 하면 DispatcherServlet에서는 ModelAndView 객체를 리턴 받는다.

        (자세한 내용은 2022.04.24 - [Spring] - Spring MVC 마스터하기 4 참조)

         

        6~8. viewResolver 호출, View 반환, Render(Model) 호출

        DispatcherServlet의 doDispatch 메서드

        applyDefaultViewName 메서드를 통하여 논리 뷰 이름을 ModelAndView 객체에 set 해준다.

        processDispatchResult 메서드에서 render 메서드 호출

         

        DispatcherServlet의 render 메서드

        resolveViewName 메서드 내부에서 초기화때 등록해 놓은 ViewResolver 구현체 객체들을 이용하여 View를 반환 받는다.

        반환받은 view에서 render 메서드를 호출하여 HTML 응답을 하도록 한다.

         

        <스프링 부트가 자동 등록하는 뷰 리졸버>

        BeanNameViewResolver

        -> 빈 이름으로 뷰를 찾아서 반환

        InternalResourceViewResolver

        -> JSP를 처리할 수 있는 뷰를 반환

        (thymeleaf 뷰 템플릿 사용시, ThymeleafViewResolver가 자동 등록됨)

         

         

        <@RequestMapping 참고>

        @RequestMapping 에노테이션 사용 시, 아래가 사용된다.

        HandlerMapping : RequestMappingHandlerMapping

        HandlerAdapter : RequestMappingHandlerAdapter

        반응형

        'Spring > MVC' 카테고리의 다른 글

        Spring MVC Redirect, PRG  (0) 2022.05.06
        Spring MVC 마스터하기 4  (0) 2022.04.24
        Spring MVC 마스터하기 3 (응답 부분)  (0) 2022.04.22
        Spring MVC 마스터하기 2 (요청 부분)  (0) 2022.04.19
        Servlet + JSP의 MVC 패턴에서 Spring MVC 로 발전하는 모습  (0) 2022.04.05
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바