MVC 는 비즈니스 로직과 사용자 뷰 영역을 분리하기 위한 소프트웨어 개발 패턴입니다. 과거의 php 는 MVC 를 따르지 않고 한 파일에 모든 로직을 기술하는 형식으로 개발되는 경우가 많았습니다.
예로 다음은 GET 파라미터에 따라 직원 db 에서 직원을 검색하거나 삭제하는 PHP 예제입니다.
<?php
$con = mysql_connect("localhost", "laravel", "homestead");
if (!$con) {
die('Could not connect: ' . mysql_error());
}
$mode = $_GET["mode"];
if ($mode == "list") {
mysql_select_db("laravel", $con);
$result = mysql_query("SELECT * FROM users");
echo "<table border='1'>
<tr>
<th>user_id</th>
<th>user_name</th>
<th>email</th>
</tr>";
while ($row = mysql_fetch_array($result)) {
echo "<tr>";
echo "<td>" . $row['id'] . "</td>";
echo "<td>" . $row['name'] . "</td>";
echo "<td>" . $row['email'] . "</td>";
echo "</tr>";
echo "\r\n";
}
echo "</table>";
} else if ($mode == "delete") {
$result = mysql_query("DELETE FROM users where id = " . $_GET["user_id"]);
echo "delete done!";
}
mysql_close($con);
?>
PHP
위 코드는 $mode 의 값의 설정 여부에 따라 다른 동작을 하고 있으며 비즈니스 로직과 db 에서 가져온 모델, 그리고 처리 결과를 보여주는 뷰 로직이 하나의 파일에 작성되어 있습니다.
이는 소프트웨어의 규모가 증가할 수록 복잡도를 늘리고 수정이 어려워지며 문제가 발생할 경우 디버깅도 매우 힘들어 지게 됩니다.
비즈니스 로직을 구현한 애플리케이션 코드와 이를 사용자에게 전달하기 위한 화면 디자인은 필요한 기술과 능력이 다르므로 각 분야의 전문가가 분업하는게 품질과 효율성이 높아집니다.
규모가 있는 프로젝트이면 개발자와 디자이너가 별도로 존재하나 하나의 파일에 비즈니스 로직과 화면 디자인이 존재한다면 디자이너가 화면의 디자인을 변경하기 위해서는 개발자의 도움이 필요하고 개발자가 코드를 수정하기 위해서는 디자이너의 도움이 받아야 하는등 작업 효율이 나빠지고 자기가 전문 분야가 아닌 부분의 내용을 만져야 하므로 품질도 떨어질 우려가 있습니다.
대부분의 웹 프레임워크는 기본적으로 MVC 기능을 탑재하고 있듯이 라라벨도 MVC 를 제공하고 있으며 라라벨 MVC 는 가볍고 사용이 쉽고 유연하므로 비즈니스 로직과 디자인을 분리하고 간결하고 우아하고 유지보수가 용이한 코드를 작성할 수 있습니다.
다음은 위의 기존 코드를 라라벨 MVC 를 활용하여 작성할 때의 일반적인 모습으로 컨트롤러에서 모델을 생성하고 이를 뷰에 전달하여 코드가 간결하고 우아하며 기능이 분리되므로 코드 작성이 쉽고 유지보수가 용이한 것을 짐작할수 있습니다.
UserController.php
<?php namespace App\Http\Controllers;
class UserController extends Controller
{
// 사용자 목록 보기
public function list()
{
$list = User::findAll();
return view('user.list')->with('list', $list);
}
// 사용자 삭제
public function delete($id)
{
User::delete($id);
return view('user.delete');
}
}
PHP
user.list.php
<html>
<body>
<h1>User List</h1>
<?php foreach ($list as $u): ?>
<li> <?php echo $u['name']; ?> </li>
<?php endforeach; ?>
</body>
</html>
CODE