
PHP 프레임워크 – Symfony – API 개발
안녕하세요 여러분 😊
이번 시간에는 현대 웹 개발에서 없어서는 안 되는 API(Application Programming Interface) 개발을 Symfony로 어떻게 구현할 수 있는지 알아볼 거예요!
요즘은 모바일 앱, 프론트엔드(Vue, React, Svelte 등), 외부 서비스들이 백엔드와 소통할 때 거의 대부분 RESTful API 방식을 사용하죠.
Symfony는 이런 API를 만들기 아주 좋은 프레임워크입니다. 강력하면서도 유연한 구조 덕분에, 복잡한 데이터 처리와 인증/보안까지 무리 없이 소화할 수 있거든요!
1. API란 무엇인가요?
API는 말 그대로 다른 프로그램들이 사용할 수 있도록 만든 입출력 인터페이스예요.
예를 들어:
- 앱이 서버에서 게시글 목록을 불러올 때 →
GET /api/posts
- 글을 등록할 때 →
POST /api/posts
- 특정 글을 수정할 때 →
PUT /api/posts/123
이런 식으로 HTTP 메서드(GET, POST, PUT, DELETE) 를 조합해서 API가 만들어져요.
마치 음식 주문 앱이 주방과 데이터를 주고받는 통로라고 생각하시면 돼요! 🛎️🍱
2. Symfony에서 API를 만드는 기본 방법
Symfony에서는 API를 만들기 위해 다음 요소들을 주로 사용해요:
- 라우팅:
/api/...
경로로 분리 - 컨트롤러: JSON 응답 처리
- Serializer: 객체를 JSON으로 변환
- Validation: 입력값 유효성 검사
- API Platform (선택): 완전 자동화된 API 서버 구성
3. JSON 응답 처리하기
가장 기본적인 API는 JSON 데이터를 반환하는 것입니다.
use Symfony\Component\HttpFoundation\JsonResponse;
#[Route('/api/hello', name: 'api_hello')]
public function hello(): JsonResponse
{
return new JsonResponse([
'message' => '안녕하세요, Symfony API!',
]);
}
결과 예시:
{
"message": "안녕하세요, Symfony API!"
}
4. 객체를 JSON으로 자동 변환하기 (Serializer)
Symfony에서는 Serializer
라는 기능을 사용해서 객체를 JSON으로 바꿀 수 있어요.
설치:
composer require symfony/serializer
사용 예:
use Symfony\Component\Serializer\SerializerInterface;
use App\Entity\Product;
#[Route('/api/product', name: 'api_product')]
public function getProduct(SerializerInterface $serializer): JsonResponse
{
$product = new Product();
$product->setName('마법의 물약');
$product->setPrice(9000);
$json = $serializer->serialize($product, 'json');
return new JsonResponse($json, 200, [], true); // true = 이미 JSON 처리됨
}
5. RESTful API 컨트롤러 예제
#[Route('/api/products', name: 'api_products_list', methods: ['GET'])]
public function list(ProductRepository $repo): JsonResponse
{
$products = $repo->findAll();
return $this->json($products);
}
this->json()
메서드는 Symfony가 제공하는 JSON 변환 단축 함수예요.- 객체 배열도 자동 직렬화됩니다.
6. 요청 데이터 받기 (Request)
사용자가 보낸 JSON 데이터를 파싱하려면 Request
객체를 사용하면 됩니다.
use Symfony\Component\HttpFoundation\Request;
#[Route('/api/products', name: 'api_product_create', methods: ['POST'])]
public function create(Request $request): JsonResponse
{
$data = json_decode($request->getContent(), true);
$product = new Product();
$product->setName($data['name'] ?? '');
$product->setPrice($data['price'] ?? 0);
// 저장 생략
return $this->json(['status' => 'created'], 201);
}
7. 유효성 검사 (Validation)
composer require symfony/validator
엔티티에 어노테이션 추가
use Symfony\Component\Validator\Constraints as Assert;
class Product
{
#[Assert\NotBlank]
private string $name;
#[Assert\Positive]
private float $price;
}
컨트롤러에서 검사:
use Symfony\Component\Validator\Validator\ValidatorInterface;
$errors = $validator->validate($product);
if (count($errors) > 0) {
return $this->json(['errors' => (string) $errors], 400);
}
8. CORS 설정 (Cross-Origin Resource Sharing)
프론트엔드가 다른 도메인에서 요청하면 CORS 문제가 발생할 수 있어요.
CORS 패키지 설치
composer require nelmio/cors-bundle
설정 추가 (config/packages/nelmio_cors.yaml
)
nelmio_cors:
defaults:
allow_origin: ['*']
allow_methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
allow_headers: ['Content-Type', 'Authorization']
max_age: 3600
paths:
'^/api/':
allow_origin: ['*']
9. API 보안 처리 (JWT 인증 등)
API는 세션 기반 로그인보다 토큰 기반 인증(JWT) 을 많이 사용해요.
JWT 인증을 위해 필요한 패키지:
composer require lexik/jwt-authentication-bundle
설정 후, API 요청 시 토큰을 헤더에 추가해서 인증할 수 있습니다.
Authorization: Bearer {your_token}
이 부분은 별도로 다룰만큼 방대한 주제이므로 다음 편에서 더 깊이 설명드릴게요 😊
10. API Platform 소개 (자동 API 생성)
Symfony에서는 API Platform이라는 강력한 도구를 제공합니다.
이걸 사용하면 엔티티 하나만 만들어도 CRUD API가 자동 생성돼요!
composer require api
특징
- 엔티티 기반 자동 API 문서 및 라우팅 생성
- Swagger UI 자동 생성
- 데이터 직렬화/역직렬화 자동 처리
주의할 점 ✅
항목 | 주의사항 |
---|---|
JSON 변환 시 순환 참조 주의 | @Groups 또는 @Ignore 어노테이션 필요 |
API는 CSRF 보호 대상 아님 | 일반 폼과 다르게 동작 |
API는 세션 사용 최소화 | Stateless 원칙 준수 |
HTTP 상태코드 정확히 반환 | 200, 201, 400, 404, 500 등 의미에 맞게 사용 |
입력값 검증 필수 | 서버에서 반드시 Validation 수행 |
요약 정리 🎯
기능 | 방법 |
---|---|
JSON 응답 | new JsonResponse() , $this->json() |
요청 받기 | $request->getContent() 로 JSON 파싱 |
객체 변환 | Serializer로 serialize() |
입력 검증 | Validator 컴포넌트 사용 |
API 인증 | JWT 또는 OAuth 사용 |
자동화 | API Platform 도입 시 빠른 구축 가능 |
마무리하며 😊
Symfony로 API를 개발하면, 가볍게 시작해서 확장성 있게 운영할 수 있는 구조를 갖출 수 있어요.
직접 JSON을 다뤄도 되고, 자동화된 API Platform을 써도 되고요!
또한, 보안과 검증도 함께 고려한 아키텍처 덕분에 유지보수에도 강하답니다 💪
다음 시간에는 Symfony API 개발에 있어 중요한 캐시 처리와 성능 최적화를 알아보겠습니다.
그럼 오늘도 즐거운 Symfony API 개발 되세요~ 🧑💻📡💖