validation과 HTTP status(400,442)

Zain·2024년 7월 12일
post-thumbnail

laravel에서의 validation

validation에 대해 들어가기 전에 먼저 controller - service - model의 개념에 대한 설명

controller

  • 클라이언트의 요청을 받아 라우팅을 담당
  • 요청에 대한 validation 수행
  • service에서 값을 리턴 받아 클라이언트에게 응답

service

  • 비즈니스 로직을 작성
  • 데이터 가공

model

  • DB의 구조를 정의
  • 데이터베이스와 상호작용을 담당

위와 같이 계층별로 역할이 나뉨

이제 validation으로

validation

$validator = Validator::make($request->all(), [
	"name" => "required",
	"age" => "required"
]);

if ($validator->fails()) {
	return $this->fails_msg($validator->errors()->first());
}

위의 코드는 validation을 수행하는 코드

$validator = Validator::make($request->all(), [
	"name" => "required",
	"age" => "required"
]);
        
/*
	"name" => "required",
	request시 전달되는 name값이 required이어야한다.
*/

validation의 조건에는 required말고도 엄청나게 많은 조건들을 제공
라라벨 공식 홈페이지를 참고해보면
굉장히 많은 옵션
(https://laravel.com/docs/11.x/validation#rule-prohibited-unless)

// 유효성검사에 걸린 경우
if ($validator->fails()) {
	return $this->fails_msg($validator->errors()->first());
}

이때 laravel은 422status와 함께 msg를 리턴
msg는 영문으로 되어있으며, 위배된 항목에 대한 설명

$validatedData = $request->validate([
    'name' => 'required|string|max:255',
    'email' => 'required|email|unique:users',
]);

validator이 아닌 validate를 사용해서도 validation을 구현할 수 있음

validator

  • Illuminate\Support\Facades\Validator 클래스
  • 오류를 수동으로 처리
  • 높은 유연성으로 복잡한 시나리오를 다룰 수 있음
  • 복잡하거나 세밀한 제어가 필요한 경우 활용

validate

  • Illuminate\Http\Request 객체
  • 오류를 자동으로 처리
  • 간단한 유효성 검사에 활용

만약, msg가 기본으로 제공되는 영문이 아니라 한글로 전달하고 싶은 경우 커스텀이 가능

$validator = Validator::make($request->all(), [
	'file' => 'required|image|mimes:jpeg,png,jpg|max:2048',
], [
	'file.required' => '파일이 필요합니다.',
    'file.image' => '파일은 이미지여야 합니다.',
    'file.mimes' => '이미지 확장자(jpeg, png, jpg)만 허용됩니다.',
	'file.max' => '이미지 파일 크기는 최대 2MB이어야 합니다.',
]);

if ($validator->fails()) {
	return [
		'status' => 400,
        'data' => [],
        'msg' => $validator->errors()->first()
	];
}

각 validation 조건 별로 메세지를 다르게 설정할 수 있고, 리턴될때 status도 422가 아닌,
상태 값을 다르게 지정할 수 있다

여기서 422가 아닌 400을 쓴 이유는 아래에서...

http응답코드에 대해서 (400, 422)

http응답코드란? (https://developer.mozilla.org/ko/docs/Web/HTTP/Status)

  • 웹 서버가 클라이언트의 요청에 대한 결과를 나타내는 3자리 숫자
  • 코드를 통해 성공 여부, 오류의 종류 등을 나타냄

- 2XX : 요청이 성공적으로 처리

- 4XX : 클라이언트 측 오류

- 5XX : 서버 측 오류

자 여기서 400과 422에 대해

status : 400

  • 잘못된 JSON 데이터를 보낸 경우 ex) {"name": "John", "age": 30,}
  • 잘못된 http메소드를 보낸 경우 ex) POST->GET
  • 헤더 값이 유효하지 않은 경우 / 필수 파라미터 값이 누락된경우

status : 422

  • 400이 아닌, 즉 요청 형식은 올바르지만 유효성 검사에 실패한 경우
  • 유효성 검사 오류를 나타내기 위한 코드

laravel의 공홈, http응답코드 문서에서도 나와 있듯
유효성 검사에 실패한 경우 422를 제공하지만,

오류코드에 대한 컨벤션이 정해져있지 않아

  • 422를 사용하고 프로젝트의 모든 오류코드를 규칙에 맞게 수정
  • 모든 오류코드를 400으로 보냄

두가지 선택지중 일단은 후자를 선택
프로젝트 오픈이 되고 나중에 여유가 된다면 꼭 짚고 넘어갈 생각이다.

profile
Vue, Laravel | TS, JS, PHP, MySQL

0개의 댓글