Spring MVC Request Life Cycle - HandlerAdapter

출처 : https://all-record.tistory.com/164

목차

HandlerAdapter 살펴보기

HandlerAdapter 는 HandlerMapping 통해 찾은 Handler를 이용해 사용자 요청(Request)를 처리하는 역할을 한다.

public interface HandlerAdapter {

// supports 메소드를 통해 HandlerAdapter 가 인자로 받은 handler를 지원하는지 확인한다. 보통 Handler에는 HandlerAdapter를 갖는다.
boolean supports(Object handler);

// handler를 이용해 사용자 Request를 처리한다.
@Nullable
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

@Deprecated
long getLastModified(HttpServletRequest request, Object handler);
}

HandlerAdapter 구현체

  • AbstractHandlerMethodAdapter
  • RequestMappingHandlerAdapter

HandlerAdapter 지원 여부 확인하기

supports 메소드를 이용해 HandlerAdapter가 전달받은 Handler를 지원하는지 확인한다.

AbstractHandlerMethodAdapter.java

public final boolean supports(Object handler) {
return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
}

Handler를 이용해 Request(요청) 처리하기

HandlerAdapter 객체는 handle 메소드를 이용해 사용자 요청을 Handler 를 이용해 처리한 후 ModelAndView 객체를 반환한다.

AbstractHandlerMethodAdapter.java

@Override
@Nullable
public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return handleInternal(request, response, (HandlerMethod)handler);
}

RequestMappingHandlerAdapter.java

@Override
protected ModelAndView handleInternal(HttpServletRequest request,
HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {

ModelAndView mav;
checkRequest(request);

// Handler를 이용해 사용자 요청(Request)를 처리한 후 ModelAndView 객체를 반환 받는다.
if (this.synchronizeOnSession) {
HttpSession session = request.getSession(false);
if (session != null) {
Object mutex = WebUtils.getSessionMutex(session);
synchronized (mutex) {
mav = invokeHandlerMethod(request, response, handlerMethod);
}
}
else {
// No HttpSession available -> no mutex necessary
mav = invokeHandlerMethod(request, response, handlerMethod);
}
}
else {
// No synchronization on session demanded at all...
mav = invokeHandlerMethod(request, response, handlerMethod);
}

if (!response.containsHeader(HEADER_CACHE_CONTROL)) {
if (getSessionAttributesHandler(handlerMethod).hasSessionAttributes()) {
applyCacheSeconds(response, this.cacheSecondsForSessionAttributeHandlers);
}
else {
prepareResponse(response);
}
}

return mav;
}
Share