"Laravel 유효성 검증"의 두 판 사이의 차이

231번째 줄: 231번째 줄:


===유효성 검증 오류 응답 형식===
===유효성 검증 오류 응답 형식===
애플리케이션에서 <code>Illuminate\Validation\ValidationException</code> 예외가 발생하고 들어오는 HTTP 요청이 JSON 응답을 예상하는 경우, Laravel은 자동으로 오류 메시지를 형식화하여 <code>422 Unprocessable Entity</code> HTTP 응답을 반환합니다.
아래에서는 유효성 검증 오류에 대한 JSON 응답 형식의 예시를 볼 수 있습니다. 중첩된 오류 키는 "점" 표기법 형식으로 평탄화된다는 점에 유의하세요.
<syntaxhighlight lang='json'>
{
    "message": "The team name must be a string. (and 4 more errors)",
    "errors": {
        "team_name": [
            "The team name must be a string.",
            "The team name must be at least 1 characters."
        ],
        "authorization.role": [
            "The selected authorization.role is invalid."
        ],
        "users.0.email": [
            "The users.0.email field is required."
        ],
        "users.2.email": [
            "The users.2.email must be a valid email address."
        ]
    }
}
</syntaxhighlight>


==폼 요청 유효성 검증==
==폼 요청 유효성 검증==

2024년 6월 19일 (수) 20:18 판

1 개요

Laravel Validation
라라벨 밸리데이션, 유효성 검증, 유효성 검사

https://laravel.com/docs/11.x/validation

Crystal Clear action info.png 작성 중인 문서입니다.


2 소개

Laravel은 애플리케이션으로 들어오는 데이터를 검증하기 위해 여러 가지 접근 방식을 제공합니다. 가장 일반적으로는 모든 들어오는 HTTP 요청에서 사용할 수 있는 validate 메소드를 사용하는 방법이 있습니다. 그러나 여기서는 다른 검증 접근 방식들도 함께 논의할 것입니다.

Laravel은 데이터에 적용할 수 있는 다양한 편리한 검증 규칙을 포함하고 있으며, 특정 데이터베이스 테이블에서 값이 고유한지 검증할 수 있는 기능도 제공합니다. Laravel의 모든 검증 기능에 익숙해질 수 있도록 각 검증 규칙을 자세히 다룰 것입니다.

3 유효성 검증 빠른 시작

Laravel의 강력한 유효성 검사 기능을 배우기 위해, 폼을 검증하고 사용자에게 오류 메시지를 표시하는 전체 예제를 살펴보겠습니다. 이 고수준 개요를 통해 Laravel을 사용하여 들어오는 요청 데이터를 검증하는 방법에 대한 좋은 일반적인 이해를 얻을 수 있을 것입니다:

3.1 라우트 정의

먼저, routes/web.php 파일에 다음과 같은 라우트가 정의되어 있다고 가정해 보겠습니다:

use App\Http\Controllers\PostController;
 
Route::get('/post/create', [PostController::class, 'create']);
Route::post('/post', [PostController::class, 'store']);

GET 라우트는 사용자가 새로운 블로그 포스트를 작성할 수 있는 폼을 표시하고, POST 라우트는 새로운 블로그 포스트를 데이터베이스에 저장합니다.

3.2 컨트롤러 생성

다음으로, 이러한 경로로 들어오는 요청을 처리하는 간단한 컨트롤러를 살펴보겠습니다. store 메소드는 아직 비워둡니다:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class PostController extends Controller
{
    /**
     * 새 블로그 게시물을 작성하는 폼을 보여줍니다.
     */
    public function create(): View
    {
        return view('post.create');
    }

    /**
     * 새 블로그 게시물을 저장합니다.
     */
    public function store(Request $request): RedirectResponse
    {
        // 블로그 게시물을 검증하고 저장합니다...

        $post = /** ... */

        return to_route('post.show', ['post' => $post->id]);
    }
}

3.3 유효성 검증 로직 작성

이제 새 블로그 게시물을 유효성 검증할 로직을 store 메소드에 작성할 준비가 되었습니다. 이를 위해 Illuminate\Http\Request 객체에서 제공하는 validate 메소드를 사용할 것입니다. 유효성 검증 규칙을 통과하면 코드가 정상적으로 계속 실행됩니다. 그러나 유효성 검증이 실패하면 Illuminate\Validation\ValidationException 예외가 발생하고 사용자에게 적절한 오류 응답이 자동으로 반환됩니다.

전통적인 HTTP 요청 중 유효성 검증이 실패하면 이전 URL로 리디렉션 응답이 생성됩니다. 들어오는 요청이 XHR 요청인 경우 유효성 검증 오류 메시지를 포함한 JSON 응답이 반환됩니다.

validate 메소드를 더 잘 이해하기 위해 store 메소드로 돌아가 봅시다:

/**
 * 새로운 블로그 게시물 저장.
 */
