
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 개발 되시길 바랄게요~ 🐘✨💡