Spring MVC의 핵심! FrontController 패턴과 DispatcherServlet

2021. 4. 1. 16:57SPRING/SPRING MVC

DispatcherServlet이란?

  • Spring MVC에서 프론트 컨트롤러 패턴을 구현한 Servlet이다.

 

Front Controller란?

  • Front Controller가 없었던 시절에는 REST API를 구현할 때, 한 개의 URL에 한 개의 서블릿이 매핑되는 구조였다.
  • 이 구조는 매 서블릿을 구현할때마다 중복되는 소스가 발생하였다. 예를 들어 서블릿에서 처리한 결과를 JSP에 넘기기 위해, RequestDispatcher에 forward를 해주는 로직은 매번 필요한 작업이었다.
  • 또한, 컨트롤러의 테스트 코드를 작성할 때, 서블릿에 의존되어 순수한 자바 코드로 단위 테스트가 불가능했다.
  • 하지만 프론트 컨트롤러라는 서블릿이 컨트롤러 앞에 수문장 역할을 하면서 컨트롤러의 공통영역을 처리해주고 컨트롤러를 순수한 자바로 만들어 주었다.

 

프론트 컨트롤러 도입 전

 

프론트 컨트롤러 도입 후

 

1. 컨트롤러의 공통요소인 RequestDispatcher에 forward를 해주는 로직을 살펴보자

1
2
3
String viewPath = "/WEB-INF/views/save-result.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
cs
  • 이 코드는 컨트롤러가 특정 JSP에 모델을 넘겨주기 위해 필요한 코드로 컨트롤러마다 수행되어야 하는 작업이다. 이 코드를 각 컨트롤러가 수행하는게 아니라 컨트롤러가 viewPath의 viewName 문자열만 리턴하면 프론트 컨트롤러가 리턴받은 viewName으로 viewResolver에 알맞는 view를 찾는 로직을 위임하고 찾아진 view를 render하는 과정을 수행한다. 따라서 개발자는 매 번 컨트롤러 마다 저런 코드를 작성하지 않고 viewName만 리턴하면 되는 것이다.

2. 컨트롤러가 서블릿 의존성에서 벗어나도록 도와준다.

  • 프론트 컨트롤러가 없으면 모든 컨트롤러는 서블릿으로 구현되어야 했다. 프론트 컨트롤러가 서블릿으로서 모든 요청을 받고 이에 알맞는 컨트롤러를 찾아 호출해주는 역할을 함으로서 자연스럽게 컨트롤러는 서블릿으로 구현하지 않아도 된다.
  • 또한 프론트 컨트롤러는 호출하는 컨트롤러에 HttpServletRequest와 HttpServletResponse를 직접 넘기지 않고 Map과 Model 또는 ModelAndView를 직접 생성하여 컨트롤러에 넣어줌으로 인해서 컨트롤러가 서블릿에 의존하지 않도록 해준다.
  • 이렇게 프론트 컨트롤러 패턴을 구현하면 여러가지 장점을 가질 수 있고 Spring에서 프론트 컨트롤러를 구현한 서블릿 이름이 DispatcherServlet이다.