Spring MVC는 기존의 MVC 패턴의 여러 차례 변형하고 Spring 프레임워크가 가지고 있는 여러 기능을 결합하여 웹 애플리케이션 개발을 위한 모듈로 제공되고 있다.

MVC1은 MVC 패턴의 초기 버전을 의미합니다.
MVC1은 주로 JSP(Java Server Pages)를 사용하여 뷰와 컨트롤러를 구현합니다. JSP는 사용자의 요청을 처리하는 컨트롤러로 동작하고, 처리 결과를 다시 JSP를 통해 뷰로 전달합니다. 이로써 JSP는 컨트롤러와 뷰의 역할을 모두 수행합니다.
장점으로는 단순한 구조로 이해하기 쉽고 JSP를 사용하여 뷰와 컨트롤러를 함께 작성하여 UI와 비즈니스 로직을 한번에 처리하기 때문에 빠르게 개발할 수 있습니다.
작은 규모의 프로젝트나 단순한 웹 애플리케이션에 적합한 구조입니다.
단점으로는 앞서 언급한 뷰와 컨트롤러가 강하게 결합되어 JSP에서 직접 처리되므로 코드이 유지보수가 어렵고 변경 사항이 전체 애플리케이션에 영향을 주어, 코드의 가독성과 재사용성이 저하되고 비즈니스 로직이 JSP에 포함되어 테스트 하기 어렵습니다. 또한 앞서 언급한대로 강하게 결합되어 있어 확장에도 어려움이 있습니다.
이러한 단점들을 극복하고자 MVC2와 같은 발전된 버전의 MVC패턴이 등장하였습니다.

MVC2는 MVC1의 단점을 보완하여 등장하였습니다.
MVC2의 주요한 차별점은 컨트롤러의 역할이 확장되었다는 점입니다. 요청을 하나의 컨트롤러(Servlet)가 먼저 받습니다. MVC1과는 다르게 JSP와 같은 뷰가 일부 컨트롤러 역할을 담당했지만, MVC2에서는 별도의 컨트롤러가 요청을 처리하고 모델과 뷰를 조정합니다. 이를 통해 컴포넌트 간의 역할 분리와 유연성이 증가하여 개발자가 애플리케이션을 보다 쉽게 유지하고 확장할 수 있습니다. 그러므로 개발자는 Model, View, Controller 중에서 수정해야 할 부분이 있다면, 그것만 꺼내어 수정하면 됩니다.
MVC2는 MVC1보다 구조가 복잡해질 수 있지만, 개발자가 이러한 세부적인 구성까지 신경쓰지 않을 수 있도록 각종 프레임워크들이 지금까지 잘 발전되어 왔습니다. 그 중에서 대표적인 것이 바로 스프링 프레임워크입니다.

데이터와 비즈니스 로직을 담당합니다. Spring MVC에서는 Java 객체로 표현되며, 주로 POJO(Plain Old Java Object)로 구현됩니다. 데이터베이스나 외부 서비스와 상호작용을 담당하는 DAO(Data Access Object)클래스와 함께 사용됩니다.
사용자 인터페이스를 표시합니다. Spring MVC에서는 주로 JSP(Java Server Page)나 Thymleaf와 같은 템플릿 엔진을 사용하여 뷰를 구현합니다. 뷰는 사용자에게 결과를 표시하고, 모델에서 제공하는 데이터를 사용하여 동적으로 콘텐츠를 생성합니다. Spring MVC에서는 뷰 리졸버(View Resolver)를 사용하여 컨트롤러가 반환한 뷰의 이름을 실제 뷰로 변환합니다.
사용자의 요청을 처리하고, 비즈니스 로직을 호출하며, 모델과 뷰를 조정합니다. 주로 클래스로 구현되며, @Controller 어노테이션을 사용하여 표시됩니다. 컨트롤러는 사용자의 요청을 수신하고, 해당 요청에 대한 알맞은 비즈니스 로직을 호출한 후 결과를 적절한 뷰로 전달합니다.
Spring MVC의 핵심 컴포넌트로서, Front Controller(프론트 컨트롤러)패턴으로 Spring에서는 디스패처 서블릿으로 모든 클라이언트 요청을 받아들이고 적절한 핸들러로 요청을 전달합니다. DispatcherServlet은 설정 파일에 등록되며, 요청의 라우팅, 컨트롤러의 선택, 뷰의 렌더링 등으 관리합니다.
요청을 처리할 적절한 컨트롤러를 선택하기 위한 매핑 역할을 수행합니다. 요청 URL 패턴과 컨트롤러를 매핑시키는 역할을 합니다.
요청 결과로 보여줄 뷰를 결정하는 역할을 수행합니다. 뷰 리졸버는 뷰 이름을 기반으로 실제 뷰 객체를 찾아 반환합니다.