MVC pattern 은 model - view - controller을 뜻하며, spring framework 를 배우기 전에도 model2 버전으로 웹 프로그래밍을 경험했다.
세 가지 영역으로 분리되며, 결국 유지보수가 용이하도록 작업하기 위해서 고안된 패턴이다.
Spring framework는 위 그림과 같은 작업을 더 편리하게 도와준다고 생각하면 되는 것 같다.
그러면 어떤 점이 Spring MVC가 대신해줄까?
우선 구성요소를 살펴보아야 한다. Spring 은 웹 개발을 편하게 도와주기 때문에 사용법은 많이많이 간편해졌지만, 여러 새로운 용어와 개념들이 나오기 때문에 잘 파악하는게 중요한 것 같다.
model2 버전으로 웹 프로젝트를 개발할 때에는 Servlet.java 파일이 controller 역할을 했다.
@WebServlet("/user")
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// 1. Front Controller
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getParameter("action");
if (action == null) {
forward(request, response, "/index.jsp");
} else if ("logout".equals(action)) {
logout(request, response);
} else if ("mypage".equals(action)) {
mypage(request, response);
} else if ("mvedit".equals(action)) {
mvEdit(request, response);
} else if ("leave".equals(action)) {
leave(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getParameter("action");
if (action == null) {
forward(request, response, "/index.jsp");
} else if ("login".equals(action)) {
login(request, response);
} else if ("edit".equals(action)) {
edit(request, response);
} else if ("join".equals(action)) {
join(request, response);
}
}
}
// 2. method 부분
protected void join(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//...
}
위 코드를 보면, Servlet 파일에는
1. Front controller 역할과 2. method 부분이 같이 작성되어있고, client가 원하는 action에 따라 method가 호출 되는 방식이었다.
하지만 spring 이 도입되고, 1번과 같은 Front controller 역할은 DispatcherServlet가 대신해준다.
즉, 모든 클라이언트의 요청을 전달 받고, Controller에게 클라이언트의 요청을 전달하고, Controller가 리턴한 결과값을 view에게 전달하여 알맞은 응답을 생성한다.
HandlerMapping은 클라이언트의 요청 URL을 어떤 controller가 처리할지 결정해준다.
즉, DispatcherServlet가 받은 클라이언트 요청은 HandlerMapping 으로 넘겨지고, 여기서 어떤 컨트롤러가 처리될지 결정되면 그 다음 controller로 넘어간다.
HandlerMapping 에서 받은 요청을 처리하고
그 결과를 DispatcherServlet에 알려준다.
원래는 Servlet이 요청을 처리할 때,
그 다음 view를 어떻게 처리할지 바로 처리해준다.
하지만 ViewResolver 가 존재함으로서 controller가 return한 view name을 기반으로 viewResolver는 처리결과를 보여줄 view를 결정하는 역할을 한다.
viewResolver 가 존재함으로 인해 컨트롤러가 요청을 핸들링하는 로직과 뷰를 렌더링하는 부분이 분리된다.
따라서 컨트롤러는 따로 뷰와 관련된 기술적인 부분을 알지 못해도 된다.