
MVC 패턴의 이해
🟢 웹 애플리케이션 개발 방식의 진화
웹 애플리케이션을 개발하는 방식은 크게 모델1과 모델2 방식으로 나뉜다.
이 두 방식의 차이를 이해하면 왜 MVC 패턴이 필요한지 알 수 있다.
모델1 방식 ❌
구조

모델1 방식은 JSP가 모든 것을 담당한다. 클라이언트의 요청을 받고, 비즈니스 로직을 처리하고, 화면까지 보여주는 만능 선수다.
장점
- 기능 구현이 쉽고 빠름
- 간단한 프로젝트에 적합
단점
- 화면 기능과 비즈니스 로직이 한 파일에 섞여 있어 코드가 복잡해짐
- 프로젝트가 커질수록 유지보수가 어려워짐
- 코드 재사용이 거의 불가능
- 팀 프로젝트에서 역할 분담이 어려움
실제로 규모가 조금만 커져도 JSP 파일 하나에 수백 줄의 코드가 뒤섞여 관리가 불가능해진다.
모델2 방식 (MVC 패턴) ✅
구조

모델2 방식은 모델1의 단점을 보완하기 위해 등장했다. 웹 애플리케이션의 각 기능을 역할별로 분리해서 구현한다.
분리된 역할
- Controller: 클라이언트 요청을 받아서 적절한 곳으로 전달
- Model: 비즈니스 로직 처리와 데이터 관리
- View: 사용자에게 보여줄 화면만 담당
장점
- 각 기능이 모듈화되어 있어 팀별로 분업 가능
- 코드 재사용성이 높음
- 확장성과 이식성이 좋음
- 유지보수가 훨씬 쉬움
- 현재 모든 웹 프로그램은 모델2 방식으로 개발
단점
- 초반 구조 설계가 복잡함
- 개발 기간과 비용이 증가할 수 있음
하지만 장기적으로 보면 모델2 방식이 훨씬 효율적이기 때문에 현재는 업계 표준이 되었다.
MVC 패턴의 3요소

각자의 역할이 명확하고, 서로 독립적으로 동작한다.
비유로 이해하기

FrontController 패턴
문제 상황
모델2 방식을 사용하더라도 각 요청마다 서블릿(Controller)을 만들면 관리가 어렵다. 예를 들어 100개의 기능이 있으면 100개의 서블릿이 필요하다.
해결책: FrontController
모든 클라이언트 요청을 하나의 대표 컨트롤러가 받아서 처리한다.
모든 요청 → FrontController → 적절한 처리
장점
- 요청을 한 곳에서 집중 관리
- 공통 처리(인코딩, 인증 등)를 한 번에 적용 가능
- 효율적인 개발과 유지보수
문제점
- FrontController에 모든 로직이 집중되면 코드가 길고 복잡해짐
Command 패턴
FrontController의 문제 해결
FrontController가 모든 요청을 직접 처리하지 않고, 각 작업에 해당하는 클래스가 처리하도록 분산한다.

특징
- FrontController는 교통정리만 함
- 실제 작업은 각 Command 클래스가 담당
- 모든 Command 클래스는 통일된 인터페이스로 구현
장점
- 코드가 분산되어 관리 용이
- 새로운 기능 추가가 쉬움
- 각 클래스가 독립적으로 동작
Spring MVC 구조
Spring MVC란?
Spring MVC는 앞서 배운 모델2 방식 + FrontController 패턴 + Command 패턴을 스프링 프레임워크에서 완벽하게 구현해놓은 것이다.
개발자는 복잡한 구조를 직접 만들 필요 없이, 스프링이 제공하는 기능을 사용하기만 하면 된다.
Spring MVC의 핵심 구성 요소
1. DispatcherServlet (프론트 컨트롤러)
앞서 배운 FrontController의 역할을 하는 스프링의 핵심 서블릿이다.
역할
- 모든 요청의 진입점
- 클라이언트 요청을 받아 적절한 컨트롤러로 전달
- 결과를 받아 View로 전달
설정 (web.xml)
<url-pattern>/</url-pattern>
이 설정으로 http://localhost:8080/ 이하 모든 요청이 DispatcherServlet으로 들어온다.
2. HandlerMapping
역할: 요청 URL에 맞는 Controller를 찾아준다.
요청 URL: /student/list
↓
HandlerMapping이 StudentController의 list() 메소드를 찾아줌
개발자가 @RequestMapping으로 URL을 지정하면, HandlerMapping이 자동으로 매핑 정보를 관리한다.
3. ViewResolver
역할: Controller가 반환한 뷰 이름으로 실제 JSP 파일을 찾아준다.
설정 (servlet-context.xml)
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
동작 방식
return "home"; // Controller에서 반환
↓
ViewResolver가 변환
↓
/WEB-INF/views/home.jsp // 실제 파일 경로
이렇게 하면 Controller에서 전체 경로를 쓸 필요 없이 파일명만 적으면 된다.
🔄 Spring MVC 동작 흐름

1. 클라이언트가 URL 요청
↓
2. DispatcherServlet이 모든 요청을 받음
↓
3. HandlerMapping이 요청을 처리할 Controller를 찾음
↓
4. Controller가 비즈니스 로직 수행
↓
5. Controller가 결과 데이터와 뷰 이름을 반환
↓
6. ViewResolver가 실제 JSP 파일을 찾음
↓
7. JSP가 화면을 생성해서 클라이언트에게 응답
핵심 포인트
개발자는 2~6단계를 직접 구현하지 않는다. 스프링이 자동으로 처리해준다. 개발자는 4단계(Controller)와 7단계(JSP)만 작성하면 된다
'Archive > Java 풀스택 아카데미' 카테고리의 다른 글
| [TIL] 15. 10월 Spring Framework(Bean) (0) | 2025.10.28 |
|---|---|
| [TIL] 14. 10월 Spring Framework(Container) (0) | 2025.10.19 |
| [TIL] 12. 9월 Spring Framework (0) | 2025.09.30 |
| [TIL] 11. 9월 알고리즘(Greedy, DP) (0) | 2025.09.22 |
| [TIL] 10. 9월 알고리즘 (BFS/DFS) (1) | 2025.09.15 |