BackEnd/Spring

스프링 MVC 내부 동작 원리 (with. 핸들러 매핑, 어뎁터 매핑, Filter, Interceptor.. etc)

PgmJUN 2024. 7. 13. 17:01
이 글은 김영한님의 스프링 MVC 강의 영상을 참조하여 작성되었습니다.

 

 

 

Spring MVC 동작 과정 🍃



 

0. HTTP 요청 💭

Client로부터 요청이 들어오면 Front ControllerDispatcher Sevlet이 요청을 받는다.

 

Dispatcher Sevlet은 받은 요청을 처리할 수 있는 Handler 객체를 가져온다.

 

0번 과정에서 Dispatcher Servlet에 요청이 들어오기 직전이 Filter의 동작 시점이다.

Dispatcher Servlet 이후에 동작하는 ControllerAdvice는 이러한 동작 시점에 의해 Filter 측에서 발생하는 예외까진 잡지 못한다는 특징이 있다.

 

 

 

 


 

1. 핸들러 조회 💭

핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.

 

 

✅ RequestMappingHandlerMapping

SpringBoot를 사용하면 0순위@RequestMapping 애노테이션 기반 Handler를 찾아 반환한다.

URI에 입력된 Endpoint
@RequestMapping 애노테이션에 설정된 Endpoint를 비교하여
요청을 담당하는 Handler를 조회하는 것이다.

 

 

✅ BeanNameUrlHandlerMapping

0순위가 실패하면 1순위로는 요청한 URI와 일치하는 스프링 빈 이름의 Handler를 찾아 반환한다.

 

 


 

2. 핸들러 어댑터 조회 💭

핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.

 

✅ RequestMappingHandlerAdpater

SpringBoot를 사용하면 0순위로 @RequestMapping 애노테이션 기반 Handler의 Adapter를 찾아 반환한다.

 

✅ HttpRequestHandlerAdapter

HttpRequestHandler를 implements하여 구현한 Handler를 처리하는 일을 수행하며 1순위로 동작한다.

 

✅ SimpleControllerHandlerAdpater

Controller를 implements하여 구현한 Handler를 처리하는 일을 수행하며 2순위로 동작한다.

 

 


 

 

3. 핸들러 어댑터 실행 💭

핸들러 어댑터를 실행한다.

 

 


 

 

4. 핸들러 실행 💭

핸들러 어댑터가 실제 핸들러를 실행한다.

4번 과정 전/후 가 Intercepter의 동작 시점이다.

 

 


 

 

5. ModelAndView 반환 💭

HandlerAdapterHandler가 반환하는 정보를 ModelAndView 객체로 변환해서 반환한다.

 

 


 

6. viewResolver 호출 💭

5번 과정에서 얻은 ModelAndView 객체를 통해 view의 이름을 뷰 리졸버에 전달한다.

JSP의 경우 InternalResourceViewResolver가 자동 등록되고, 사용된다.

 

 


 

 

7. View 반환 💭

뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 view 객체를 반환한다.

 

 


 

 

8. 뷰 렌더링 💭

View Resolver를 통해 얻은 view 객체에 5번 과정에서 얻은 ModelAndViewModel을 파라미터로 넘겨주고 render() 메서드를 실행하여 페이지 렌더링을 수행한다.

 

 


 

 

9. 페이지 반환 💭

최종적으로 렌더링된 페이지를 Client에게 response한다.

 

 


 

 

마치며

Spring은 이미 대부분의 Handler Mapping과 Handler Adpater를 구현해 두었기 때문에 직접 구현할 일은 거의 없다.
하지만 동작원리를 충분히 이해하고 사용하는 것과 그렇지 못한 것은 큰 차이가 있다.
항상 돌아가게만 만들어 사용하지 말고 어느정도는 이해하고 사용하는 습관을 갖자