새소식

반응형
Java/Spring

DispatcherServlet(디스패처 서블릿, Front Controller)

  • -
반응형

DispatcherServlet

DispatcherServlet 의 Dispatcher 는 "보내다" 라는 뜻을 가지고 있다. 이러한 뜻에 따라

DispatcherServlet 은 HTTP 프로토콜로 들어오는 모든 요청을 맨 앞쪽에서 받아 요청에 맞는

적절한 Controller 를 찾아 전달하는 Front Controller 라고 정의할 수 있다.

 

여기서 Front Controller 는 서블릿 컨테이너의 제일 앞쪽에서 모든 요청을 받아 처리하는

Controller 로써 MVC 구조에서 사용되는 디자인 패턴입니다.

 

위 이미지를 보면서 자세하게 설명을 하게 되면 클라이언트로부터 요청이 들어오게 되면

Tomcat 과 같은 서블릿 컨테이너가 요청을 받게 됩니다. 서블릿 컨테이너에서 Filter 를 통해

인증 및 인가 등 처리한 후 Dispatcher Servlet 이 모든 요청을 받는다.

 

 

Dispathcer Servlet 장점

Spring MVC 에서 DispatcherServlet 이 등장하기 전에는 모든 서블릿에 대한 정보와

서블릿에 대한 URL 매핑을 위해 web.xml 파일에 모드 등록해줘야 했다.

아래 이미지를 보면 <servlet></servlet> 태그를 통해 서블릿을 등록하고

<servlet-mapping></servlet-mapping> 태그를 통해 name 에 해당하는 서블릿의 URL 매핑작업을 한다.

해당 URL 로 요청이 들어올 경우 mapping 된 서블릿으로 요청 처리 작업을 진행한다.

 

 

위 이미지와 같이 모든 서블릿에 대한 정보와 Mapping 정보를 적어줘야 하는 불편함이 있다.

DispatcherServlet 은 해당 어플리케이션으로 들어오는 모든 요청을 핸들링하여

공통작업을 처리하면서 편리하게 이용할 수 있게 되었습니다.

 

DispatcherServlet 동작 원리

DispatcherServlet 은 모든 요청을 받아 적절한 Controller 를 찾아 클라이언트의 요청을 처리합니다.

DispatcherServlet 의 동작 원리 및 처리 과정을 보면 아래와 같습니다.

 

1. 클라이언트의 HTTP 요청이 들어온다.

 

2. 요청을 받은 DispatcherServlet 은 HandlerMapping 을 통해 적절한 Controller 를 찾는다.

 

* HandlerMapping

HandlerMapping 은 Spring 어플리케이션이 실행될 때 RequestMappingHandlerMapping 클래스를 통해

@Controller, @RequestMapping 어노테이션이 있는 곳의 URL(Handler)을 찾아

Mapping 시켜놓은게 HandlerMapping 이다.

 

HandlerMapping 은 HashMap<요청 정보, 처리할 대상> 으로 Handler 들을 관리하며,

요청이 오면 (Http Method, URI) 등을 사용해 요청 정보를 만들고, HashMap 에서 요청을

처리할 대상을 찾아 HandlerExecutionChain 으로 반환한다.

 

3. HandlerMapping 을 통해 직접적으로 Controller 에게 전달하는게 아닌 HandlerAdapter 를 통해

적절한 Controller 를 찾는다.

HandlerMapping 은 적절한 HandlerAdapter 를 통해 비즈니스 로직을 수행할 Controller 를 찾는다.

 

이때 HandlerAdapter 는 클라이언트로부터 들어온 요청정보 중 Controller 에게 전달할 데이터를

적절한 형식으로 파싱하여 전달한다.

HandlerAdpater 는 데이터를 HttpMessageConverter 클래스 타입의 구현체 중 알맞는 클래스 와

넘어온 Header 의 Content Type 을 비교하여 데이터를 파싱한다.

 

4. HandlerAdapter 는 적절한 Controller 에게 요청을 위임한다.

 

5. 전달받은 Controller 는 클라이언트의 요청에 맞게 비즈니스 로직을 통해 데이터를 처리하여

반환값을 Return 한다.

응답데이터가 필요한 경우 @RestControler 또는 @Controller 에 @ResponseBody 어노테이션을

사용하여 @ResponseEntity 를 반환하고, 응답 데이터를 보여주려면 String Return의 

View 이름을 반환할 수 있다.

 

6. 반환받은 HandlerAdapter 는 DispatcherServlet 에게 반환한다.

반환값이 ResponseEntity 일 경우 HttpEntityMethodProcessor 가 MessageConverter 를 사용해

응답 객체를 적절하게 직렬화하고 응답 상태(Http Status)를 설정한다.

또한 반환값이 View 이름일 경우 ViewResolver 를 통해 적절한 View 를 찾아 Rendering 한 후

반환한다.

 

7. 응답값을 클라이언트에게 데이터 또는 View 를 통해 적절한 화면을 보여준다.

 

 

상세요약

 

1. Dispatcher Servlet(Front Controller) 클래스가 클라이언트의 요청을 받는다.

 

2. getHandler() 메서드를 통해 HandlerMapping 리스트 중 요청에 맞는 Handler 를 가져온다.

HandlerMapping 이란?
@Controller 의 @RequestMapping 이 존재하는 모든 URL 값을 HashMap<요청정보, 처리할 대상> 으로
Handler 를 만들어 매핑 시켜놓은 값이다.
각각의 @RequestMapping 값들이 Handler 가 되며, 이러한 Handler 를 매핑 시켜놓은게 Handler Mapping 이다.

 

3. Handler 를 찾아 로직을 실행시킬 HandlerAdapter 를 찾기 위해 getHandlerAdapter() 메서드를 호출한다.

 

4. HandlerAdapter 는 handler() 메서드를 호출하여 Controller 의 요청 처리를 수행한다.

 

5. 반환된 ModelAndView 객체를 받는다.

반환된 ModelAndView 객체에서 Controller 의 View Name 을 applyDefaultViewName() 메서드를 통해

설정한다.

 

6~8. processDispatcherResult(), render() 메서드를 호출하여 View 객체 생성 후 HTML 반환한다.

 

processDispatcherResult() 메서드에서 render() 메서드를 호출한다.

ViewResolver 의 resolverViewName() 메서드를 호출하여 Handler(Controller) 객체에서

반환된 View 이름에 해당하는 View Object 를 가져온다.

 

View 객체를 설정 후 View 객체의 render() 메서드를 통해 HTML 을 반환한다.

 

 

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.