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
'Project > Table_of_Organization_Management_System' 카테고리의 다른 글
IntelliJ 의 편리한 기능 - 인레이 힌트 (0) | 2022.10.09 |
---|---|
IntelliJ 플러그인을 활용해 마지막 Git 커밋 사용자를 표시해보자 (0) | 2022.08.29 |
Error 처리를 해보자 (0) | 2022.07.08 |
Java - Code Convention 설정하기 (0) | 2022.07.05 |
Postman?"No", Http?"Yes" - IntelliJ의 .http를 사용해보자 (0) | 2022.06.17 |