Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

forest_moon

Spring Web MVC의 Dispatcher Servlet의 동작 원리 본문

JAVA

Spring Web MVC의 Dispatcher Servlet의 동작 원리

rokga 2022. 12. 12. 22:18

검색을 통해 찾아본 내용을 정리하면서 기록하기.

DispatcherServlet 란?

디스패처 서블릿의 dispatch는 "보내다"라는 뜻을 가지고 있다.이러한 단어를 포함하는 디스패처 서블릿은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)라고 정의할 수 있다.

 

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

 

DispatcherServlet 흐름도

  1. 클라이언트의 요청을 DistpatcjerServler에 전달
  2. 요청한 url에 맞는 controller 검색하여 HandlerMapping에 전달
  3. HandlerMapping에서 해당 controller에 처리 요청
  4. controller에서 처리 결과를 HandlerAdapter에서 ModelAndView 객체로 변환하여 DispatcherServlet에 전달
  5. DispatcherServlet에서 전달받은 ModelAndView 객체를 이용하여 매핑되는 View를 검색
  6. viewResolver에서 처리 결과를 view에 전달
  7. 처리결과가 포함된 view를 DispatcherServlet에 전달
  8. DispatcherServlet에서 최종 응답 결과를 클라이언트에게 출력

 

Dispatcher-Servlet(디스패처 서블릿)의 장점

Spring MVC는 DispatcherServlet이 등장함에 따라 web.xml의 역할을 상당히 축소시켜주었습니다. 과거에는 모든 서블릿을 URL 매핑을 위해 web.xml에 모두 등록해주어야 했지만, dispatcher-servlet이 해당 어플리케이션으로 들어오는 모든 요청을 핸들링해주고 공통 작업을 처리면서 상당히 편리하게 이용할 수 있게 되었습니다. 우리는 컨트롤러를 구현해두기만 하면 디스패처 서블릿가 알아서 적합한 컨트롤러로 위임을 해주는 구조가 되었습니다.

 

정적 자원(Static Resources)의 처리

Dispatcher Servlet이 요청을 Controller로 넘겨주는 방식은 효율적으로 보입니다. 하지만 Dispatcher Servlet이 모든 요청을 처리하다보니 이미지나 HTML/CSS/JavaScript 등과 같은 정적 파일에 대한 요청마저 모두 가로채는 까닭에 정적자원(Static Resources)을 불러오지 못하는 상황도 발생하곤 했습니다. 이러한 문제를 해결하기 위해 개발자들은 2가지 방법을 고안했습니다.

  1. 정적 자원에 대한 요청과 애플리케이션에 대한 요청을 분리
  2. 애플리케이션에 대한 요청을 탐색하고 없으면 정적 자원에 대한 요청으로 처리

 

1. 정적 자원에 대한 요청과 애플리케이션에 대한 요청을 분리

 

이에 대한 해결책은 두가지가 있는데 첫번째는 클라이언트의 요청을 2가지로 분리하여 구분하는 것입니다.

  • /apps 의 URL로 접근하면 Dispatcher Servlet이 담당한다.
  • /resources 의 URL로 접근하면 Dispatcher Servlet이 컨트롤할 수 없으므로 담당하지 않는다.

이러한 방식은 괜찮지만 상당히 코드가 지저분해지며, 모든 요청에 대해서 저런 URL을 붙여주어야 하므로 직관적인 설계가 될 수 없습니다. 그래서 이러한 방법의 한계를 느끼고 다음의 방법으로 처리를 하게 되었습니다.

 

2. 애플리케이션에 대한 요청을 탐색하고 없으면 정적 자원에 대한 요청으로 처리

 

두번째 방법은 Dispatcher Servlet이 요청을 처리할 컨트롤러를 먼저 찾고, 요청에 대한 컨트롤러를 찾을 수 없는 경우에, 2차적으로 설정된 자원(Resource) 경로를 탐색하여 자원을 탐색하는 것입니다. 이렇게 영역을 분리하면 효율적인 리소스 관리를 지원할 뿐 아니라 추후에 확장을 용이하게 해준다는 장점이 있습니다.

 

 

 

 

자료출처:https://mangkyu.tistory.com/18

'JAVA' 카테고리의 다른 글

객체지향이란?  (0) 2023.02.06
가비지컬렉션(Garbage Collection)이란?  (0) 2023.02.01
ORM 이란?  (0) 2022.11.28
Spring Framework 란 ?  (0) 2022.10.30
JPA란?  (0) 2022.10.29