📚 PHP 중급 - 7주차: MVC 패턴의 이해 및 적용- 02 간단한 MVC 구조로 게시판 리팩토링

2025. 8. 10. 11:05프로그램/PHP 중급

📚 PHP 중급 - 7주차: MVC 패턴의 이해 및 적용- 02 간단한 MVC 구조로 게시판 리팩토링

📚 PHP 중급 - 7주차: MVC 패턴의 이해 및 적용- 02 간단한 MVC 구조로 게시판 리팩토링

 

이번 시간에는 지난 주에 배웠던 MVC 패턴을 실제로 #게시판 개발에 적용해 보는 시간을 갖도록 하겠습니다. 기존에 작성했던 게시판 코드를 #MVC 패턴으로 리팩토링하여 더 효율적이고 유지보수가 용이한 구조로 개선해 봅시다.


기존 게시판 코드의 문제점

기존에 작성했던 게시판 코드는 하나의 #PHP 파일 안에 HTML, CSS, JavaScript, 그리고 데이터베이스 로직까지 모든 코드가 혼재되어 있었습니다. 이러한 구조는 다음과 같은 문제점을 야기합니다.

  • 유지보수의 어려움: 특정 기능을 수정하려면 관련된 모든 코드를 찾아야 하므로, 시간이 오래 걸리고 실수를 유발할 가능성이 높습니다.
  • 재사용성의 한계: 다른 페이지에서 게시판 로직을 재사용하기 어렵습니다.
  • 가독성 저하: 코드가 복잡하게 얽혀 있어 읽고 이해하기가 어렵습니다.

MVC 패턴 적용의 장점

#MVC 패턴을 적용하면 위와 같은 문제점들을 해결할 수 있습니다. 각 역할이 명확하게 분리되어 코드의 가독성이 높아지고, 유지보수가 용이해집니다.

  • Model: 데이터와 비즈니스 로직을 담당합니다. 게시판의 경우, 게시글 목록을 불러오거나, 글을 작성, 수정, 삭제하는 로직이 여기에 해당됩니다.
  • View: 사용자에게 보여지는 화면을 담당합니다. HTML, CSS, JavaScript 등으로 구성된 게시판의 UI가 여기에 해당됩니다.
  • Controller: Model과 View 사이의 연결고리 역할을 합니다. 사용자의 요청을 받아 Model에게 작업을 지시하고, 결과를 View에 전달합니다.

간단한 MVC 구조로 리팩토링하기

이제 실제로 게시판 코드를 MVC 패턴으로 리팩토링해 보겠습니다. 먼저 프로젝트의 디렉터리 구조를 다음과 같이 구성합니다.

/board
  /controller
    - BoardController.php
  /model
    - BoardModel.php
  /view
    - list.php
    - write.php
    - view.php
  - index.php

Model (BoardModel.php)

Model은 데이터베이스와의 통신을 담당합니다. BoardModel.php 파일에 게시글의 데이터를 처리하는 클래스를 작성합니다.

PHP
 
<?php
// /model/BoardModel.php

class BoardModel {
    private $conn;

    public function __construct() {
        // 데이터베이스 연결
        $this->conn = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8", "user", "password");
    }

    public function getPosts() {
        // 게시글 목록을 가져오는 로직
        $stmt = $this->conn->prepare("SELECT * FROM board ORDER BY id DESC");
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    
    public function getPostById($id) {
        // 특정 게시글을 가져오는 로직
        $stmt = $this->conn->prepare("SELECT * FROM board WHERE id = ?");
        $stmt->execute([$id]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
    // ... 글 작성, 수정, 삭제 로직 추가
}
?>

View (list.php)

View는 사용자에게 보여지는 화면을 담당합니다. list.php 파일에 게시글 목록을 표시하는 HTML 코드를 작성합니다.

PHP
 
<!DOCTYPE html>
<html>
<head>
    <title>게시판 목록</title>
</head>
<body>
    <h1>게시판 목록</h1>
    <table>
        <thead>
            <tr>
                <th>번호</th>
                <th>제목</th>
                <th>작성자</th>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($posts as $post): ?>
            <tr>
                <td><?php echo htmlspecialchars($post['id']); ?></td>
                <td><a href="/view.php?id=<?php echo htmlspecialchars($post['id']); ?>"><?php echo htmlspecialchars($post['title']); ?></a></td>
                <td><?php echo htmlspecialchars($post['author']); ?></td>
            </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
</body>
</html>

Controller (BoardController.php)

Controller는 사용자의 요청을 처리하고 Model과 View를 연결합니다. BoardController.php 파일에 요청에 따라 적절한 로직을 실행하는 클래스를 작성합니다.

PHP
 
<?php
// /controller/BoardController.php
require_once('../model/BoardModel.php');

class BoardController {
    private $model;

    public function __construct() {
        $this->model = new BoardModel();
    }

    public function listAction() {
        $posts = $this->model->getPosts();
        require_once('../view/list.php');
    }
    
    public function viewAction($id) {
        $post = $this->model->getPostById($id);
        require_once('../view/view.php');
    }
    // ... 글 작성, 수정, 삭제 액션 추가
}
?>

라우팅 (index.php)

index.php 파일은 모든 요청을 받아 적절한 Controller와 Action으로 연결하는 라우터 역할을 합니다.

PHP
 
<?php
// index.php
require_once('controller/BoardController.php');

$action = $_GET['action'] ?? 'list';
$controller = new BoardController();

if ($action === 'list') {
    $controller->listAction();
} elseif ($action === 'view') {
    $controller->viewAction($_GET['id']);
}
?>

마무리

이번 시간에는 기존의 게시판 코드를 #MVC 패턴으로 리팩토링하는 과정을 살펴보았습니다. 이렇게 구조를 분리하면 코드가 훨씬 깔끔해지고, 향후 기능 추가나 수정이 훨씬 용이해집니다. 다음 시간에는 더 복잡한 기능을 MVC 패턴으로 구현하는 방법을 다뤄보겠습니다.

 

 

 

깨끗한 IP만 모아놓은 곳, VPN PC,  모바일 지원으로 어떤 기기에서도 OK!

https://xn--299ao67b9qbmsf04c.net/

 

VPN 5,500원 / IP교체 1,100원 / 유동프록시 22,000원 | LuzenVPN 루젠VPN

국내최저가 고정IP서비스,유동프록시(IP4000개이상제공),PPTP,L2TP,IPSec,OpenVPNVPN,통신사VPN,VPN프로그램,고정IP,고정아이피,PPTP,저렴한VPN,리니지MVPN,리니지VPN,아이온VPN,던파VPN,유동프록시,유동PROXY,바이

vpn.luzensoft.com