PHP

PHP로 MVC 패턴 구현하기

thebasics 2024. 9. 25. 10:00

목차
1. MVC 패턴이란 무엇인가?
   - MVC 패턴의 개념
   - MVC 패턴의 장점
2. MVC 구조의 예제 애플리케이션
   - 디렉토리 구조
   - 간단한 예제 애플리케이션
3. Controller, Model, View의 역할
   - Controller의 역할
   - Model의 역할
   - View의 역할
4. 코드 예제
5. 결론 및 추가 학습 자료


1. MVC 패턴이란 무엇인가?

MVC 패턴의 개념

MVC(Model-View-Controller) 패턴은 애플리케이션의 비즈니스 로직과 프레젠테이션 로직을 분리하여 개발하는 디자인 패턴입니다. MVC 패턴은 세 가지 주요 구성 요소로 나뉘어져 있습니다:

- Model: 데이터와 비즈니스 로직을 담당하며, 데이터베이스와의 상호작용을 관리합니다.
- View: 사용자 인터페이스를 담당하며, 데이터를 시각적으로 표현하는 역할을 합니다.
- Controller: 사용자 입력을 처리하고, Model과 View 간의 상호작용을 관리하는 역할을 합니다.

MVC 패턴의 장점

- 유지보수성: 각 구성 요소가 독립적으로 동작하므로, 코드의 유지보수가 용이합니다.
- 재사용성: View와 Model이 분리되어 있어, 같은 Model을 다양한 View에서 재사용할 수 있습니다.
- 테스트 용이성: 각 구성 요소가 독립적으로 테스트 가능하여, 단위 테스트 작성이 용이합니다.


2. MVC 구조의 예제 애플리케이션

디렉토리 구조

MVC 패턴을 사용한 PHP 애플리케이션의 디렉토리 구조는 일반적으로 다음과 같이 구성됩니다:

/my_mvc_app
    /app
        /controllers
            HomeController.php
        /models
            User.php
        /views
            home.php
    /public
        index.php
    /config
        config.php
    /core
        Controller.php
        Model.php
    /vendor
        autoload.php
    composer.json

이 구조는 애플리케이션의 주요 구성 요소를 명확히 구분하여, 코드의 가독성과 유지보수성을 높여줍니다.

간단한 예제 애플리케이션

간단한 사용자 목록을 표시하는 애플리케이션을 예제로 들겠습니다. 이 애플리케이션은 사용자가 브라우저에서 'index.php'에 접근할 때, 사용자 목록을 가져와 이를 화면에 표시합니다.


3. Controller, Model, View의 역할

Controller의 역할

Controller는 사용자의 요청을 처리하고, 적절한 Model을 호출하여 데이터를 가져오거나 조작하며, 해당 데이터를 View에 전달하여 화면에 표시하는 역할을 합니다.

예제:

// app/controllers/HomeController.php
<?php

class HomeController extends Controller
{
    public function index()
    {
        $userModel = $this->model('User');
        $users = $userModel->getAllUsers();
        $this->view('home', ['users' => $users]);
    }
}

?>

Model의 역할

Model은 데이터와 비즈니스 로직을 처리합니다. 데이터베이스와 상호작용하며, 데이터를 가져오고 저장하는 역할을 담당합니다.

예제:

// app/models/User.php
<?php

