클라이언트가 서버로 전송하는 데이터는 절대 신뢰해서는 안 됩니다. 데이터 베이스에 저장하기 전이나 핵심 로직을 수행하기 전에 올바른 형식인지 검증(Validation)하는 것은 보안과 안정성을 위해 필수적입니다. PHP 환경에서는 직관적인 API를 제공하는 RespectValidation 라이브러리를 많이 사용합니다.
1. RespectValidation 설치 및 규칙 정의
가장 먼저 컴포저를 통해 라이브러리를 설치합니다. (composer require respect/validation) 설치 후에는 v::email() 처럼 다양한 검증 조건들을 메서드 체이닝으로 연결하여 직관적으로 규칙을 정의할 수 있습니다.
index.php
<?php
use Respect\Validation\Validator as v;
// 1. 검증 규칙 객체 생성
$usernameValidator = v::alnum()->noWhitespace()->length(4, 15);
$emailValidator = v::email();
// 2. 단일 필드 검증 실행
if (!$usernameValidator->validate($data['username'])) {
return respondWithError($response, '유저명은 4~15자의 영문/숫자여야 합니다.');
}
?>
2. 객체/배열 형태의 전체 폼 검증
실무 API에서는 개별 필드를 하나씩 검증하기보다, v::attribute()나 v::key()를 활용해 전체 페이로드 구조를 한 번에 검증하고 오류를 try-catch 블록으로 잡아내는 패턴이 훨씬 깔끔하고 유지보수하기 좋습니다.
index.php
<?php
use Respect\Validation\Validator as v;
use Respect\Validation\Exceptions\NestedValidationException;
$app->post('/register', function ($request, $response) {
$data = $request->getParsedBody();
// 폼 전체 구조에 대한 규칙 정의
$formValidator = v::attribute('username', v::stringType()->length(3, 15))
->attribute('email', v::email())
->attribute('age', v::intVal()->min(18));
try {
// 객체 전체를 한 번에 검증 시도
$formValidator->assert((object)$data);
$response->getBody()->write(json_encode(["message" => "검증 통과! 가입 진행..."]));
return $response->withStatus(200);
} catch (NestedValidationException $e) {
// 검증 실패 시: 중첩된 에러 메시지들을 배열 형태로 추출
$errors = $e->getMessages();
$response->getBody()->write(json_encode([
"error" => "입력 데이터 형식이 잘못되었습니다.",
"details" => $errors
], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
return $response->withStatus(400)->withHeader('Content-Type', 'application/json');
}
});
?>
{
"error": "입력 데이터 형식이 잘못되었습니다.",
"details": {
"username": "username must have a length between 3 and 15",
"email": "email must be a valid email address",
"age": "age must be greater than or equal to 18"
}
}
✅ 프론트엔드를 배려하는 API 설계
데이터가 유효하지 않을 때, 단순히 "에러 발생"이라고만 반환하지 않고 400 Bad Request 상태 코드와 함께 어떤 필드가 왜 틀렸는지 명시하는 details 배열을 제공해야 합니다. 프론트엔드는 이 구조화된 에러를 바탕으로 각 입력 폼 하단에 친절한 경고 문구를 렌더링할 수 있습니다.
검증 실패 응답 확인
위의 코드 실행 결과에서 볼 수 있듯, 잘못된 형식의 데이터를 POST 요청으로 전송하면 NestedValidationException이 발생하여, 프론트엔드가 즉시 파싱하여 사용자에게 보여줄 수 있는 상세한 에러 배열(details)과 함께 400 Bad Request가 반환됩니다.