1 분 소요


FrontController 패턴 소개

FrontController 도입 후
frontController

  • 도입전에는 클라이언트가 필요한 Controller를 일일이 호출해서 공통 처리가 되지 않았다.
  • 도입 후 모든 요청은 Front Controller 한 곳으로 모이고, Front Controller가 공통 처리를 한 뒤에 필요한 클라이언트를 각각 호출해준다.

FrontController 패턴 특징

  • Front Controller 서블릿 하나로 클라이언트의 요청을 받음
  • Front Controller가 요청에 맞는 컨트롤러를 찾아서 호출
  • 공통 처리 가능
  • Front Controller를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 된다.

스프링 웹 MVC와 FrontController

  • 스프링 웹 MVC의 핵심도 FrontController이다.
  • 스프링 웹 MVC의 DispatcherServlet이 FrontController 패턴으로 구현되어 있다.


FrontController 도입 - V1

V1 구조
v1

ControllerV1

public interface ControllerV1 {
    void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}

각 컨트롤러들이 인터페이스를 구현함으로써 로직이 일관성을 가진다.

MemberFormControllerV1

@Override
public void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String viewPath = "/WEB-INF/views/new-form.jsp";
    RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
    dispatcher.forward(request, response);
}

MemberSaveController

@Override
public void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String username = request.getParameter("username");
    int age = Integer.parseInt(request.getParameter("age"));

    Member member = new Member(username, age);
    memberRepository.save(member);

    request.setAttribute("member", member);

    String viewPath = "/WEB-INF/views/save-result.jsp";
    RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
    dispatcher.forward(request, response);
}
  • request.getParameter()메서드를 통해 파라미터로 넘어온 값을 저장.

FrontControllerServletV1

@WebServlet(name = "frontControllerServletV1", urlPatterns = "/front-controller/v1/*")
public class FrontControllerServletV1 extends HttpServlet {

    private Map<String, ControllerV1> controllerMap = new HashMap<>();

    public FrontControllerServletV1() {
        controllerMap.put("/front-controller/v1/members/new-form", new MemberFormControllerV1());
        controllerMap.put("/front-controller/v1/members/save", new MemberSaveControllerV1());
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        String requestURI = request.getRequestURI();

        ControllerV1 controller = controllerMap.get(requestURI);
        if (controller == null) {
            response.setStatus(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        controller.process(request, response);
    }
}

urlPatterns

  • urlPatterns = "/front-controller/v1/*": /front-controller/v1을 포함한 하위 모든 요청은 이 서블릿이 받아들인다.

controllerMap

  • key: 매핑 URL
  • value: 호출될 컨트롤러


<출처 : 인프런 - 스프링 MVC 1편 : 백엔드 웹 개발 핵심 기술(김영한)>

댓글남기기