본문 바로가기
Spring

[Spring 핵심 알기 - 2] HandlerMapping란? HandlerMapping 분석(with. DispatherServlet)

by 디찌s 2024. 2. 22.
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
반응형

댓글