서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다. 기존에 서버는 정적인 자료(HTML, 사진, 글 등)만을 주고받았다. 하지만 웹에 다양한 기능이 요구되면서 정적인 자료뿐만 아니라 사용자 요구에 맞춘 동적인 페이지들을 만들 필요가 생겼다. 이를 위해 만들어진 것이 바로 Servlet이다.
JavaServer Pages 의 약자이며 HTML 코드에 Java 코드를 넣어 동적 웹페이지를 생성하는 웹 어플리케이션 도구이다.
JSP가 실행되면 자바 Servlet으로 변환되며 웹 어플리케이션 서버에서 동작 되면서 필요한 기능을 수행하고 그렇게 생성된 데이터를 웹 페이지와 함께 클라이언트로 응답한다.
Servlet을 활용한 개발에서는 뷰(View) 화면을 위한 HTML을 만드는 작업이 자바 코드에 섞여서 지저분하고 복잡하다.
JSP를 사용하면 뷰를 생성하는 HTML 작업을 깔끔하게 가져가고, 중간중간 동적으로 변경이 필요한 부분에만 자바 코드를 적용했다. 그런데 이렇게 해도 해결되지 않은 몇가지 고민이 남는다. 회원 저장 JSP를 예로들면 코드의 상위 절반은 회원을 저장하기 위한 비즈니스 로직이고, 나머지 하위 절반만 결과를 HTML로 보여주기 위한 뷰 영역이다. 코드를 분석해보면 Java코드, 데이터를 조회하는 repository 등등 다양한 코드가 모두 JSP에 노출되어 있다. 즉 JSP가 너무 많은 역할을 하게 되는 것이다. 수백 수천 줄이 넘어가는 JSP의 경우 지옥과 같다.
비즈니스 로직은 서블릿 처럼 다른곳에서 처리하고, JSP는 목적에 맞게 HTML로 화면(View)을 그리는 일에 집중하도록 해야한다. 과거 개발자들도 모두 비슷한 고민이 있었고, 그 결과 MVC패턴이 등장하게 되었다.

Dispatcher Servlet은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 보내주는 Front Controller이다.
즉, Front Controller로서 클라이언트로 부터 어떠한 요청이 오게 되면 모든 요청을 자신이 가장 먼저 받게 되고, 이러한 요청들을 세부 컨트롤러에 전달하는 역할을 한다.
핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회한다.
핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 조회한다.
핸들러 어댑터 실행: 핸들러 어댑터를 실행한다.
핸들러 실행: 핸들러 어댑터가 실제 핸들러를 실행한다.
ModelAndView 반환: 핸들러 어댑터는 핸들러가 반환하는 정보를 ModelAndView로 변환해서 반환한다.
viewResolver 호출: 뷰 리졸버를 찾고 실행한다.(JSP의 경우: InternalResourceViewResolver가 자동 등록되고, 사용된다.)
View 반환: 뷰 리졸버는 뷰의 논리 이름을 물리 이름으로 바꾸고, 렌더링 역할을 담당하는 뷰 객체를 반환한다.
뷰 렌더링: 뷰를 통해서 뷰를 렌더링 한다.
인프런 김영한 MVC 1편