
MVC (Model-View-Controller) 패턴은
소프트웨어 설계에서 ‘역할 분리(Separation of Concerns)’ 를 실현하기 위한 대표적인 아키텍처 패턴이다.
디자인 패턴 중 하나
👉 한 문장으로 요약하면,
“사용자의 요청을 처리하고 결과를 화면에 보여주는 과정을 3개의 역할로 나눈 구조”

[사용자] → Controller → Model → View → [사용자]
| 구성요소 | 역할 | 예시 |
|---|---|---|
| Model | 비즈니스 로직, 데이터 처리 담당 | DB와의 연동, 계산, 상태 관리 |
| View | 사용자에게 보여지는 화면(UI) 담당 | HTML, JSP, Thymeleaf 등 |
| Controller | 요청(Request)을 받고 Model과 View를 연결 | URL 라우팅, 흐름 제어 |

핵심 역할: 애플리케이션의 데이터와 비즈니스 로직을 담당
DB, DAO, Service 계층에서 주로 존재
View나 Controller에 의존하지 않는다. (즉, 화면이 바뀌어도 Model은 그대로)
예시 (Spring 기반)
public class Member {
private Long id;
private String name;
}
@Service
public class MemberService {
@Autowired
private MemberRepository memberRepository;
public Member findMember(Long id) {
return memberRepository.findById(id);
}
}
핵심 역할: 사용자가 볼 수 있는 출력 결과 화면
데이터의 표현에만 집중해야 하며, 로직이 포함되면 안 됨
HTML, JSP, Thymeleaf, React 등 다양한 형태 가능
예시 (Thymeleaf)
<p th:text="'회원 이름: ' + ${member.name}"></p>
핵심 역할: 사용자의 요청을 받고, Model과 View를 연결하는 중간 관리자
클라이언트의 입력을 해석하고, 비즈니스 로직을 호출한 뒤 View에 전달
예시 (Spring MVC)
public class MemberController {
@Autowired
private MemberService memberService;
@GetMapping("/members/{id}")
public String getMember(@PathVariable Long id, Model model) {
Member member = memberService.findMember(id);
model.addAttribute("member", member);
return "memberView"; // View 이름
}
}
→ 클라이언트가 /members/1 요청을 보냄
→ 스프링이 모든 요청을 가장 먼저 받는 진입점
→ 적절한 Controller로 요청을 위임
→ URL 매핑된 메서드 실행
→ 비즈니스 로직(Service) 호출
→ Controller는 로직 처리 결과를 Model에 담음
→ Controller가 반환한 View 이름을 실제 JSP/HTML 경로로 변환
→ 데이터를 포함한 View를 사용자에게 전달
Controller → Service → Repository → DB
↓
View
| 계층 | 역할 | 예시 |
|---|---|---|
| Controller | 요청/응답, 라우팅, 파라미터 처리 | @Controller, @RestController |
| Service | 비즈니스 로직 | @Service |
| Repository | DB 연동 (MyBatis, JPA 등) | @Repository |
| View | 사용자에게 결과 반환 | Thymeleaf, JSP |

| 패턴 | View의 역할 | Controller/Presenter/ViewModel의 역할 | 사용 예시 |
|---|---|---|---|
| MVC | 단순 출력 | 흐름 제어 (Controller 중심) | Spring, Django |
| MVP | 사용자 이벤트 위임 | Presenter가 로직 처리 | Android (옛 방식) |
| MVVM | View ↔ ViewModel 바인딩 | 데이터 바인딩 중심 | Vue.js, React, Flutter |
MVC 패턴

MVP 패턴

MVVM 패턴
