DispatcherServlet ? 프론트 컨트롤러!
이해
10. Loading DispatcherServlet_POJO에서 FrontController는 DispatcherServlet에 의해 내부적으로 생성된다고 설명했습니다.
특히 FrontController를 이해하고 다음 장으로 넘어가도록 하겠습니다.
FrontController 공통 처리
기능이 더 복잡해짐에 따라 컨트롤러는 공통적으로 수행할 일이 더 많아졌습니다.
그냥 일반 함수를 메소드로 뽑아도 될 것 같지만, 결과적으로 항상 해당 메소드를 호출해야 하고, 실수로 호출하지 않으면 문제가 됩니다.
그리고 호출 자체는 불필요합니다.
위의 내용을 마지막으로 요약 함께 다루기 어려운 문제있습니다.
중복 문제를 해결하려면 컨트롤러가 호출되기 전에 컨트롤러의 공통 기능을 처리해야 합니다.
소위 게이트키퍼 역할을 하는 기능이 필요합니다.
어떻게 해결할 수 있습니까? 전면 컨트롤러 패턴을 도입하면 이 문제가 깔끔하게 해결됩니다.
전면 컨트롤러
전면 컨트롤러 도입 전
1. 문제
앞으로 중복됩니다.
request.getRequestDispatcher(“경로”); , dispatcher.forward(요청, 응답); 쓸 것이다.
각 컨트롤러에 대한 리디렉션 만들기
RequestDispatcher dispatcher = request.getRequestDispatcher("View 경로(JSP)");
dispatcher.forward(request, response);
2. 문제
각 컨트롤러에 대해 전달해야 하는 경로를 중복하여 작성해야 합니다.
그리고 JSP가 아닌 Thymeleaf와 같은 다른 뷰로 전환하더라도 전체 코드를 변경해야 합니다.
전달 경로는 각 컨트롤러에 대해 생성되어야 하며 이는 다른 보기 변경에 의해 변경될 때 비효율적입니다.
String viewPath = "/WEB-INF/views/new-form.jsp"; // 회원 등록
String viewPath1 = "/WEB-INF/views/save-result.jsp"; // 회원 저장
String viewPath2 = "/WEB-INF/views/save-result.jsp"; ...
3. 문제
테스트는 매우 어렵습니다.
HttpServlet 개체를 사용하여 테스트를 작성하기가 어렵습니다.
HttpServletRequest request, HttpServletResponse response
위의 코드는 사용되는 경우도 있고 사용되지 않는 경우도 있습니다.
그래서 HttpServletRequest
, HttpServletResponse
. 사용되는 테스트 케이스를 작성하는 것도 어렵습니다.
전면 컨트롤러 도입 후
- 요점은 FrontController가 일반 코드를 처리할 수 있다는 것입니다.
- FrontController에서만 Servlet을 사용하고 다른 컨트롤러에서는 사용할 필요가 없습니다.
이것이 Spring Web MVC의 핵심입니다.
그래서 Spring Web MVC의 DispatcherServlet은 FrontController 패턴으로 구현된다.
FrontController 패턴의 특징
- 프런트 컨트롤러 서블릿다음과 같이 접수된 고객 요청
- 프론트 컨트롤러는 요청과 일치하는 컨트롤러를 찾아서 호출합니다.
- 공통 처리 가능
- 전면 컨트롤러를 제외하고 나머지 컨트롤러는 서블릿을 사용할 필요가 없습니다.
Spring Web MVC의 핵심도 바로 거기에 있다 프론트 컨트롤러!
스프링 웹 MVCDispatcherServlet
이 FrontController 패턴으로 구현됨
Dispatcher서블릿
servlet-context.xml을 확인하면 DispatcherServlet이 FrontController 역할을 합니다.
DispatcherServlet 클래스 등록
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
DispatcherServlet의 역할
모든 요청이 한 곳에서 수신되고 필요한 요청이 처리된 후 요청은 적절한 프로세서로 라우팅됩니다.
해당 핸들러의 실행 결과를 HttpResponse 형태로 제공하는 역할을 한다.
다음 그림을 통해 DispatcherServlet의 역할을 자세히 살펴보겠습니다.
Servlet이 아닌 FrontController 역할을 하는 DispatcherServlet은 사용자의 모든 요청을 받아 여러 작업을 거쳐 컨트롤러에 역할을 위임합니다.
Spring은 유연하고 다양한 디자인을 위해 이 구조를 채택했으며 개발자는 DispatcherServlet에 첨부된 HandlerMapping 및 HandlerAdapter를 설정하여 On-Demand(web.xml) 작업 방법을 결정할 수 있습니다.
고객의 요청에 따른 실행 명령
- 핸들러 매핑 : 요청한 URL에 해당하는 컨트롤러를 찾거나 결정하는 역할
- 핸들러 어댑터 : 컨트롤러 메서드 호출의 결정된 역할
- 컨트롤러, 서비스, 리포지토리 : DB로부터 필요한 데이터를 Model Object(Object Binding)에 저장하고 View명을 결정하여 전달
- 리졸버 표시 : 사용할 뷰의 종류(jsp, html 등) 선택 또는 사용할 뷰를 선택하는 역할
위와 동일한 단계에 따라 사용자에게 회신합니다.
유연한 프로그래밍이 가능하도록 각 단계를 조정할 수 있는 것이 중요합니다.