이전 챕터(서블릿, JSP, MVC패턴) 에서 사용한 MVC 패턴 의 한계점인 공통 처리가 힘들다는 부분을 해결하기 위해서 프론트 컨트롤러 패턴을 사용한다고 했다. 이 프론트 컨트롤러 패턴은 서블릿 하나로 클라이언트의 요청을 받아 이 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출해주는 역할을 함으로써 공통 영역을 한군데 몰아넣을 수 있다. 그렇게 함으로써 여러 컨트롤러에 산재되있던 공통 코드를 프론트 컨트롤러 하나로 모을 수 있고, 더하여 프론트 컨트롤러를 제외하면 서블릿을 상속해서 구현해줄 필요도 없다. 현재 스프링 웹 MVC의 DispatcherServlet
도 이 FrontController
패턴으로 구현되어 있다.
기존의 MVC Pattern만 적용한 상태
공통 코드가 모든 컨트롤러에 산재되있고 클라이언트는 각각의 컨트롤러를 호출해야 하는 단점이 있다.
프론트 컨트롤러를 도입한 뒤의 모습
공통 코드가 프론트코드에 모이고 클라이언트의 요청은 모두 프론트 컨트롤러로 집중된다.
이제 실제로 코드를 작성하며 프론트 컨트롤러 패턴을 적용해 보자.
핵심은 기존 코드의 변경은 최소화 하며 프론트 컨트롤러를 도입하는것으로 한다.
서블릿과 유사한 인터페이스를 구현해 각 컨트롤러는 해당 인터페이스를 구현함으로써 프론트 컨트롤러에서는 해당 인터페이스를 호출해서 다형성으로써 각각의 구현 컨트롤러와의 의존관계를 끊을 수 있다.
package hello.servlet.web.frontcontroller.v1;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public interface ControllerV1 {
void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}