전 페이지 코드에서는 한 코드 안에 Controller, Repository, View 역할을 하는 코드들이 다 들어있었다! 이것들은 스파게티 코드!!
즉 한 코드에 클라이언트의 호출을 받는 Controller, 데이터가 담겨있는 Model, 화면 응답을 관리하는 View로직이 합쳐져 있으면 스파게티 코드다! 유지보수성 매우 떨어짐!!
Model, View, Controller
그래서 관점을 나누자는 거임! 정확히는 Controller에 Service,Repository,Dto,Entity가 여기에 다 속하겠네!

Model은 서블릿에서 관리하는 HttpServletRequest 객체를 뜻한다. request 내부에 데이터 저장소를 가지고 있는데, request.setAttribute()(Controller에서 하겠네!), request.getAttribute()(View에서 하겠네!)를 사용하면 데이터를 저장하고, 조회할 수 있다.
View는 html, JSON, XML 생성을 담당해주는 부분
이렇게 직접 controller에 해당하는 부분을 서블릿으로 만들 수 있다! 중요한점은 서블릿에서 서비스 관련 로직후 Dispatcher라는 것을 통해 해당 view(여기선 new-form.jsp) 이동할 수 있다!! 그 과정에서 Dispatcher의 forward()를 쓴다! forward()는 서버 내부에서 한번 더 서버 내부를 호출하는 것이다.(근데 이때 view로 이동!)
// 얘가 controller
@WebServlet(name = "mvcMemberFormServlet", urlPatterns = "/servlet-mvc/members/new-form")
public class MvcMemberFormServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
				
        String viewPath = "WEB-INF/views/new-form.jsp"; // jsp 파일을 WEB-INF안에 두면 무조건 dispatcher로 forward 해야 접근할 수 있다!
        RequestDispatcher requestDispatcher = request.getRequestDispatcher(viewPath); // dispatcher가 관점을 controller에서 view로! 옮겨줌!
        requestDispatcher.forward(request, response); // forward() : 다른 서블릿이나 JSP로 이동할 수 있는 기능
    }
}
그렇다면 여기서 리다이렉트와 forward의 차이점!
redirect vs forward 리다이렉트는 실제 클라이언트(웹 브라우저)에 응답이 나갔다가(302뜨면), 클라이언트가 redirect 경로로 다시 요청한다. (총 클라에서 서버요청 2번) 따라서 클라이언트가 인지할 수 있고, URL 경로도 실제로 변경된다. 반면에 포워드는 서버 내부에서 일어나는 호출이기 때문에 클라이언트가 전혀 인지하지 못한다. (클라에서 서버요청 한번)
아래 코드도 보면 서비스 로직 수행(controller)을 하고 나서 model에 담아(request.setAttribute) View로 forward 하는 것을 볼 수 있다!