servlet은 url과 1:1로 매핑이 되게 되는데 이럴 경우 각 servlet의 공통 로직이 많아 질수록 중복되는 코드가 많아지게 된다. 이를 해결하고자 Front Controller 패턴이 탄생하게 되었다.
서버 최앞단에 클라이언트의 모든 요청을 받는 Controller(1개의 servlet과 같음)를 하나 만들어서 이곳에서 공통 로직을 수행하고 url 마다 수행해야할 핵심 비즈니스 로직을 찾아서 수행하게 하는 역할을 한다.
기능
- 클라이언트와 서버를 연결
- 각 요청에 맞는 controller를 매핑하여 정보를 보관
- 요청이 들어오면 매핑 정보를 찾아 해당 controller 호출
- 클라이언트에 전달할 응답 생성
- 응답 결과를 클라이언트에 반환
단점으로 Front Controller는 너무 많은 기능을 담당하게 된다.
Front Controller가 Dispatcher Servlet이 되었고 Handler Adapter를 통해서 다양한 종류의 Handler(우리가 흔히 알고있는 Controller)를 호출할 수 있는 기능을 추가하여 확장성 있는 개발이 가능하도록 하였다.
1. 클라이언트의 요청이 Dispatcher Servlet으로 전달
2. 해당 요청과 매핑되는 Handler가 있는지 확인
3. 매핑되는 Handler 정보 전달
4. 요청을 수행할 Handler 실행 권한 위임
5. 비즈니스 로직 수행
6. 로직 수행 결과 반환
7. ModelAndView 반환
8. 해당하는 View를 검색하여 반환
9. ViewResolver를 통해 찾은 View를 클라이언트로 반환
Servlet WebApplicationContext에는 웹 요청을 담당하는 객체들이 들어가서 관리되고, Root WebApplicationContext에는 웹 환경과 독립적인 Service, Repository 계층이 관리된다. 웹 요청시 필요한 부분들을 Dispatcher Servlet이 주입하는 구조로 작동된다. 즉, 개발자는 설정만 잘해주고 이를 등록하면 설정대로 생성된 객체가 spring 내부에서 관리되고, Dispatcher Servlet에 의하여 주입되고 사용된다. Spring Web MVC의 Dispatcher Servlet으로 인해서 개발자들은 비즈니스 로직에 집중할 수 있게 해준다.
https://velog.io/@hyunjong96/Sprin-Spring-MVC-DispatcherServlet
https://codingwell.tistory.com/42
https://www.youtube.com/watch?v=h0rX720VWCg&t=457s