Spring MVC Process
Spring 에게 Request 가 들어왔을때 Spring MVC 의 과정은 아래 이미지와 같다.
- DispatcherServlet :
Request 가 들어오면 해당 Request 를 처리하는 수문장 역할을 한다. 요청이 들어오면 Spring 이 만들어 놓은 DispatcherServlet.java 파일에 doDispatch 메서드가 실행된다.
- HandlerMapping :
Spring 은 HandlerMapping 을 List<HandlerMapping> 을 가지고 있다가 이곳에서 요청이 들어온 URL 에 맞춰 HandlerMapping 을 찾는다.
Spring Boot 는 @Controller 클래스에서 @RequestMapping 을 통해 명시한 URL 에 맞춰 RequestMappingInfo 인스턴스를 만드는데 이를 HandlerMapping 에 넣어 놓는다고 생각하면된다. 추가적으로 이때 @RequestMapping 방식에 의한 방법은 RequestMappingHandlerMapping 를 이용하는 것이다.
다음과 같이 인스턴스 변수로 명시해 놓고 찾아 꺼내는 것을 볼 수 있다.
그런데 코드를 보면 Handler 를 리턴하지 않고 HandlerExcecutionChain 을 리턴하는데,
Spring 은 Handler 가 항상 Handler 객체와 Interceptor 를 포함하는 HandlerExecutionChain 인스턴스에 래핑되게 만들었다. DispatcherServlet은 먼저 각 HandlerInterceptor의 preHandle 메서드를 주어진 순서대로 호출하고 모든 preHandle 메서드가 true를 반환하면 마지막으로 핸들러 자체를 호출한다.
- HandlerAdaptor :
HandlerAdaptor 또한 List<HandlerAdaptor> 에서 찾아온다. @RequestMapping 을 사용했다면 HandlerAdaptor 를 구현한 RequestMappingHandlerAdpator 의 supports 메서드를 통해 지원하는 Handler 인지 확인후 handle 메서드를 통해 실제 실행될 것이라 기대하는 Controller 의 메서드를 실행하게 되는 구조이다.(실제로는 추상 클래스인 AbstractHandlerMethodAdaptor 가 supports 와 handle 메서드를 구현하였고, RequestMappingHandlerAdaptor 가 이를 상속받았다.)
추가적으로 우리가 JSON 데이터의 Convert를 해주지 않아도 Spring 에서는 @RequestBodey , @ResponseBody 가 있으면 자동으로 JSON 에서 Object 로 , 또는 Object 에서 JSON 으로 변환된다. 비밀은 HttpMessageConvertor 에 있다.
우선 handle 메서드가 실행하는 handleInternal 메서드를 살펴보면 invokeHandlerMethod 메서드를 실행하는 것을 볼 수 있다.
invokeHandlerMethod 메서드 에서는 ArgumentResolver 와 ReturnValueHandler 를 지정해 주는 코드가 들어있고, invokeAndHandle 를 호출해 사용하게 된다.
HandlerMethodArgumentResolver 를 구현한 HandlerMethodArgumentResolverComposite 는 MethodParameter 에 맞춰 HandlerMethodArgumentResolver 를 구현한 다른 형제 관계의 구현체를 찾고,
그 구현체의 resolveArgument 를 실행한다. Spring 은 다양한 HandlerMethodArgumentResolver 구현체를 제공하는데 그 중 RequestResponseBodyMethodProcessor 를 살펴보면 Converter 와 관련된 코드가 있는것을 확인 할 수 있다.
Filter & Interceptor
https://blog.naver.com/hooneats/222653624945
1. Spring Filter와 Interceptor의 차이에 대해 설명하고, 사용 예시를 설명해주세요.
#Spring #Filter #Interceptor 1. Filter Filter 는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Di...
blog.naver.com