MVC
기본 정보
- 명칭: MVC
- 영문명: Model-View-Controller
- 분류: 소프트웨어 아키텍처 패턴
- 주요 용도: 애플리케이션 구조 분리
- 관련 주제: #MVC #Architecture #Backend #WebDevelopment
개요
MVC(Model-View-Controller)는 애플리케이션을 Model, View, Controller 세 영역으로 분리하여 개발하는 설계 패턴이다.
비즈니스 로직, 화면(UI), 요청 처리를 분리함으로써 유지보수성과 확장성을 높일 수 있다.
현재 PHP, Java, C#, Python 등 대부분의 웹 프레임워크가 MVC 패턴을 기반으로 설계되어 있다.
MVC 구조
사용자
↓
View
↓
Controller
↓
Model
↓
Database
↓
Model
↓
View
↓
사용자
MVC 구성 요소
Model
데이터와 비즈니스 로직을 담당한다.
역할
- 데이터 조회
- 데이터 저장
- 데이터 수정
- 데이터 삭제
- 비즈니스 규칙 처리
예시
class UserModel {
public function getUser($id){
}
}
View
사용자에게 보여지는 화면(UI)을 담당한다.
역할
- HTML 출력
- 사용자 인터페이스 구성
- 데이터 표시
예시
<h1><?= $user['name'] ?></h1>
Controller
사용자의 요청을 받아 처리하는 역할이다.
역할
- URL 처리
- Model 호출
- View 선택
- 응답 반환
예시
class UserController {
public function profile(){
}
}
동작 과정
브라우저 요청
↓
Controller
↓
Model
↓
Database
↓
Model
↓
Controller
↓
View
↓
HTML 출력
게시판 예시
글 목록 요청
/board/list
↓
BoardController
↓
BoardModel
↓
DB 조회
↓
list.php
↓
사용자
글 작성 요청
/board/write
↓
BoardController
↓
BoardModel
↓
INSERT
↓
결과 출력
실제 폴더 구조 예시
project/
├── controllers/
│ └── BoardController.php
│
├── models/
│ └── BoardModel.php
│
├── views/
│ └── board/
│ └── list.php
│
├── config/
├── public/
└── index.php
PHP MVC 예시
Controller
class UserController {
public function profile(){
$model = new UserModel();
$user = $model->getUser(1);
include 'views/profile.php';
}
}
Model
class UserModel {
public function getUser($id){
return [
'name' => '구름'
];
}
}
View
<h1>
<?= $user['name'] ?>
</h1>
MVC 장점
- 역할 분리
- 유지보수 편리
- 협업 용이
- 코드 재사용 증가
- 테스트 편의성
- 확장성 향상
MVC 단점
- 초기 구조 설계 필요
- 소규모 프로젝트에서는 과할 수 있음
- 파일 수 증가
- 학습 비용 존재
MVC와 일반 PHP 비교
일반 PHP
<?php
$conn = db();
$data = query();
?>
<html>
<?= $data ?>
</html>
로직과 화면이 섞여있다.
MVC
Controller
↓
Model
↓
View
각 역할이 분리되어 관리된다.
MVC와 CRUD
MVC는 CRUD 구현에 매우 적합하다.
| 기능 | Controller | Model | View |
|---|---|---|---|
| 생성(Create) | 요청 처리 | INSERT | 입력 폼 |
| 조회(Read) | 요청 처리 | SELECT | 목록 출력 |
| 수정(Update) | 요청 처리 | UPDATE | 수정 폼 |
| 삭제(Delete) | 요청 처리 | DELETE | 결과 출력 |
MVC와 REST API
Client
↓
Controller
↓
Model
↓
JSON 반환
REST API 서버 역시 MVC 구조를 사용하는 경우가 많다.
대표 MVC 프레임워크
PHP
- Laravel
- CodeIgniter
- Yii
Java
- Spring MVC
Python
- Django
C#
- ASP.NET MVC
TreeView CMS 관점
현재 구름님이 개발 중인 TreeView CMS 기준으로 보면:
index.php
↓
라우팅
↓
Controller
↓
Model
↓
DB
↓
View
현재 index.php가 1000줄 이상이라면 MVC 구조로 분리하는 것이 유지보수에 훨씬 유리하다.
예시
app/
├── Controllers/
├── Models/
├── Views/
├── Services/
├── Helpers/
└── Config/
실무 메모
실무에서는 다음과 같은 방식이 권장된다.
- Controller는 최대한 얇게 유지
- 비즈니스 로직은 Model 또는 Service 계층으로 이동
- View에서 DB 접근 금지
- SQL은 Model에서만 처리
- 공통 기능은 Service 분리
- Helper 함수 별도 관리
- Controller → Service → Model 구조 고려
- URL 라우터 도입
- 템플릿 엔진 사용 검토
- API와 화면 로직 분리
MVC와 함께 사용하는 기술
관련 문서
출처
- Martin Fowler - MVC Pattern
- Microsoft Learn
- Laravel Documentation
메모
- MVC → Service Layer 구조 문서 작성 권장
- MVC → Repository Pattern 확장 문서 작성 가능
- TreeView CMS MVC 리팩토링 가이드 작성 가능
- index.php 1000줄 분리 전략 문서 작성 가능
- PHP 순수 MVC 프레임워크 제작 문서 작성 가능
- Service Layer, Repository Pattern, Clean Architecture와 상호 링크 추천