
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에서의 폼 처리와 검증에 대해 배워볼 거예요.
그럼 오늘도 즐거운 코딩 되세요~ 🎨💻✨