public function store(Request $request): RedirectResponse
{
    $validated = $request->validate([
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

    // 블로그 게시물 유효성 검증 통과...

    return redirect('/posts');
}

보다시피, 검증 규칙이 validate 메소드에 전달됩니다. 모든 사용 능한 검증 규칙은 문서화되어 있으니 걱정하지 마십시오. 검증에 실패하면 적절한 응답이 자동으로 생성됩니다. 검증에 성공하면 컨트롤러는 정상적으로 실행을 계속합니다.

또한 검증 규칙은 |로 구분된 문자열 대신 규칙 배열로 지정할 수 있습니다:

$validatedData = $request->validate([
    'title' => ['required', 'unique:posts', 'max:255'],
    'body' => ['required'],
]);


또한, validateWithBag 메소드를 사용하여 요청을 검증하고, 오류 메시지를 명명된 오류 백에 저장할 수 있습니다:

$validatedData = $request->validateWithBag('post', [
    'title' => ['required', 'unique:posts', 'max:255'],
    'body' => ['required'],
]);
첫 번째 유효성 검증 실패 시 중지하기

때로는 첫 번째 유효성 검증 실패 후 해당 속성에 대한 유효성 검증 규칙 실행을 중지하고 싶을 수 있습니다. 이를 위해 속성에 bail 규칙을 할당할 수 있습니다:

$request->validate([
    'title' => 'bail|required|unique:posts|max:255',
    'body' => 'required',
]);

이 예시에서, title 속성의 unique 규칙이 실패하면 max 규칙은 검증하지 않습니다. 규칙은 할당된 순서대로 유효성이 검증됩니다.

중첩된 속성에 관한 노트

만약 들어오는 HTTP 요청에 "중첩된" 필드 데이터가 포함되어 있다면, "점(dot)" 구문을 사용하여 이 필드들을 유효성 검증 규칙을 지정할 수 있습니다:

$request->validate([
    'title' => 'required|unique:posts|max:255',
    'author.name' => 'required',
    'author.description' => 'required',
]);

반면에, 필드 이름에 실제 점(점 문자)이 포함된 경우에는, 백슬래시로 점을 이스케이프하여 "점(dot)" 구문으로 해석되는 것을 명시적으로 방지할 수 있습니다:

$request->validate([
    'title' => 'required|unique:posts|max:255',
    'v1\.0' => 'required',
]);

3.4 유효성 검증 오류 표시

그래서 들어오는 요청 필드가 주어진 유효성 검증 규칙을 통과하지 못하면 어떻게 될까요? 앞서 언급한 바와 같이, Laravel은 자동으로 사용자를 이전 위치로 리디렉션합니다. 또한, 모든 유효성 검증 오류와 요청 입력이 자동으로 세션에 플래시됩니다.

Illuminate\View\Middleware\ShareErrorsFromSession 미들웨어는 $errors 변수를 애플리케이션의 모든 뷰와 공유하는데, 이 미들웨어는 웹 미들웨어 그룹에 의해 제공됩니다. 이 미들웨어가 적용되면 $errors 변수는 항상 뷰에서 사용할 수 있으며, 이를 통해 $errors 변수가 항상 정의되어 안전하게 사용할 수 있다고 가정할 수 있습니다. $errors 변수는 Illuminate\Support\MessageBag의 인스턴스가 됩니다. 이 객체를 사용하는 방법에 대한 자세한 정보는 해당 문서를 참고하세요.

이 예제에서, 유효성 검증이 실패하면 사용자는 컨트롤러의 create 메소드로 리디렉션되어 뷰에서 오류 메시지를 표시할 수 있게 됩니다:

/resources/views/post/create.blade.php
<h1>Create Post</h1>

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

<!-- 게시물 작성  -->
오류 메시지 커스터마이징

Laravel의 빌트인 유효성 검증 규칙 각각에는 애플리케이션의 lang/en/validation.php 파일에 위치한 오류 메시지가 있습니다. 애플리케이션에 lang 디렉토리가 없다면, lang:publish Artisan 명령어를 사용하여 Laravel에게 이를 생성하도록 지시할 수 있습니다.

lang/en/validation.php 파일 안에서는 각 유효성 검증 규칙에 대한 번역 항목을 찾을 수 있습니다. 애플리케이션의 필요에 따라 이 메시지들을 자유롭게 변경하거나 수정할 수 있습니다.

또한, 이 파일을 다른 언어 디렉토리로 복사하여 애플리케이션의 언어에 맞게 메시지를 번역할 수도 있습니다. Laravel 현지화에 대해 더 알고 싶다면, 전체 현지화 문서를 참고하세요.

Warning

기본적으로, Laravel 애플리케이션 스켈레톤에는 lang 디렉토리가 포함되어 있지 않습니다. Laravel의 언어 파일을 커스터마이징하려면, lang:publish Artisan 명령어를 통해 이를 게시할 수 있습니다.

XHR 요청 및 유효성 검증

이 예제에서는 전통적인 폼을 사용하여 데이터를 애플리케이션으로 전송했습니다. 그러나 많은 애플리케이션은 JavaScript 기반 프론트엔드에서 XHR 요청을 받습니다. XHR 요청 중에 validate 메소드를 사용할 때, Laravel은 리디렉션 응답을 생성하지 않습니다. 대신, Laravel은 모든 유효성 검증 오류를 포함하는 JSON 응답을 생성합니다. 이 JSON 응답은 422 HTTP 상태 코드와 함께 전송됩니다.

@error 지시어

@error Blade 지시어를 사용하여 주어진 속성에 대한 유효성 검증 오류 메시지가 존재하는지 빠르게 확인할 수 있습니다. @error 지시어 내에서 $message 변수를 출력하여 오류 메시지를 표시할 수 있습니다:

/resources/views/post/create.blade.php
<label for="title">Post Title</label>

<input id="title"
    type="text"
    name="title"
    class="@error('title') is-invalid @enderror">

@error('title')
    <div class="alert alert-danger">{{ $message }}</div>
@enderror

명명된 오류 백을 사용하는 경우, @error 지시어의 두 번째 인수로 오류 백의 이름을 전달할 수 있습니다:

<input ... class="@error('title', 'post') is-invalid @enderror">

3.5 폼 다시 채우기

Laravel이 유효성 검증 오류로 인해 리디렉션 응답을 생성할 때, 프레임워크는 자동으로 요청의 모든 입력을 세션에 플래시합니다. 이렇게 하면 다음 요청 시 입력을 편리하게 액세스하고 사용자가 제출하려고 했던 폼을 다시 채울 수 있습니다.

이전 요청에서 플래시된 입력을 검색하려면 Illuminate\Http\Request 인스턴스에서 old 메소드를 호출합니다. old 메소드는 세션에서 이전에 플래시된 입력 데이터를 가져옵니다:

$title = $request->old('title');

Laravel은 또한 글로벌 old 헬퍼를 제공합니다. 블레이드 템플릿 내에서 이전 입력을 표시하는 경우, old 헬퍼를 사용하여 폼을 다시 채우는 것이 더 편리합니다. 주어진 필드에 대한 이전 입력이 없는 경우 null이 반환됩니다:

<input type="text" name="title" value="{{ old('title') }}">

3.6 선택적 필드 참고사항

기본적으로, Laravel은 TrimStringsConvertEmptyStringsToNull 미들웨어를 애플리케이션의 글로벌 미들웨어 스택에 포함시킵니다. 이로 인해, null 값을 유효하지 않은 것으로 간주하지 않도록 하려면 "선택적(optional)" 요청 필드를 nullable로 표시해야 할 때가 많습니다. 예를 들면 다음과 같습니다:

$request->validate([
    'title' => 'required|unique:posts|max:255',
    'body' => 'required',
    'publish_at' => 'nullable|date',
]);

이 예시에서는 publish_at 필드가 null이거나 유효한 날짜 표현일 수 있음을 명시하고 있습니다. 규칙 정의에 nullable 수정자를 추가하지 않으면, 유효성 검증기는 null을 유효하지 않은 날짜로 간주할 것입니다.

3.7 유효성 검증 오류 응답 형식

애플리케이션에서 Illuminate\Validation\ValidationException 예외가 발생하고 들어오는 HTTP 요청이 JSON 응답을 예상하는 경우, Laravel은 자동으로 오류 메시지를 형식화하여 422 Unprocessable Entity HTTP 응답을 반환합니다.

아래에서는 유효성 검증 오류에 대한 JSON 응답 형식의 예시를 볼 수 있습니다. 중첩된 오류 키는 "점" 표기법 형식으로 평탄화된다는 점에 유의하세요.

{
    "message": "The team name must be a string. (and 4 more errors)",
    "errors": {
        "team_name": [
            "The team name must be a string.",
            "The team name must be at least 1 characters."
        ],
        "authorization.role": [
            "The selected authorization.role is invalid."
        ],
        "users.0.email": [
            "The users.0.email field is required."
        ],
        "users.2.email": [
            "The users.2.email must be a valid email address."
        ]
    }
}

4 폼 요청 유효성 검증

4.1 폼 요청 생성

4.2 폼 요청 인가

4.3 오류 메시지 커스터마이징

4.4 유효성 검증 입력 준비

5 수동 유효성 검증기 생성

5.1 자동 리디렉션

5.2 명명된 오류 백

5.3 오류 메시지 커스터마이징

5.4 추가 유효성 검증 수행

6 유효성 검증된 입력 다루기

7 오류 메시지 다루기

7.1 언어 파일에서 사용자 정의 메시지 지정

7.2 언어 파일에서 속성 지정

7.3 언어 파일에서 값 지정

8 사용가능한 유효성 검증 규칙

9 조건부 규칙 추가

10 배열 유효성 검증

10.1 중첩 배열 입력 유효성 검증

10.2 오류 메시지 인덱스 및 위치

11 파일 유효성 검증

12 패스워드 유효성 검증

13 커스텀 유효성 검증 규칙

13.1 규칙 객체 사용

13.2 클로저 사용

13.3 암시적 규칙

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}