MVC 패턴이란, 모델, 뷰, 컨트롤러 3가지 구성요소로 구분해서 개발하는 아키텍쳐 패턴이다.
모델은 애플리케이션의 데이터와 비즈니스 로직을 관리하며, 데이터베이스와 상호작용하고 데이터 상태를 정의하며 비즈니스 규칙을 처리한다.(데이터베이스의 레코드를 표현하는 클래스 -> 엔티티 클래스, 도메인 객체, 데이터 처리를 위한 함수 등)
뷰는 사용자에게 데이터를 시각적으로 표현하는 부분으로 모델로부터 데이터를 받아 사용자에게 출력하며, 사용자의 입력을 받을 수도 있다.(HTML, CSS, Javascript로 작성된 웹 페이지)
컨트롤러는 사용자의 입력을 처리하고 모델과 뷰 사이에서 중재 역할을 수행한다. 사용자의 요청을 받아 모델을 업데이트 하고 업데이트된 모델을 뷰에 반영한다. (HTTP요청을 처리하고 응답 생성하는 서블릿)
각 구성요소가 독립적으로 관리돼서 코드의 유지보수가 용이해지고 변경 사항이 다른 구성요소에 미치는 영향을 최소화할 수 있다.
JSP가 모델, 뷰, 컨트롤러의 역할을 모두 담당한다.
구현은 쉽고 빠르지만, 비즈니스 로직과 프레젠테이션 로직이 섞여있어 코드의 가독성이 떨어지고 유지보수가 힘들다.
서블릿과 JSP를 분리해서 각각의 역할을 명확하게 나눈 패턴으로, 서블릿이 컨트롤러로서 요청을 처리하고 JSP가 뷰를 담당한다.
동작 흐름을 보면 웹 브라우저 요청을 하나의 서블릿이 받고 (컨트롤러), 서블릿은 웹 브라우저의 요청을 알맞게 처리한 뒤 그 결과를 JSP 페이지로 포워딩 시킨다.
스프링 프레임워크의 일부로 애노테이션 기반으로 컨트롤러, 서비스, 리포지토리 등을 정의할 수 있다. 또한 DI, AOP, 트랜잭션 처리 등 여러 기능을 제공한다.

🌟 추가 질문
📍 일반 서블릿에서는 web.xml에 서블릿 매핑이 구성되어 있다면, Spring MVC에서는 어떻게 URL에 맞는 컨트롤러를 찾아갈까?
스프링 MVC에서 DispatcherServlet은 모든 요청을 중앙에서 처리하는 프론트 컨트롤러 역할을 한다. 클라이언트로부터 들어오는 모든 요청은 먼저 DispatcherServlet으로 전달되며, 이는 핸들러 매핑(HandlerMapping)을 통해 적절한 컨트롤러를 찾는다. 이 과정에서 스프링은 애노테이션(@Controller, @RequestMapping 등)을 기반으로 컨트롤러 메서드를 매핑한다. 그 결과, DispatcherServlet은 요청을 처리하고, 필요한 모델 데이터를 준비하여, 적절한 뷰로 응답을 생성한다.
📍 만약 수 백개의 URL이 있을 경우, 어떤 URL이 누가 처리하는지, 어떤 클래스가 담당하는지를 알려면 web.xml과 애노테이션 기반 중 어느 것이 더 찾기 빠를까?
전체적인 구조를 한눈에 파악해야 한다면, web.xml이 더 유리할 수 있다.
web.xml은 중앙 집중 관리 방식으로 한 파일에 모든 URL 매핑이 명시되어 있기 때문에 전체 구조를 한눈에 볼 수 있다.