1월 31, 2024

Front Controller Pattern의 정의와 DispatcherServlet을 사용한 예제 코드

1. Front Controller Pattern (프런트 컨트롤러 패턴) 이란? 

Front Controller Pattern (프런트 컨트롤러 패턴)이란 모든 요청을 단일 Handler에서 처리하는 패턴을 의미한다. 

Spring Web MVC 프레임워크에서는 DispatherServlet이 프런트 컨트롤러 역할을 한다.  


2. Front Controller Pattern 다이어그램




Front Controller Pattern을 사용하여 클라이언트의 요청을 받아들이고, 각 요청에 대한 적절한 Controller를 찾아 호출해주는 패턴을 구축할 수 있다. 


프런트 컨트롤러 패턴을 구축한 예제 코드는 아래와 같이 작성해볼 수 있다. 


3. DispatcherServlet을 사용한 예제코드

import org.example.mvc.controller.Controller;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class DispatcherServlet extends HttpServlet {
    private RequestMapping requestMapping;

@Override
public void init() throws ServletException {
requestMapping = new RequestMapping();
requestMapping.init();
}

@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

try {
            // requestMapping을 통해 URI에 해당하는 Controller를 찾아줌
Controller handler = requestMapping.findHandler(request.getRequestURI());
String viewName= handler.handleRequest(request, response);
  RequestDispatcher requestDispatcher = request.getRequestDispatcher(viewName);
requestDispatcher.forward(request, response);
} catch (Exception e) {
throw new ServletException(e);
}
}
}


즉 DispatcherServlet은 HttpServlet을 extend 하고 있는 class이며 

특정 URI가 들어왔을 경우 그것에 맞는 Controller를 찾아주는 RequestMapping이라는 별도의 class가 있다고 가정했을 때 그것에 맞는 Controller가 return된다. 


해당 Controller를 통해서 들어온 요청을 처리하고 Controller에서는 view 를 return해준다. 


이렇게 DispatcherServlet을 프런트 컨트롤러로 삼아서 단일 handler에서 처리되는 패턴을 프런트 컨트롤러 패턴이라고 부른다.