PHP 프레임워크 – Symfony – 2 – 라우팅

PHP 프레임워크 - Symfony - 2 - 라우팅
PHP 프레임워크 – Symfony – 2 – 라우팅

PHP 프레임워크 – Symfony – 라우팅

안녕하세요 여러분~ 😊
오늘은 Symfony의 핵심 기능 중 하나인 **라우팅(Routing)**에 대해 자세히 알려드릴게요.
라우팅은 웹 애플리케이션에서 아주 중요한 역할을 해요.
바로 사용자의 URL 요청을 적절한 컨트롤러로 연결해주는 교통정리 신호등 같은 존재랍니다 🚦📍

Symfony의 라우팅 시스템은 매우 유연하고 강력하기 때문에
정적 페이지는 물론이고, RESTful API까지도 깔끔하게 연결할 수 있어요!


1. 라우팅이란?

💡 비유하자면?

사용자가 www.example.com/about이라고 주소창에 입력했을 때,
Symfony가 그 주소를 보고 “아, 이건 AboutController의 index() 함수로 연결해야겠네!” 하고
자동으로 연결해주는 역할이 바로 라우팅입니다! 🛣️


2. 라우팅 설정 방식 3가지

Symfony에서는 다음 세 가지 방식으로 라우트를 설정할 수 있어요:

방식 설명
YAML 방식 config/routes.yaml에서 정의
PHP 속성(Attribute) PHP 8 이상에서 사용, 컨트롤러 클래스에 직접 작성
XML 방식 설정 파일에서 XML로 정의 (대규모 프로젝트에 사용)

이번 포스트에서는 가장 많이 사용하는 YAML 방식과 Attribute 방식을 중심으로 설명드릴게요!


3. YAML 방식 라우팅

예시: config/routes.yaml

home:
  path: /
  controller: App\Controller\HomeController::index

about:
  path: /about
  controller: App\Controller\PageController::about
  • home, about은 라우트 이름입니다.
  • path는 접속할 URL 경로이고,
  • controller는 해당 URL을 처리할 메서드를 지정해요.

컨트롤러 경로는 네임스페이스 + 메서드로 작성해주셔야 해요.


4. Attribute 방식 라우팅 (PHP 8+)

Symfony 6부터는 PHP의 Attribute 기능을 활용한 라우팅이 일반화되었어요.

// src/Controller/HomeController.php
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');
    }

    #[Route('/about', name: 'about')]
    public function about(): Response
    {
        return new Response('<h1>회사 소개</h1>');
    }
}
  • #[Route(…)] 형식으로 사용하며, 코드와 라우트 정의를 한눈에 볼 수 있어요!
  • 유지보수가 매우 편리하다는 장점이 있죠.

5. 동적 라우팅 (변수 포함)

URL에 변수를 넣고 싶은 경우도 쉽게 가능합니다.

#[Route('/post/{id}', name: 'post_show')]
public function show(int $id): Response
{
    return new Response("포스트 ID: {$id}");
}

/post/3 이런 식으로 들어오면 id = 3이 자동으로 파라미터로 전달돼요!


6. 경로 제약 설정

변수에 제약조건도 걸 수 있어요.

#[Route('/post/{id}', name: 'post_show', requirements: ['id' => '\d+'])]
  • 위 코드는 id가 숫자일 때만 허용되도록 설정하는 예입니다.
  • 숫자가 아닌 문자열이 들어오면 404 오류가 발생해요.

7. 기본값 지정

URL에 아무것도 안 들어와도 기본값을 넣고 싶을 때는?

#[Route('/hello/{name}', name: 'hello', defaults: ['name' => '게스트'])]
public function hello(string $name): Response
{
    return new Response("안녕하세요, {$name}님!");
}
  • /hello로 접속하면 “안녕하세요, 게스트님!”이라고 나옵니다.
  • /hello/철수로 접속하면 “안녕하세요, 철수님!”

8. HTTP 메서드 지정

라우트에 허용할 HTTP 메서드를 지정할 수도 있어요.

#[Route('/contact', name: 'contact', methods: ['GET', 'POST'])]
  • GET이나 POST 요청만 허용하겠다는 뜻입니다.
  • DELETE, PUT 등 REST API 개발 시 유용하게 사용됩니다.

9. 라우트 목록 확인하기

Symfony는 현재 등록된 라우트를 확인할 수 있는 명령어도 제공해요.

php bin/console debug:router
  • 라우트 이름, 경로, 컨트롤러 메서드 등을 한눈에 확인할 수 있어요.
  • 어떤 경로가 어디로 연결되는지 헷갈릴 땐 이걸 활용해보세요!

10. 라우트 경로 사용 (템플릿 내 링크 만들기)

Twig 템플릿에서 라우트 이름을 사용해서 링크를 만들 수 있어요.

<a href="{{ path('home') }}">홈으로</a>
<a href="{{ path('post_show', {'id': 5}) }}">5번 글 보기</a>
  • 이렇게 하면 경로가 바뀌어도 라우트 이름만 유지하면 되기 때문에 유지보수가 편해요!

주의할 점 ✅

항목 주의사항
경로 중복 같은 경로에 두 개의 라우트를 지정하면 에러 발생
캐시 초기화 라우트 변경 시 php bin/console cache:clear 필수
requirements 정규표현식 작성 시 백슬래시()를 두 번 써야 함
대소문자 구분 URL은 기본적으로 소문자 권장, 대소문자 혼용 시 버그 위험
Attribute 누락 PHP 8 이상에서 Attribute 방식 사용 가능, 하위 버전은 불가

요약 정리 🎯

기능 예시
기본 라우트 #[Route('/path', name: 'name')]
동적 변수 /user/{id}show($id)
제약조건 requirements: ['id' => '\d+']
기본값 defaults: ['name' => '게스트']
HTTP 메서드 제한 methods: ['GET', 'POST']
라우트 목록 확인 php bin/console debug:router
템플릿 링크 연결 {{ path('route_name') }}

마무리하며 😊

라우팅은 웹사이트의 길을 안내하는 이정표와 같아요!
잘 설계된 라우트 구조는 애플리케이션의 유지보수성과 확장성을 크게 높여준답니다.

Symfony는 이 라우팅 시스템을 매우 유연하고 강력하게 제공하고 있어서,
어떤 서비스 구조든 논리적으로 설계할 수 있는 강점을 갖고 있어요.

다음 시간에는 Symfony의 컨트롤러와 요청 처리 흐름을 구체적으로 알아볼게요!
그럼 오늘도 즐거운 Symfony 개발 되시길 바랄게요~ 🐘✨💡

답글 남기기