spring

Spring MVC구조 - 내부HTTP요청처리과정

기기디 2022. 5. 24. 00:41

개요

  • HTTP Request가 Spring에 들어왔을때 처리되는 과정과 순서를 정리한다.

순서

  • HTTP요청 → Filter(설정되어있는경우) → DispatcherServlet → HandlerMapping → Controller(service포함하는 비즈니스로직) → DispatcherServlet → HTTP응답
  1. 클라이언트에서 HTTP요청을 보낸다
  2. 필터가 설정되어 있는경우에만 서블릿 필터가 실행된다
  3. WAS에서 HTTP요청을 기반으로 HttpServletRequest, HttpServletResponse객체를 생성하여 DispatcherServlet에게 전달한다.
  4. DispatcherServlet은 HandlerMapping에게 요청을 처리할 Controller(Handler)를 찾도록 지시한다. HandlerMapping은 요청URL을 기반으로 Handler를 찾아서 반환한다.
  5. DispatcherServlet은 찾아낸 Handler를 실행하기 위하여 HandlerAdapter를 사용한다. HandlerAdapter는 Handler(Controller)를 실행시켜주고 설정되어있는 Interceptor를 실행시킨다.이 과정에서 Controler-Service단의 비즈니스 로직이 실행된다. Controller는 화면을 표시해줄 View와 Model에 데이터를 담아 반환한다.
  6. DispatcherServlet은 Controller에게 반환받은 View의 정보를 ViewResolver에게 전달하여 View객체를 얻는다. ViewResolver에게 view의 이름과 요청의 헤더정보를 전달해주면 사용자에게 보여줄 View를 찾아준다.
  7. DispatcherServlet은 View객체에 model객체의 데이터와 함께 화면표시해주도록 요청한다.
  8. View객체는 jsp나 thymeleaf와 같은것들을 호출하고 model객체에서 필요한 데이터를 가져와 화면표시를 처리한다. model객체가 null인 경우에는 View를 그대로 처리한다.
  9. DispatcherServlet은 View객체에서 받은 결과를 클라이언트에게 HTTP응답한다.

RestControllerAnnotation의 경우(View를 반환하지 않는경우)

  • Spring4.0부터 나왔다. 이전에는 @ResponseBody를 사용했다.
  • 응답과정에서 HTTP ResponseBody가 생성되는 방식이 다르다.
  • RestController를 쓰지 않을때는 Model객체를 만들어 데이터를 담고 View를 반환하고, RestController를 쓰는 경우 단순히 객체만을 JSON또는 XML형식으로 반환한다.
  • 모든 베소드가 뷰 대신 객체로 작성된다.
  • @Controller를 사용하더라도 ResponseBody를 사용해주면 JSON형태로 데이터를 반환할 수 있다.
  • 정리 : Dispatcher Servlet을 거치지 않고 HttpMessageConverter를 통해 JSON이나 XML형식으로 반환한다. 기존 ControllerAnnotation으로도 ResponseBodyAnnotation을 통하여 View없이 반환하는게 가능한데, RestControllerAnnotation은 ResponseBodyAnnotation이 포함되어있다. 응답과정에서 DispatcherServlet을 거치지 않고 Controller에서 HttpMessageConverter를 통해 바로 반환한다. MessageConverter는 DispatcherServlet에서 관리하지 않는다.

DispatcherServlet

  • HTTP프로토콜을 통해 들어오는 모든 요청을 중앙집중식으로 처리하는 프론트 컨트롤러의 역할을 한다. 공통작업을 처리해주고 이외 작업은 세부컨트롤러를 찾아 위임해준다.
  • HttpServlet을 상속하여 Servlet에 속한다.

Interceptor

  • Handler의 실행을 가로채어 조건에 맞는지 확인하여 boolean값을 반환한다. 기본적으로 false일 경우 Controller로 값을 건내지 않는다.
  • postHandle, AfterCompletion를 오버라이딩하여 interceptor실행후 추가적인 공통처리가 가능하다.
  • 인터셉터를 사용함으로써 코드의 중복을 제거하거나 Controller까지 가지않고 요청을 처리하는것이 가능하다.

 

참조

https://dev-coco.tistory.com/84

https://devham76.github.io/spring/Spring-controllerRestController/

https://happygrammer.github.io/spring/mvc-restful/