class User extends Model
{
    public function getAllUsers()
    {
        $stmt = $this->db->query("SELECT * FROM users");
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

?>

View의 역할

View는 Controller로부터 받은 데이터를 시각적으로 표현합니다. HTML과 PHP를 사용하여 사용자 인터페이스를 구성하며, 사용자가 볼 수 있는 화면을 생성합니다.

예제:

// app/views/home.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>User List</title>
</head>
<body>
    <h1>User List</h1>
    <ul>
        <?php foreach ($users as $user): ?>
            <li><?= htmlspecialchars($user['name']) ?></li>
        <?php endforeach; ?>
    </ul>
</body>
</html>

4. 코드 예제

다음은 간단한 MVC 패턴을 구현한 PHP 애플리케이션의 코드 예제입니다.

1. Controller 기본 클래스:

// core/Controller.php
<?php

class Controller
{
    protected function model($model)
    {
        require_once "../app/models/$model.php";
        return new $model();
    }

    protected function view($view, $data = [])
    {
        extract($data);
        require_once "../app/views/$view.php";
    }
}

?>

2. Model 기본 클래스:

// core/Model.php
<?php

class Model
{
    protected $db;

    public function __construct()
    {
        $this->db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'root', '');
        $this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
}

?>

3. HomeController:

// app/controllers/HomeController.php
<?php

class HomeController extends Controller
{
    public function index()
    {
        $userModel = $this->model('User');
        $users = $userModel->getAllUsers();
        $this->view('home', ['users' => $users]);
    }
}

?>

4. User Model:

// app/models/User.php
<?php

class User extends Model
{
    public function getAllUsers()
    {
        $stmt = $this->db->query("SELECT * FROM users");
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
}

?>

5. View:

// app/views/home.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>User List</title>
</head>
<body>
    <h1>User List</h1>
    <ul>
        <?php foreach ($users as $user): ?>
        	<li><?= htmlspecialchars($user['name']) ?></li>
        <?php endforeach; ?>
    </ul>
</body>
</html>

6. Index 파일 (앱 진입점):

// public/index.php
<?php

require '../core/Controller.php';
require '../core/Model.php';

$controller = new HomeController();
$controller->index();

?>

코드 분석:
- 'Controller' 클래스는 Model과 View를 호출하는 메서드를 제공합니다.
- 'Model' 클래스는 데이터베이스 연결을 설정하고, 데이터베이스와의 상호작용을 처리합니다.
- 'HomeController'는 사용자 요청을 처리하고, Model에서 데이터를 가져와 View에 전달하는 역할을 합니다.
- 'User' 모델은 데이터베이스에서 사용자 데이터를 가져오는 기능을 담당합니다.
- 'home.php'는 사용자 목록을 화면에 표시하는 View입니다.
- 'index.php'는 애플리케이션의 진입점으로, Controller를 초기화하고 요청을 처리합니다.


5. 결론 및 추가 학습 자료

이번 글에서는 PHP로 MVC 패턴을 구현하는 방법에 대해 알아보았습니다. MVC 패턴은 애플리케이션의 비즈니스 로직과 프레젠테이션 로직을 분리하여 코드의 유지보수성과 재사용성을 높이는 데 유용한 디자인 패턴입니다. PHP에서 MVC 패턴을 사용하면 애플리케이션의 구조를 체계적으로 관리할 수 있으며, 다양한 프로젝트에서 일관된 개발 방식을 적용할 수 있습니다.

추가 학습 자료:
- [MVC 패턴의 이해](https://www.tutorialspoint.com/design_pattern/mvc_pattern.htm MVC 패턴의 개념과 이점을 설명하는 튜토리얼입니다.
- [PHP The Right Way - MVC](https://phptherightway.com/ PHP에서 올바른 MVC 패턴을 구현하는 방법에 대한 가이드입니다.
- [Laravel 공식 문서](https://laravel.com/docs Laravel은 PHP에서 MVC 패턴을 사용하는 대표적인 프레임워크로, 다양한 예제와 문서를 제공합니다.


이제 MVC 패턴을 사용하여 PHP 애플리케이션을 체계적으로 개발할 수 있습니다. 실습을 통해 MVC 패턴의 이점을 경험하고, 프로젝트에 적용해보세요!

반응형

'PHP' 카테고리의 다른 글

PHP에서 의존성 주입(DI) 사용하기  (1) 2024.09.27
PHP에서 라우팅 구현하기  (4) 2024.09.26
PHP에서 PSR 표준 적용하기  (2) 2024.09.24
PHP에서 PDO 사용하기  (0) 2024.09.23
PHP 애플리케이션 성능 최적화하기  (4) 2024.09.22