ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring 핵심 알기 - 2] HandlerMapping란? HandlerMapping 분석(with. DispatherServlet)
    Spring/Spring Core 2024. 5. 23. 16:48
    728x90
    반응형

     

     

     



    Sring MVC 구성도

    시작에 앞서...

    위 구성도에서 보듯 DispatcherServlet이 중심에서 컨트롤 하는것을 볼수있다.

    DispathcServlet을 모른다면 아래에 링크를 타고 공부하고 오자

     

     

    2024.02.22 - [Spring] - [Spring 핵심 알기 - 1] DispatcherServlet 란? frontController 패턴 (with. 전자정부프레임워크 )

     

     

    DispatchServlet은 요청에 대한 내용들을 처리할수있도록 구성을 정의 해놓았는데,

     

    DispatcherServlet.properties를 검색하면 아래와같이 설정된 내용들이 나온다.

     

    # Default implementation classes for DispatcherServlet's strategy interfaces.
    # Used as fallback when no matching beans are found in the DispatcherServlet context.
    # Not meant to be customized by application developers.
    
    org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
    
    org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
    
    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
        org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
        org.springframework.web.servlet.function.support.RouterFunctionMapping
    
    org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
        org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
        org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,\
        org.springframework.web.servlet.function.support.HandlerFunctionAdapter
    
    
    org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
        org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
        org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
    
    org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
    
    org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
    
    org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

     

     

    우린 이중에서 오늘의 주제인 HandlerMapping에 대해 알아볼것이다.

     

     

     

    HandlerMapping 역할

     

    HandlerMapping 은 클라이언트에서 온 요청을 처리하기위해 어떤 핸들러(컨트롤러)를 가져와야 하는지에 대해 담당한다.

     

     

    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
    org.springframework.web.servlet.function.support.RouterFunctionMapping

     

     

    HandlerMapping은 BeanNameUrlHandlerMapping과 RequestMappingHandlerMapping 

    두 가 지가 설정되어 있다. (위 DispatcherServlet.properties를 보면된다.) 

     

    우리가 흔히 사용하는 어노테이션(@)을 사용한 맵핑 (@RequestMapping)은 ' RequestMappingHandlerMapping' 로 핸들러를 찾아준다(Controller)

     

    ' BeanNameUrlHandlerMapping' 맵핑은 bean으로 생성하여 url를 할당했을때 처리하도록 설정한다. 

    ' BeanNameUrlHandlerMapping' 이전에 사용하던 방식이라 여기서 이쯤만 언급하고 구글링해서 찾아보길 바란다.

     

    DIspatcherServlet -> HandlerMapping 여행기

     

    DispathcerServlet.java
    DispatcherServlet.java

     

    DispatcherServlet.java

     

    DIspatcherServlet은  List<HandlerMapping> 파라미터를 갖고있으며 , initHandlerMappings 메소드를 통해 HandlerMapping 정보를 초기화하고있다.

     

    주석을 확인해보면 HandlerMapping객체 없을경우엔, default로 BeanNameUrlHandlerMapping을 사용한다고 되어있다.

     

     

    DispatchServlet -> doDispatch -> getHandler

     

    해당 DodispatchServlet 클래스의 메소드중 doDispatch 메소드가 있고, 코드를 확인하면 getHandler로 맵핑된 핸들러(컨트롤러.메소드)를 가져오는것을 볼수있다.

     

    getHandler 메소드로 들어가보자

     

     

    해당 메소드를 확인해보면 초기에 생성된 hadnlerMapping 객체 중에서 request를 처리할수있는 handler(Controller.메소드)를 가져오고

    해당 핸들러를 return해 준다. (dispathcer서블렛에 구조를 상기시켜보면, handlerMapping에서 찾은 핸들러(컨트롤러.메소드)를 handlerAdapter에 위임하는것을 떠올리자) 저건 이제 handlerAdapter에 위임시켜 사용할것이다.

     

    실제로 간이 컨트롤러를 생성후에 요청후 getHandler 메소드 디버그를 찍어보면

    mapping 변수에는 ' RequestMappingHandlerMapping' 을 담고있고

    handler 변수에는 'TestController.메소드' 객체를 담고있는것을 볼수있다.

     

     

     

    `디버그 스크린샷 `

     

     

     

     

    이제 ' RequestMappingHandlerMapping '로 찾은 핸들러(컨트롤러.메소드)를 이용해서 adapter를 찾아 처리한다.

     

     

     

     

     

     

     

     

     

     

     

    728x90
    반응형
Designed by Tistory.