> For the complete documentation index, see [llms.txt](https://docs.sysout.co.kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.sysout.co.kr/web/back-end/what-is-spring-framework/spring-mvc-project/dispatcherservlet.md).

# DispatcherServlet

## DispatcherServlet이란

DispatcherServlet은 Spring의 모든 요청을 Spring 규약에 따라 분배 처리하는 코어 서블릿(Servlet)이다. Spring project 생성 시 자동으로 생성되도록 web.xml에 설정되어 있다.

## DispatcherServlet 등록

등록되어 있는 DispatcherServlet 코드는 다음과 같다.

<details>

<summary>web.xml</summary>

```markup
<!-- 생략 -->
<servlet>
	<servlet-name>appServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>	
<servlet-mapping>
	<servlet-name>appServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 생략 -->
```

</details>

* <mark style="color:blue;">`<servlet>`</mark> - 생성할 서블릿에 대한 정보를 등록하는 영역
  * <mark style="color:blue;">`<servlet-name>`</mark> - 설정 파일이 위치한 폴더 이름과 동일하게 작성하며, <mark style="color:blue;">`<servlet-mapping>`</mark>과 연결되도록 동일하게 작성&#x20;
  * <mark style="color:blue;">`<servlet-class>`</mark> - 생성할 서블릿의 경로(Path)를 작성
  * <mark style="color:blue;">`<init-param>`</mark> - 생성 시 전달할 옵션(인자) 설정
  * <mark style="color:blue;">`<load-on-startup>`</mark> - 실행 시 우선순위 설정
* <mark style="color:blue;">`<servlet-mapping>`</mark> - 생성할 서블릿이 처리할 주소를 등록하는 영역
  * <mark style="color:blue;">`<servlet-name>`</mark> - 설정 파일이 위치한 폴더 이름과 동일하게 작성하며, <mark style="color:blue;">`<servlet>`</mark>과 연결되도록 동일하게 작성
  * <mark style="color:blue;">`<url-pattern>`</mark> - 처리할 주소 패턴을 작성

설정 내용에 따르면 다음 정보를 알아낼 수 있다.

> DispatcherServlet은 appServlet 폴더에 있는 servlet-context.xml 파일을 기반으로 작동한다. 또한 설정으로 제외한 주소를 뺀 나머지(/)에 대한 요청을 처리한다. 실행 시 가장 높은 우선순위를 가진다.

## Spring Framework의 요청 처리 흐름

Spring Web Application은 다음과 같은 흐름으로 사용자의 요청을 처리한다.

![](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-Mc89SQPg0rXG9X6x2Qd%2F-Mc89c10i0DXI4iP4e6z%2Fspring-process.gif?alt=media\&token=c372f231-83c2-4e53-84e4-a09b4f19d9eb)

![사용자가 요청(request)를 보내면](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-Mc89SQPg0rXG9X6x2Qd%2F-Mc89l-5jMx-t1IPi59S%2Fimage.png?alt=media\&token=30889297-0319-4c8f-9315-b58cb88e3ce9)

![Spring의 핵심 처리기인 DispatcherServlet이 이를 수신한다(필터/인터셉터는 배제) ](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-Mc89SQPg0rXG9X6x2Qd%2F-Mc89rwattdQHsat5kpJ%2Fimage.png?alt=media\&token=66fb9fac-9662-4b32-ab05-68b463ab27d8)

![HandlerMapping을 통해 처리 가능 여부를 파악](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-Mc89SQPg0rXG9X6x2Qd%2F-Mc89xJeWYQ0LBMJrLyd%2Fimage.png?alt=media\&token=db0fbea2-3a13-4424-baac-053258f924cd)

HandlerMapping을 통해 처리 가능 여부를 파악하게 되며, 이 때 servlet-context.xml의 내용을 확인하게 된다.&#x20;

![](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-Mc89SQPg0rXG9X6x2Qd%2F-Mc8A5KCIXJJddoRV5JM%2Fimage.png?alt=media\&token=d3228afc-ca18-421b-ba07-5b82493bef04)

처리가 가능할 경우 처리할 수 있는 도구(Controller)의 정보를 받아오며, 없을 경우 404 오류가 발생한다.&#x20;

![](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-Mc89SQPg0rXG9X6x2Qd%2F-Mc8A8YgOKmscxaa16-I%2Fimage.png?alt=media\&token=4b8709f7-8544-4aa2-b2fd-de3bcc1d9f08)

HandlerMapping으로부터 얻은 도구(Controller)를 호출하여 핵심 업무(비즈니스 로직) 처리를 지시한다.&#x20;

![](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-Mc89SQPg0rXG9X6x2Qd%2F-Mc8ACWEpOuFiVzZUrE3%2Fimage.png?alt=media\&token=5f4d13b9-6736-4d81-b1fc-ce8ceeee69cc)

처리를 마치면 처리 도구(Controller)는 결과물을 보여주기 위한 페이지 정보를 반환한다.&#x20;

![](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-Mc89SQPg0rXG9X6x2Qd%2F-Mc8ALf-Lec4JWjFTzMB%2Fimage.png?alt=media\&token=63e0f3b5-b925-4165-b970-126749d28a9d)

ViewResolver를 불러 결과를 인쇄하도록 지시한다.&#x20;

![](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-Mc89SQPg0rXG9X6x2Qd%2F-Mc8AR2qcz7oaT6qgXrh%2Fimage.png?alt=media\&token=500c457f-56ed-4279-bef8-b4e12bd0b668)

완성된 결과물을 받고&#x20;

![](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-Mc89SQPg0rXG9X6x2Qd%2F-Mc8AS5NKwW8JLTJRjzr%2Fimage.png?alt=media\&token=e5854af1-18de-4bd4-8ab3-22992185aea9)

이를 사용자에게 전달하면 1회의 요청이 완료된다.&#x20;
