Spring MVC life cycle
Filter
Web Application의 전역적인 로직을 담당한다.
전체적인 필터링 설정을 하는 곳이다.
DispatchServlet에 들어가기 전인 Web Application단에서 실행된다.
DispatchServlet (Controller 매핑)
*Dispatcher==”배치 담당자” ⇒ Request에 대해서 어느 컨트롤러로 매핑시킬것인지 배치하는 역할
*요청되는 모든 Request를 받아 처리해주는 서블릿HandlerMapping에게 Request에 대해 매핑할 Controller 검색을 요청한다.
HandlerMapping으로부터 Controller 정보를 반환받아 해당 Controller와 매핑시킨다.
HandlerMapping(알맞은 Controller 정보 제공)
DispatchServlet으로부터 검색을 요청받은 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 object, Exception ex)컨트롤러 진입 후 view가 랜더링 된 후에 실행되는 메소드입니다.
- 4) afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object h)비동기 요청 시 PostHandle과 afterCompletion이 수행되지 않고 afterConcurrentHandlingStarted가 수행됩니다.
Controller
Request와 매핑되는 곳
어떤 로직으로 처리할 것인지 결정하고 그에 맞는 Service를 호출한다.
Service
데이터 처리 및 가공을 위한 비지니스 로직을 수행한다.
Request에 대한 실질적인 로직을 수행하며 Spring MVC Request LifeCycle의 심장이라고 볼 수 있다.
Repository를 통해 DB에 접근하여 데이터의 CRUD를 처리한다.
Repository
DB에 접근하는 객체.
*DAO라고 부른다.
*Service에서 DB에 접근할 수 있게 하여 데이터의 CRUD를 도와준다.
ViewResolver
Controller에서 리턴한 View의 이름을 DispatchServlet으로부터 넘겨받고, 해당 View를 렌더링하고 DispatchServlet으로 리턴하고, DispatcherServlet에서는 해당 View화면을 Response한다.
만약 View없이 데이터만 전달하고 싶다면 ViewResolver가 필요없다. ⇒ rest api
Filter vs HandleInterceptor vs AOP
*Filter는 DispatchServlet으로 가기전에 필터링 로직을 수행하고 HandlerIntercepter는 Controller로 가기전에 로직을 끼워넣는것이다. 셋다 실행흐름중에 로직을 끼워넣는다는 측면에서 AOP에도 해당되는것 같아 보이나 셋은 실행시점이 다르다.
filter는 Application단, Interceptor는 spring Application단이고 AOP가 실행되기 전에 실행된다.
AOP는 SpringApplication단에서 실행되지만 Interceptor가 실행된 이후에 실행된다.
실행흐름
Filter → DispatcherServlet → HandleMapping → HandlerInterceptor → Controller → Service → Repository → ViewResolver
래퍼런스
https://velog.io/@damiano1027/Spring-Spring-MVC-Request-Lifecycle
'스프링 부트 REST API 개발일지' 카테고리의 다른 글
[Redis] 조회수를 캐시를 적용했지만 속도가 느린 문제 해결 (0) | 2022.05.27 |
---|---|
JWT (Json Web Token) (0) | 2022.04.05 |
[SpringBoot] DTO를 어떻게 관리해야할까? (0) | 2022.04.05 |
[고민] public repository에 application.properties(.yml)의 정보를 어떻게 관리해야할까? (0) | 2022.03.11 |