본문 바로가기
JAVA/Spring

[JAVA / Spring] - Spring MVC Life Cycle

by nam_ji 2024. 4. 1.

Spring MVC Life Cycle

  • MVC Life Cycle 흐름도
    •  

 


Filter

  • Web Application의 전역적인 로직을 담당합니다.
  • 전체적인 필터링 설정을 하는 곳입니다.
  • DispatcherServlet에 들어가기 전인 Web Application단에서 실행됩니다.

DispatcherServlet (Controller Mapping)

  • Dispatcher == 배치 담당자 -> Request에 대해서 어느 컨트롤러로 매칭시킬 것인지 배치하는 역할입니다.
  • 요청되는 모든 Request를 받아 처리해주는 ServletHandlerMapping에게 Request에 대해 매핑할 Controller 검색을 요청합니다.
  • HandlerMapping으로부터 Controller 정보를 반환받아 해당 Controller와 매핑시킵니다.

HandlerMapping (알맞은 Controller 정보 제공)

  • DispatcherServlet으로부터 검색을 요청받은 Controller를 찾아 정보를 리턴해줍니다.

HandlerInterceptor

  • Request가 Controller에 매핑되기 전 앞단에서 부가적인 로직을 끼워넣습니다.
    주로 세션, 쿠키, 권한 진증 로직에 많이 사용됩니다.
    원하는 메서드를 수정하여 핸들링이 가능합니다.
    1. PreHandle (HttpServletRequest request, HttpServletResponse response, Object handler)
      • 컨트롤러에 진입하기 전에 실행됩니다. 반환 값이 true일 경우 컨트롤러로 진입하고 false일 경우 진입하지 않습니다. Object handler는 진입하려는 컨트롤러의 클래스 객체가 담겨 있습니다.
    2. PostHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
      • 컨트롤러 진입 후 View가 랜더링 되기 전에 수행됩니다.
    3. afterComplete (HttpServletRequest request, HttpServletResponse response, Object h)
      • 컨트롤러 진입 후 View가 랜더링 된 후에 실행되는 메서드입니다.
    4. afterConcurrentHandlingStarted (HttpServletRequest request, HttpServletResponse response, Object h)
      • 비동기 요청 시 PostHandle과 afterCompletion이 수행되지 않고 afterConcurrentHandlingStarted가 수행됩니다.

Controller

  • Request와 매핑되는 곳입니다.
  • 어떤 로직으로 처리할 것인지 결정하고 그에 맞는 Service를 호출합니다.

Service

  • 데이터 처리 및 가공을 위한 비즈니스 로직을 수행합니다.
  • Request에 대한 실질적인 로직을 수행하며 Spring MVC Request Life Cycle의 심장이라고 볼 수 있습니다.
  • Repository를 통해 DB에 접근하여 데이터의 CRUD를 처리합니다.

Repository

  • DB에 접근하는 객체
  • DAO라고 부릅니다.
  • Service에서 DB에 접근할 수 있게 하여 데이터의 CRUD를 도와줍니다.

ViewResolver

  • Controller에서 리턴한 View의 이름을 DispatcherServlet으로부터 넘겨받고, 해당 View를 랜더링하고 DispatcherServlet으로 리턴하고, DispatcherServlet에서는 해당 View 화면을 Response합니다.
  • 만약 View 없이 데이터만 전달하고 싶다면 ViewResolver가 필요없습니다. -> restAPI

Filter vs HandlerInterceptor vs AOP

  • Filter는 DispatcherServlet으로 가기 전에 필터링 로직을 수행하고 HandlerInterceptor는 Controller로 가기 전에 로직을 끼워넣는 것입니다. 셋 다 실행흐름 중에 로직을 끼워넣는다는 측면에서 AOP에도 해당되는 것 같아 보이나 셋은 실행시점이 다릅니다.
    • Filter는 Application단, Interceptor는 Spring Application단이고 AOP가 실행되기 전에 실행됩니다.
    • AOP는 Spring Application 단에서 실행되지만 Interceptor가 실행된 이후에 실행됩니다.

실행흐름

  • Filter -> DispatcherServlet -> HandlerMapping -> HandlerInterceptor -> Controller -> Service -> Repository -> ViewResolver