0Pricing
PHP Academy · 강의

템플릿 패턴: 로직과 뷰 분리

비즈니스 로직을 PHP 파일로 옮기고 HTML 템플릿을 깔끔하게 유지합니다.

템플릿 패턴: 로직과 뷰 분리은(는) CoddyKit의 무료 PHP Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 PHP Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

로직과 뷰를 분리하는 이유

같은 파일에 데이터베이스 쿼리, 비즈니스 로직, HTML을 섞으면 다음과 같은 문제가 발생합니다:

  • 읽기 어려운 스파게티 코드
  • 로직을 테스트하고 재사용하기 어려움
  • 검증을 건너뛸 때 발생하는 보안 실수

해결책은 각 관심사를 고유한 계층에 두는 것입니다.

간단한 템플릿 패턴

먼저 모든 PHP 로직을 실행한 다음 HTML을 출력합니다:

<?php
// --- LOGIC (top) ---
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user   = getUserById($userId);
if (!$user) {
    http_response_code(404);
    require '404.php';
    exit;
}
$pageTitle = 'Profile: ' . $user['name'];

// --- VIEW (bottom) ---
require 'layout/header.php';
?>
<main>
    <h1><?= htmlspecialchars($user['name']) ?></h1>
</main>
<?php require 'layout/footer.php'; ?>

컨트롤러와 뷰 파일 분리

컨트롤러 파일과 뷰 파일로 나눕니다:

// profile.php (controller)
<?php
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user   = getUserById($userId);
$posts  = getPostsByUser($userId);

if (!$user) { require '404.php'; exit; }

require 'views/profile.view.php';

// views/profile.view.php (view) — only HTML and echoes
// No DB calls allowed here!

뷰 데이터 준비

뷰에 보내기 전에 로직 계층에서 모든 데이터의 형식을 지정합니다:

<?php
$user = getUserById($id);

$viewData = [
    'userName'   => htmlspecialchars($user['name']),
    'avatarUrl'  => $user['avatar'] ?? '/default.png',
    'joinedDate' => date('F Y', strtotime($user['created_at'])),
    'isAdmin'    => in_array('admin', $user['roles']),
];

extract($viewData);  // Makes $userName, $avatarUrl, etc.
require 'views/profile.view.php';

템플릿 함수 패턴

더 깔끔하게 재사용할 수 있도록 뷰 렌더링을 함수로 감쌉니다:

<?php
function render(string $view, array $data = []): void {
    extract($data);  // Create variables from array
    require __DIR__ . '/views/' . $view . '.php';
}

// Usage:
render('profile', [
    'name'   => $user['name'],
    'email'  => $user['email'],
]);

출력 버퍼링 템플릿 엔진

템플릿을 렌더링하고 문자열로 반환합니다:

<?php
function renderToString(string $view, array $data = []): string {
    extract($data);
    ob_start();
    require __DIR__ . '/views/' . $view . '.php';
    return ob_get_clean();
}

$html = renderToString('email/welcome', ['name' => 'Alice']);
mail($to, 'Welcome!', $html, 'Content-Type: text/html');

템플릿 엔진 사용 시점

간단한 사이트에는 PHP의 기본 템플릿 기능으로 충분합니다. 다음과 같은 경우에는 Twig 또는 Blade를 고려해 보십시오:

  • 기본적으로 자동 이스케이프를 사용하려는 경우
  • 디자이너가 PHP 지식 없이 템플릿을 편집해야 하는 경우
  • 템플릿 상속과 매크로가 필요한 경우
  • 프로젝트에 뷰가 많고 규모가 커지는 경우

Twig 예시

Symfony에서 사용하는 Twig는 자동 이스케이프를 지원하는 깔끔한 구문을 제공합니다:

<?php
// After: composer require twig/twig
$loader = new Twig\Loader\FilesystemLoader('/templates');
$twig   = new Twig\Environment($loader, ['cache' => '/tmp/twig']);

echo $twig->render('profile.html.twig', [
    'user'  => $user,
    'posts' => $posts,
]);

// profile.html.twig:
// <h1>{{ user.name }}</h1>  -- auto-escaped by default

MVC 디렉터리 구조

일반 PHP 프로젝트를 위한 최소한의 MVC 구조입니다:

project/
  controllers/
    UserController.php   -- handles request, calls model
  models/
    User.php             -- database queries
  views/
    users/
      profile.php        -- display only, no logic
  public/
    index.php            -- front controller (router)

프런트 컨트롤러 패턴

모든 요청을 하나의 진입점으로 전달합니다:

<?php
// public/index.php (front controller)
require __DIR__ . '/../vendor/autoload.php';

$uri    = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routes = require '../routes.php';

if (isset($routes[$uri])) {
    [$controller, $action] = $routes[$uri];
    (new $controller)->$action();
} else {
    http_response_code(404);
    require '../views/404.php';
}

단일 책임 원칙

각 파일은 변경되어야 하는 하나의 이유만 가져야 합니다:

  • 모델: 데이터 구조나 쿼리 로직이 변경될 때만 변경됩니다
  • 컨트롤러: 요청 처리 로직이 변경될 때만 변경됩니다
  • 뷰: UI나 레이아웃이 변경될 때만 변경됩니다

이렇게 하면 각 부분을 독립적으로 더 쉽게 테스트하고 유지 관리할 수 있습니다.

빠른 확인

PHP 로직을 HTML 뷰 코드와 분리할 때 얻는 가장 큰 이점은 무엇입니까?

복습: 템플릿 패턴

핵심 내용:

  • 먼저 모든 로직을 실행한 다음 HTML을 출력합니다
  • 컨트롤러와 뷰 파일로 분리합니다
  • extract()와 함께 render() 함수를 사용합니다
  • 출력 버퍼링으로 렌더링된 HTML을 캡처합니다
  • 규모가 큰 프로젝트에는 Twig 또는 Blade를 고려합니다
  • 프런트 컨트롤러가 모든 요청을 처리기로 전달합니다

자주 묻는 질문

“템플릿 패턴: 로직과 뷰 분리” 강의는 무료인가요?

네 — “템플릿 패턴: 로직과 뷰 분리” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 PHP Academy 강의 전체를 잠금 해제할 수 있습니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“템플릿 패턴: 로직과 뷰 분리”에서 뭘 배우나요?

비즈니스 로직을 PHP 파일로 옮기고 HTML 템플릿을 깔끔하게 유지합니다. 브라우저에서 직접 실행하는 실습 코드로 PHP Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

PHP Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 PHP Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“템플릿 패턴: 로직과 뷰 분리” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 PHP Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 PHP Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. PHP 태그 및 삽입 문법
  2. PHP 반복문으로 동적 HTML 만들기
  3. 파일 포함 및 불러오기
  4. 템플릿 패턴: 로직과 뷰 분리
← PHP Academy(으)로 돌아가기