MVC 패턴은 다음과 같은 문제가 있다.
하나의 View마다 하나의 컨트롤러가 매핑되어서 컨트롤러마다 일일이 서블릿이 JSP에 forward하는 코드가 중복이 된다.
뷰 템플릿을 다른 뷰 템플릿으로 변경한다면 전체 viewPath 코드를 다 변경해야 한다.
response 요청이 필요하지 않은 경우에는 response 코드가 사용되지 않는다.
HttpServletRequest, HttpServletResponse를 사용하는 테스트 코드를 작성하기 쉽지 않다.
문제 코드
// 컨트롤러
@WebServlet(name = "mvcMemberSaveServlet", urlPatterns = "/servlet-mvc/members/save")
public class MvcMemberSaveServlet extends HttpServlet {
private MemberRepository memberRepository = MemberRepository.getInstance();
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) // response 사용 안함
throws ServletException, IOException {
... 비즈니스 로직
// JSP에 forward하는 코드
String viewPath = "/WEB-INF/views/save-result.jsp"; // 뷰 템플릿을 변경할때 일일이 바꿔야 함.
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response);
}
}
이러한 문제점을 해결하기위해 프론트 컨트롤러라는 패턴이 있다.
프론트 컨트롤러는 프론트 컨트롤러만 서블릿으로 요청을 받아서 일일이 입력하는 중복코드를 없애고 요청마다 알맞은 컨트롤러를 호출하게 됨으로써 컨트롤러가 서블릿 코드를 신경쓰지 않아도 되게 된다.
스프링 MVC는 이러한 프론트 컨트롤러 패턴을 띠고 있다.