본 포스팅은
https://chanho0912.tistory.com/6
위 게시글의 내용을 전반적으로 이해하고 있다고 가정하고 작성하겠습니다.
Servlet이 웹 애플리케이션에서 작동하려면 web.xml이라는 파일이 필요하다. web.xml이라는 파일을 간략히 소개하자면, 특정 url과 해당 servlet에 대한 매핑 정보를 가지고 있어서, 어떠한 요청이 들어왔을 때 Servlet Container에서 해당 Servlet을 매핑시키는 데 사용되는 파일로 생각하면 된다.
매핑된 Servlet에서는 Parameter 정보를 받고, Service 로직을 수행한 뒤, 경우에 따라서 View를 만들어서 Client에게 반환해주는 일련의 과정을 거친다.
그렇다면 Spring에서는 어떠한 방식으로 Servlet을 사용할까?
Spring Web MVC pattern에서는 Servlet이라는 개념을 Dispatcher Servlet으로 이용하고 있다.
우선 앞선 포스팅에서 소개된 Tomcat이라는 Servlet Container를 Spring은 가지고 있다.
Spring은 모든 Request를 우선 Dispatcher Servlet으로 전달한다. 아까 web.xml에 url과 Servlet의 매핑정보가 담겨있다고 서술했는데, Spring framework의 경우 모든 request url에 대해 Dispatcher Servlet으로 1차적으로 매핑된다.
자 그러면 Dispatcher Servlet은 해당 Request에 맞는 Controller를 찾아준다. 이를 Handler Mapping이라고 하는데 Handler는 Controller와 유사한 개념으로 생각하면 된다.(실제로 Handler가 Controller를 포함하는 개념이다)
* 추가적으로 Handler Mapping에는 Controller를 매핑하는 몇가지 방법이 있는데, 이 중 우리가 흔히 사용하는 Annotation을 활용한 Mapping을 진행하는 DefaultAnnotationHandlerMapping이 주로 사용된다.
그다음 과정은 찾아낸 Controller로 request를 보낸다. 이 과정을 Handler Adapter가 진행하는데, Controller는 해당 로직을 처리한 결과(Model, View)를 다시 Dispatcher Servlet으로 전달해준다.
위 과정에서 실제 Html 파일과 같은 View를 전달해 주는 것이 아니라, View의 접근 위치와 같은 String type으로 View를 반환해준다.
그러면 그다음 과정인 View Resolver가 해당 View를 찾아서 반환해준다.
그러면 Dispatcher Servlet은 View Resolver에게 반환받은 View에 Controller에게 반환받은 Model을 포함해서 최종적으로 반환할 View를 생성한다.
이 최종적인 반환 값을 Client에게 전달해준다.
이를 그림으로 나타내 보면
Spring Web MVC에서 Dispatcher Servlet은 위와 같이 크게 네 개의 과정을 통해 동적인 웹 애플리케이션을 자바를 활용하여 MVC 패턴으로 구현할 수 있게 해 준다.
* Dispatcher Servlet의 장점
1. url마다 Servlet을 매핑하지 않아도 된다. 만약에 이전 포스트처럼 모든 Request에 대해 1:1로 Servlet을 생성해주게 되면, 그 과정 자체의 문제라기보다는 그 매핑 정보를 모두 web.xml 파일에 기록해야 한다. 그렇게 되면 설정 파일이 너무 복잡하고 커지는 문제가 발생한다. 물론 그 과정에서 매핑에 필요한 시간이 오래 걸릴 수도 있다.
하지만 Dispatcher Servlet을 사용하게 되면 모든 요청을 Dispatcher Servlet에서 관리하기 때문에 해당 문제에 대한 부담이 현저하게 줄어들게 된다.
2. 이것은 MVC 패턴의 장점과 연관이 있는데 만약에 View를 독립적으로 분리하지 않게 되면 Servlet에서 반환할 View까지 관리를 해주게 된다. 그렇게 되면 너무 복잡해지는 문제가 있지만, Dispatcher Servlet은 View를 강제로 분리하여 해당 로직을 수행하는 과정을 따로 두어 View 생성 과정을 더 용이하게 만들어 주었다.
여기까지 Spring MVC의 Dispatcher Servlet에 대해 다루어 보았다.
*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.
'Backend > Spring' 카테고리의 다른 글
[Spring] AOP란? (1) | 2021.06.23 |
---|---|
[Spring/SpringBoot] 코드로 확인하는 Dependency Injection (0) | 2021.06.22 |
[Spring] IOC 컨테이너와 Bean이란? (0) | 2021.06.16 |
[Spring] IOC(Inversion Of Control), DI(Dependency Injection)이란? (0) | 2021.06.16 |
[Spring/SpringBoot] IntelliJ 소개 및 Gradle 프로젝트 설정 (0) | 2021.06.12 |