본문 바로가기

Project/Table_of_Organization_Management_System

Spring MVC Process

728x90

Spring 에게 Request 가 들어왔을때 Spring MVC 의 과정은 아래 이미지와 같다.

 

출처 : http://terasolunaorg.github.io/guideline/1.0.1.RELEASE/en/Overview/SpringMVCOverview.html#id2

  • DispatcherServlet : 
    Request 가 들어오면 해당 Request 를 처리하는 수문장 역할을 한다. 요청이 들어오면 Spring 이 만들어 놓은 DispatcherServlet.java 파일에 doDispatch 메서드가 실행된다.

 

  • HandlerMapping :
    Spring 은 HandlerMapping 을 List<HandlerMapping> 을 가지고 있다가 이곳에서 요청이 들어온 URL 에 맞춰 HandlerMapping 을 찾는다.
    Spring Boot 는 @Controller 클래스에서 @RequestMapping 을 통해 명시한 URL 에 맞춰 RequestMappingInfo 인스턴스를 만드는데 이를 HandlerMapping 에 넣어 놓는다고 생각하면된다. 추가적으로 이때 @RequestMapping 방식에 의한 방법은 RequestMappingHandlerMapping 를 이용하는 것이다.
    다음과 같이 인스턴스 변수로 명시해 놓고 찾아 꺼내는 것을 볼 수 있다. 

 

DispatcherServlet.java 에 인스턴스 변수로 선언된 handlerMappings
DispatcherServlet.java 의 doDispatch 메서드 일부
DispatcherServlet.java 의 getHandler 메서드

그런데 코드를 보면 Handler 를 리턴하지 않고 HandlerExcecutionChain 을 리턴하는데,
Spring 은 Handler 가 항상 Handler 객체와 Interceptor 를 포함하는 HandlerExecutionChain 인스턴스에 래핑되게 만들었다.  DispatcherServlet은 먼저 각 HandlerInterceptor의 preHandle 메서드를 주어진 순서대로 호출하고 모든 preHandle 메서드가 true를 반환하면 마지막으로 핸들러 자체를 호출한다.

 

 

HandlerExecutionChain.java 에 선언된 멤버 변수들

 

  • HandlerAdaptor :
    HandlerAdaptor 또한 List<HandlerAdaptor> 에서 찾아온다. @RequestMapping 을 사용했다면  HandlerAdaptor 를 구현한 RequestMappingHandlerAdpator 의 supports 메서드를 통해 지원하는 Handler 인지 확인후 handle 메서드를 통해 실제 실행될 것이라 기대하는 Controller 의 메서드를 실행하게 되는 구조이다.(실제로는 추상 클래스인 AbstractHandlerMethodAdaptor 가 supports 와 handle 메서드를 구현하였고, RequestMappingHandlerAdaptor 가 이를 상속받았다.) 

 

DispatcherServlet.java 에 인스턴스 변수로 선언된 handlerAdapters
DispatcherServlet.java 의 doDispatch 메서드 일부
DispatcherServlet.java 의 doDispatch 메서드 일부
DispatcherServlet.java 의 getHandlerAdaptor 메서드
HandlerAdaptor.java 의 메서드
RequestMappingHandlerAdaptor 클래스 다이어그램
AbstractHandlerMethodAdaptor.java 의 supports 메서드
AbstractHandlerMethodAdaptor.java handle 메서드


 

추가적으로 우리가 JSON 데이터의 Convert를 해주지 않아도 Spring 에서는 @RequestBodey , @ResponseBody 가 있으면 자동으로 JSON 에서 Object 로 , 또는 Object 에서 JSON 으로 변환된다. 비밀은 HttpMessageConvertor 에 있다.

 

인프런 김영한님 '스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술'

우선 handle 메서드가 실행하는 handleInternal 메서드를 살펴보면 invokeHandlerMethod 메서드를 실행하는 것을 볼 수 있다.

invokeHandlerMethod 메서드 에서는 ArgumentResolver 와 ReturnValueHandler 를 지정해 주는 코드가 들어있고, invokeAndHandle 를 호출해 사용하게 된다.

 

 

handleInternal 메서드
handleInternal 메서드 내부에서는 invokeHanlerMethod 를 실행하고 있다.
invokeHandlerMethod 메서드
invokeHandlerMethod 메서드 에서 사용하는 this.argumentResolvers

 

HandlerMethodArgumentResolver 를 구현한 HandlerMethodArgumentResolverComposite 는 MethodParameter 에 맞춰 HandlerMethodArgumentResolver 를 구현한 다른 형제 관계의 구현체를 찾고, 

그 구현체의 resolveArgument 를 실행한다. Spring 은 다양한 HandlerMethodArgumentResolver 구현체를 제공하는데 그 중 RequestResponseBodyMethodProcessor 를 살펴보면 Converter 와 관련된 코드가 있는것을 확인 할 수 있다.

HandlerMethodArgumentResolverComposite
HandlerMethodArgumentResolverComposite 의 resolveArgument 메서드로 MethodParameter 로 다른 HandlerMethodArgumentResolver 구현체를 찾아 resolveArgument 를 실행
RequestResponseBodyMethodProcessor 로 AbstractMessageConverterMethodProcessor 를 상속받고 있다.
RequestResponseBodyMethodProcessor 의 resolveArgument 메서드를 보면 converter 관련 코드가 존재한다.

 


Filter & Interceptor

https://blog.naver.com/hooneats/222653624945

 

1. Spring Filter와 Interceptor의 차이에 대해 설명하고, 사용 예시를 설명해주세요.

#Spring #Filter #Interceptor 1. Filter Filter 는 J2EE 표준 스펙 기능으로 디스패처 서블릿(Di...

blog.naver.com

 

 

 

 

참고 블로그 1

728x90