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에 매핑되기 전 앞단에서 부가적인 로직을 끼워넣습니다.
주로 세션, 쿠키, 권한 진증 로직에 많이 사용됩니다.
원하는 메서드를 수정하여 핸들링이 가능합니다.- PreHandle (HttpServletRequest request, HttpServletResponse response, Object handler)
- 컨트롤러에 진입하기 전에 실행됩니다. 반환 값이 true일 경우 컨트롤러로 진입하고 false일 경우 진입하지 않습니다. Object handler는 진입하려는 컨트롤러의 클래스 객체가 담겨 있습니다.
- PostHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
- 컨트롤러 진입 후 View가 랜더링 되기 전에 수행됩니다.
- afterComplete (HttpServletRequest request, HttpServletResponse response, Object h)
- 컨트롤러 진입 후 View가 랜더링 된 후에 실행되는 메서드입니다.
- afterConcurrentHandlingStarted (HttpServletRequest request, HttpServletResponse response, Object h)
- 비동기 요청 시 PostHandle과 afterCompletion이 수행되지 않고 afterConcurrentHandlingStarted가 수행됩니다.
- PreHandle (HttpServletRequest request, HttpServletResponse response, Object handler)
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
'JAVA > Spring' 카테고리의 다른 글
[Java / Spring] - Spring - SpringBoot thymeleaf 개념 및 사용법 (2) | 2024.09.27 |
---|---|
[Java / Spring] - Spring IoC / DI란 (1) | 2024.06.10 |
[JAVA / Spring] 스프링부트 실행 시 나타나는 배너를 바꿔보자 (0) | 2024.03.15 |
[JAVA / Spring] - Domain와 Entity의 차이 (0) | 2024.03.04 |
[JAVA / Spring] - Optional이란? (0) | 2024.02.15 |