DispatcherServlet

과녁스·2022년 3월 23일
0

Spring

목록 보기
11/11
post-thumbnail

개요


스프링의 DispatcherServlet에 대한 내용을 학습하면서 정리해보았습니다.

개념


DispatcherServlet

DispatcherServlet은 가장 앞 단에서 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)라고 정의할 수 있습니다.

  1. 클라이언트로부터 어떠한 요청이 오면 Tomcat(톰캣)과 같은 서블릿 컨테이너가 요청을 받게 됩니다.
  2. 모든 요청을 먼저 프론트 컨트롤러인 DispatcherServlet이 받게 됩니다.
  3. DispatcherServlet은 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리해야 하는 세부 컨트롤러를 getBean()으로 가져며 컨트롤러에게 작업을 위임합니다.

예외가 발생하였을 때 일관된 방식으로 처리하는 것도 프론트 컨트롤러인 DispatcherServlet이 담당하고 있습니다.

여기서 Front Controller(프론트 컨트롤러)라는 용어가 사용되는데, Front Controller는 주로 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러로써, MVC 구조에서 함께 사용되는 디자인 패턴입니다.

장점

Spring MVC는 DispatcherServlet이 등장함에 따라서 web.xml의 역할을 상당히 축소시켰습니다.

과거에는 모든 서블릿을 URL 매핑을 위해 web.xml에 모두 등록해주어야 했지만, dispatcher-servlet이 해당 어플리케이션으로 들어오는 모든 요청을 핸들링해주고 공통 작업을 처리면서 상당히 편리하게 이용할 수 있게 되었습니다.

동작


DispatcherServlet은 적합한 컨트롤러와 메소드를 찾아 요청을 위임 합니다.

  1. 클라이언트의 요청을 디스패처 서블릿이 받음
  2. 요청 정보를 통해 요청을 위임할 핸들러(컨트롤러)를 찾음
  3. 요청을 컨트롤러로 위임 처리할 핸들러 어댑터를 찾음
  4. 핸들러 어댑터가 핸들러(컨트롤러)로 요청을 위임
  5. 비지니스 로직을 처리
  6. 컨트롤러가 ResponseEntity를 반환
  7. HandlerAdpater가 반환받은 ResponseEntity를 통해 Response 처리를 진행
  8. 서버의 응답을 클라이언트로 반환

DispatcherServlet은 어떤 컨트롤러를 해당 요청을 처리할 수 있는지 식별해야 합니다. DispatcherServlet은 모든 컨트롤러를 파싱하여 HashMap으로 (요청 정보, 요청을 처리할 대상)을 관리합니다. 여기서 요청을 처리할 대상은 요청을 처리할 컨트롤러와 요청에 매핑되는 메소드입니다.

요청이 들어오면 요청 정보 객체를 만들어 Map에서 요청을 처리하는 컨트롤러 및 메소드를 찾습니다.

그리고 DispatcherServlet에서 컨트롤러로 요청을 위임할 Adapter(RequestMappingHandlerAdapter)를 찾은 후에 해당 adapter를 통해 컨트롤러로 요청을 위임합니다.

이때 요청을 처리할 대상 정보에 컨트롤러의 메소드가 있으므로 Reflection으로 컨트롤러의 메소드를 호출합니다.

그리고 컨트롤러가 ResponseEntity를 반환하면 MessageConverter 등을 통해 응답 처리를 진행한 후에 결과를 클라이언트에게 반환합니다.

출처 및 참고🙏


profile
ㅎㅅㅎ

0개의 댓글