[Spring] Spring Web MVC Dispatcher Servlet

한호성·2022년 10월 18일
0

글의 목적

Spring Web MVC Dispathcer의 동작원리에 대해 설명하는 글입니다.
Spring Framework에서 @Controller ,@RestController 각각의 annotation을 붙여서 사용할 경우 어떻게 작동하는지에 대해서 설명합니다.

Dispatcher Servlet

Dispatcher Servlet 이란

Spring MVC 패턴에서 기본적으로 사용되는 Servlet으로, 클라이언트 요청이 있을 시, 가장 앞단에서 요청을 가로채어 Controller에 작업을 전다라고 비지니스 로직 처리 후 해당 결과를 클라이언트에게 전달하는 역할을 한다. (Front Controller)

Dispatcher Servlet 구조

부모 클래스의 HttpServlet을 상속받아 사용한다. 스프링 부트 구동시, DispatcherServlet을 서블릿으로 자동으로 등록하며, 모든 경로에 대해 Mapping 한다. (urlPatterns::"/")

아래의 그림과 같이 작동한다.

  1. servlet이 호출되면, HttpServlet이 제공하는 service() 메서드 호출,
  2. 스프링 MVC는 DispathcerServlet의 부모인 FrameworkServlet에서 Service()를 오버라이드 했다.
  3. FrameworkServlet.service()를 시작으로 여러 매소드가 실행되며, DispatcherServlet.doDispatch()가 호출된다. -> 적절한 controller를 찾아 매핑해주고 뷰 찾아 반환해 렌더링 해주는 메서드이다.

대략적인 흐름은 다음과 같다.

  1. Client는 URL 주소를 통해 Server에 요청을 한다.
  2. Client의 요청을 Dispathcer Servlet이 전달받아 Handler Mapping에게 Client 요청을 처리할 수 있는 Controller를 전달받는다.
    (요청받은 URL, HTTP Method, Return, Parameter 정보를 이용해서 적합한 Controller를 찾는 방식) 실제로 연결 시킬 Controller를 결정하는 것은 Dispathcer Servlet이고, Handler Mapping 은 컨트롤러에 대한 정보를 갖고 있는 인터페이스다.
    (만약, 적절한 컨트롤러를 찾지 못한다면, HandelrExceptionResolver)에 의해 예외처리 된다.
  3. Controller가 결정되면 Handler Adapter를 통해 요청을 Controller에 전달하고 로직을 처리한다.
  4. 처리된 결과 ModelAndView를 Dispathcer Servlet에게 전달
  5. Dispather servlet은 View Resolver를 통해 결과를 출력할 화면을 render 하고 그 결과를 Client에 응답한다.

@RestController annotation을 사용할 경우

Spring mvc 흐름

만약 @RestController Annotation을 사용할 경우 , 간단하게 흐름을 요약해보자면,
Client -> Dispatcher Servlet -> Handler Mapping(Handler Adapter) -> Controller -> ResponseBody(HttpMessageConverter) -> Client이다.

HttpMessageConverter

viewResolver 대신 HttpMessageConverter가(MappingJackson2HttpMessageConverter) 작동해서 객체를 JSON 형식으로 Return한다.

#cf)
Spring은 Client HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리한다.

Reference

https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html
https://mangkyu.tistory.com/m/49
https://nyximos.tistory.com/61
https://catsbi.oopy.io/441b4af6-e877-4dc5-9695-2983bbe22799#e64f58ba-c6cd-4697-b039-544e77541d03

profile
개발자 지망생입니다.

0개의 댓글