[Spring] 클라이언트 요청 시 동작과정

klmin·2024년 9월 15일
  1. 클라이언트 요청

  2. CoyoteAdapter 클래스

  • service 메서드 호출
  • req.setRequestThread() 메서드
    스레드연결

  • postParseSuccess = postParseRequest(req, request, res, response); 메서드
    세션 관련 정보 연결


  • AuthenticatorBase클래스
    invoke 메서드 호출
  1. AuthenticatorBase
  • 세션 기반 권한 세팅
  • StandardWrapperValve클래스
    invoke 메서드 호출
  1. StandardWrapperValve
  • invoke 메서드
  • ApplicationFilterFactory.createFilterChain 필터등록


  • ApplicationFilterChain클래스
    doFilter 실행
  1. ApplicationFilterChain
  • doFilter 메서드
  • internalDoFilter 메서드 실행
  • HttpServlet 클래스
    service 메서드 실행
  1. HttpServlet
  • service 메서드
  • FrameworkServlet 클래스
    service 메서드 실행
  1. FrameworkServlet
  • service 메서드
  • HttpServlet 클래스
    service 메서드 실행

7.HttpServlet

  • service 메서드
  • 요청 method에 따라 메서드 실행(doGet(), doPost() 등)
    FrameworkServlet 클래스
    doPost() 실행
  1. FrameworkServlet
  • doPost 메서드

  • processRequest 메서드 실행

  • DispatcherServlet 클래스
    doService 메서드 실행(DispatcherServlet 호출)

  1. DispatcherServlet
  • doService 메서드
  • doDispatcher() 메서드 실행
  • doDispatch 메서드
  • multipart 확인

  • handler 확인(컨트롤러 확인)

  • adapter 확인(컨트롤러를 실행할 adapter확인)

  • prehandle 확인 및 실행(인터셉터 prehandle)

  • adapter 에서 handler 실행
  • AbstractHandlerMethodAdapter 클래스 handle 실행(컨트롤러 실행)
  1. AbstractHandlerMethodAdapter
  • handle 메서드
  • RequestMappingHandlerAdapter 클래스
    handleInternal 메서드 실행
  1. RequestMappingHandlerAdapter
  • handleInternal메서드

  • invokeHandlerMethod 실행

1) 비동기, 동기 판별
2) argumentResolvers 세팅
3) returnValueHandlers 세팅
비동기 - wrapConcurrentResult 실행, 동기 - invokeAndHandle 실행


  • ServletInvocableHandlerMethod 클래스
    invokeAndHandle 메서드 실행
  1. ServletInvocableHandlerMethod 클래스
  • invokeHandle 메서드

InvocableHandlerMethod 클래스
invokeForRequest 메서드 실행

  1. InvocableHandlerMethod
  • invokeForRequest 메서드(argumentresolver와 returnvaluehandler를 찾아서 요청과 응답 처리)
  • getMethodArgumentValues 실행(supportsParameter가 true인지 판별해 유효한 파라미터 인지 확인)
  • HandlerMethodArgumentResolverComposite 클래스
    resolveArgument 메서드 실행
  1. HandlerMethodArgumentResolverComposite
  • resolveArgument 메서드
  • getArgumentResolver 호출(파라미터를 실제로 처리할 argumentresolve 반환 - supportsParameter 가 true인걸 찾음)
    만약 찾는다면 다음 요청에는 빠르게 사용할 수 있도록 cache map에 넣음
  • resolveArgument 메서드
    반환된 argumentResolve에서 요청 파라미터 처리를 수행.
  1. InvocableHandlerMethod 클래스
  • 요청 파라미터를 처리 한 후 반환된 Object[] args로 doInvoke 메서드로 비즈니스 로직 수행 후 return을 받는다
  • doInvoke 메서드
  • method.invoke 메서드
    실제 컨트롤러에 메서드를 수행한다.
    메서드 수행 후 Object returnValue 를 받아 invokeForRequest 메서드의 결과를 반환한다.
  1. ServletInvocableHandlerMethod
  • handleReturnValue 메서드실행
  1. HandlerMethodReturnValueHandlerComposite
  • handlerReturnvalue 메서드
  • selectHandler 메서드에서 반복하면서 supportsReturnType 가 true인 응답을 처리할 returnValueHandlers를 찾는다.
  • handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
    를 실행해 반환된 returnValueHandlers로 응답값을 처리한다.
  1. RequestMappingHandlerAdapter
  • 응답이 반환되었으면 비동기면 바로 return 하고 비동기 쓰레드에서 응답을하고 동기라면 getModelAndView메서드를 실행한다.
  • getModelAndView 메서드
    view나 redirectAttribute가 존재한다면 return 하고
    responseentity나 responsebody 사용이면 isRequestHandled는 true 이므로 return null이 된다.
  1. DispatcherServlet
  • doDispatch 메서드

  • applyDefaultViewName 메서드
    viewName 있으면 세팅

  • mappedHandler.applyPostHandle(processedRequest, response, mv); 메서드
    인터셉터 postHandle 실행

  • processDispatchResult 메서드 실행
    성공이나 예외에 관한 결과를 반환. 예외시processHandlerException 호출

  • processHandlerException 메서드
    오류가 발생했다면 handlerExceptionResolvers 를 찾아 호출

  • triggerAfterCompletion 메서드
    인터셉터 afterCompletion 실행

  • asyncManager.isConcurrentHandlingStarted(), multipartRequestParsed
    비동기 응답 및 멀티파트 리소스 정리작업

  • applyAfterConcurrentHandlingStarted
  • cleanupMultipart
  1. FrameworkServlet 클래스
  • publishRequestHandledEvent 메서드
  • publishEvent 실행
  1. CoyoteAdapter
  • response.finishResponse() 메서드
    클라이언트에 응답

  • clearRequestThread
    스레드 초기화
profile
웹 개발자

0개의 댓글