PHP 프레임워크 – Symfony – 3 – 컨트롤러와 뷰

PHP 프레임워크 - Symfony - 3 - 컨트롤러와 뷰
PHP 프레임워크 – Symfony – 3 – 컨트롤러와 뷰

PHP 프레임워크 – Symfony – 컨트롤러와 뷰

안녕하세요 여러분 😊
Symfony 프레임워크 기초 강의! 오늘은 그 세 번째 시간으로 컨트롤러와 뷰에 대해 배워보는 시간이에요.

컨트롤러와 뷰는 웹 애플리케이션의 핵심 뼈대라고 할 수 있어요.
컨트롤러는 요리사처럼 데이터를 가공하고, 뷰는 그 데이터를 예쁘게 요리해서 접시에 담는 역할이라고 보면 돼요! 🍱👨‍🍳


1. 컨트롤러란 무엇인가요?

컨트롤러는 사용자의 요청(HTTP Request)을 받아서
해당 요청을 처리하고, 그 결과를 응답(Response)으로 반환하는 PHP 클래스예요.

Symfony에서는 모든 컨트롤러는 AbstractController 클래스를 상속해서 작성하게 됩니다.

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HomeController extends AbstractController
{
    #[Route('/', name: 'home')]
    public function index(): Response
    {
        return $this->render('home/index.html.twig');
    }
}

주요 포인트 🔍

구성요소 설명
AbstractController Symfony에서 제공하는 기본 컨트롤러 클래스
#[Route()] URL 요청 경로와 해당 메서드를 매핑
render() Twig 템플릿을 응답으로 렌더링하는 메서드
Response HTTP 응답을 생성하는 Symfony 클래스

2. 컨트롤러 메서드에서 데이터 전달하기

#[Route('/hello/{name}', name: 'hello')]
public function hello(string $name): Response
{
    return $this->render('home/hello.html.twig', [
        'name' => $name
    ]);
}
  • URL: /hello/철수로 요청 시
  • View 템플릿에서는 {{ name }}으로 사용할 수 있어요.

3. 뷰(View)란 무엇인가요?

뷰는 사용자에게 보여지는 HTML 템플릿이에요.
Symfony에서는 Twig라는 템플릿 엔진을 기본으로 사용합니다.

Twig는 HTML과 PHP의 장점을 합쳐서
보안성, 가독성, 유지보수성을 모두 잡은 멋진 템플릿 시스템이에요!


4. Twig 템플릿 기본 구조

{# templates/home/index.html.twig #}

<!DOCTYPE html>
<html>
<head>
    <xss-title>홈페이지</xss-title>
</head>
<body>
    <h1>안녕하세요!</h1>
    <p>여기는 Symfony 메인 페이지입니다.</p>
</body>
</html>

동적 데이터 사용하기

<h1>안녕하세요, {{ name }}님!</h1>
  • {{ name }}은 컨트롤러에서 전달한 데이터를 표시해요.
  • PHP의 echo $name과 같은 역할이죠.

5. 템플릿 상속 (레이아웃 만들기)

Twig는 상속 구조로 재사용 가능한 레이아웃을 만들 수 있어요.

base.html.twig

<!DOCTYPE html>
<html>
<head>
    <xss-title>{% block title %}기본 제목{% endblock %}</xss-title>
</head>
<body>
    <header>사이트 공통 헤더</header>

    <main>
        {% block body %}{% endblock %}
    </main>

    <footer>푸터 영역</footer>
</body>
</html>

하위 템플릿에서 상속받기

{% extends 'base.html.twig' %}

{% block title %}홈페이지{% endblock %}

{% block body %}
    <h1>환영합니다!</h1>
{% endblock %}

6. 조건문과 반복문

Twig는 프로그래밍 문법처럼 조건과 반복도 사용할 수 있어요.

조건문

{% if age >= 20 %}
    <p>성인입니다.</p>
{% else %}
    <p>청소년입니다.</p>
{% endif %}

반복문

<ul>
{% for product in products %}
    <li>{{ product.name }} - {{ product.price }}원</li>
{% endfor %}
</ul>

7. 경로 출력 및 링크 만들기

<a href="{{ path('home') }}">홈으로</a>
<a href="{{ path('hello', {'name': '영희'}) }}">영희 페이지</a>
  • path() 함수는 컨트롤러에서 설정한 name으로 경로를 찾아줘요.
  • 라우트가 바뀌더라도 코드 수정이 줄어드는 장점이 있어요.

8. 폴더 구조 정리

project/
├── src/
│   └── Controller/             # 컨트롤러
├── templates/
│   ├── base.html.twig          # 레이아웃 템플릿
│   └── home/
│       └── index.html.twig     # 페이지 템플릿

9. HTML + PHP와 다른 점

구분 PHP Twig
출력 <?= $name ?> {{ name }}
조건 if($age > 20) {% if age > 20 %}
반복 foreach($arr as $item) {% for item in arr %}
안전성 XSS 취약 가능성 기본 HTML 이스케이프 처리

10. JSON 응답 (API 응답용)

API 개발 시 JSON을 반환하려면 json() 메서드를 사용해요.

#[Route('/api/user', name: 'api_user')]
public function user(): JsonResponse
{
    return $this->json([
        'name' => '홍길동',
        'email' => 'hong@example.com'
    ]);
}

주의할 점 ✅

항목 주의사항
템플릿 경로 templates/ 폴더 기준으로 작성해야 함
변수 이름 중복 컨트롤러와 템플릿 변수 이름 일치 주의
HTML 이스케이프 Twig는 자동 이스케이프 처리하므로 raw 출력은 {% raw %} 사용
라우트 매핑 확인 php bin/console debug:router로 라우트 목록 확인
캐시 초기화 뷰 변경 후에도 가끔 cache:clear 필요할 수 있음

요약 정리 🎯

항목 설명
컨트롤러 사용자 요청을 처리하는 PHP 클래스
사용자가 보는 화면, Twig 템플릿 엔진 사용
템플릿 변수 컨트롤러에서 데이터 전달 후 {{ name }}으로 출력
레이아웃 base.html.twig 등으로 템플릿 재사용 가능
반복/조건 {% for %}, {% if %} 구문으로 작성
경로 출력 {{ path('route_name') }} 으로 라우트 링크 생성 가능

마무리하며 😊

Symfony에서 컨트롤러와 뷰는 웹사이트의 심장과 얼굴이라고 할 수 있어요.
이 두 요소가 조화를 이루면, 백엔드 데이터와 프론트엔드 화면이
깔끔하고 유기적으로 연결된 아름다운 웹사이트가 탄생하죠!

다음 시간에는 Symfony에서의 폼 처리와 검증에 대해 배워볼 거예요.
그럼 오늘도 즐거운 코딩 되세요~ 🎨💻✨

답글 남기기