기존의 MVC 패턴을 적용했을때의 문제점을 알아보자.
공통적인 부분이 반복적으로 일어난다.
하지만 프론트 컨트롤러를 도입하면
공통적인 부분의 반복을 없앨 수 있다.
스프링 웹 MVC도 FrontController 패턴 특징을 이용하여 DispatcherServlet을 구현했다.
V1의 구조를 다음과 같이 구현해보자.
서블릿과 비슷한 모양의 컨트롤러 인터페이스를 도입한다.
프론트 컨트롤러는 이 인터페이스를 호출해서 구현과 관계없이 로직의 일관성을 가져갈 수 있다.
회원등록 페이지, 회원저장 페이지,회원목록 페이지의 컨트롤러를 구현해보자.
내부 로직은 기존 서블릿과 거의 같다.
이제 프론트 컨트롤러를 만들자.
urlPatterns = "/front-controller/v1/x" : /front-controller/v1를 포함한 하위 모든 요청은 이 서블릿에서 받아들인다.
먼저 requestURI를 조회해서 실제 호출할 컨트롤러를 controllerMap에서 찾는다. 만약 없다면 404 상태 코드를 반환한다.
JSP는 이전 MVC에서 사용했던 것을 그대로 사용한다.
기존 서블릿, JSP로 만든 MVC와 동일하게 실행 되는 것을 확인할 수 있다.
모든 컨트롤러에서 뷰로 이동하는 부분에 중복이 있고, 깔끔하지 않다.
이 부분을 깔끔하게 분리하기 위해 별도로 뷰를 처리하는 객체를 만들자.
뷰 객체는 이후 다른 버전에서도 함께 사용하므로 패키지 위치를 frontcontroller에 두었다.
ControllerV2 인터페이스
회원등록 페이지, 회원저장 페이지,회원목록 페이지의 컨트롤러를 구현해보자.
이제 각 컨트롤러는 복잡한 dispathcer.forward()를 직접 생성해서 호출하지 않아도 된다. 단순히 MyView 객체를 생성하고 거기에 뷰 이름만 넣고 반환하면 된다.
프론트 컨트롤러V2
ControllerV2의 반환 타입이 MyView이므로 프론트 컨트롤러는 컨트롤러의 호출 결과로 MyView를 반환 받는다. 그리고 view.render()를 호출하면 forward 로직을 수행해서 JSP가 실행된다.
프론트 컨트롤러의 도입으로 MyView 객체의 render()를 호출하는 부분을 모두 일관되게 처리할 수 있다. 각각의 컨트롤러는 MyView 객체를 생성만 해서 반환하면 된다.