컨트롤러가 잘못된 일을 하고 있습니다
컨트롤러를 여세요. store 메서드를 찾아보세요.
코드가 40줄이나 되나요? 거대한 유효성 검사 블록, 여러 개의 if 문, 비즈니스 로직, 그리고 마지막에 return 문이 보이나요?
당신의 컨트롤러는 하지 말아야 할 일을 하고 있습니다.
컨트롤러의 역할은 단 하나입니다. 요청을 받고, 문제를 해결하기 위해 서비스를 호출하며, 응답을 반환하는 것입니다. 컨트롤러는 요리사가 아니라 웨이터여야 합니다.
컨트롤러 안에 유효성 검사(validation)와 권한 부여(authorization)를 넣으면 코드가 엉망이 됩니다. 결국 아무도 건드리고 싶어 하지 않는 80줄짜리 코드가 되어버리죠.
Laravel에는 내장된 해결책이 있습니다: 바로 Form Request입니다.
흔히 발생하는 잘못된 패턴은 다음과 같습니다:
- 입력 데이터 유효성 검사
- 사용자 권한 확인
- 데이터 변환
- 비즈니스 로직 실행
이는 단일 책임 원칙(Single Responsibility Principle)을 위반합니다. 클래스는 변경되어야 할 이유가 단 하나여야 합니다. 컨트롤러는 요청 흐름이 바뀔 때 변경되어야 합니다. 단순히 유효성 검사 규칙이 바뀌었다고 해서 컨트롤러가 바뀌어서는 안 됩니다.
이를 해결하려면 다음 명령어를 사용하세요:
php artisan make:request StorePostRequest
이 명령어는 요청 로직을 위한 전용 파일을 생성합니다. 다음 세 가지 요소를 Form Request로 옮기세요:
- Authorization:
authorize()메서드를 사용하여 권한을 확인합니다. - Validation:
rules()메서드를 사용하여 데이터 요구 사항을 정의합니다. - Data Preparation:
prepareForValidation()을 사용하여 유효성 검사 전에 데이터를 정제하거나 형식을 맞춥니다.
이제 컨트롤러를 다시 보세요:
public function store(StorePostRequest $request)
{
$post = Post::create($request->validated());
return redirect()->route('posts.show', $post);
}
이제 컨트롤러는 단 두 줄입니다. 다시 웨이터처럼 동작합니다.
Laravel은 컨트롤러 메서드가 시작되기도 전에 권한 부여와 유효성 검사를 자동으로 실행합니다. 유효성 검사에 실패하면 사용자는 즉시 에러를 받게 됩니다.
다음 가이드라인을 따르세요:
- 유효성 검사가 짧고 한 곳에서만 사용된다면 인라인(inline)으로 유지하세요.
- 유효성 검사가 길어지거나, 반복되거나, 권한 부여를 포함한다면 Form Request를 사용하세요.
- Form Request에 비즈니스 로직을 넣지 마세요. 그 역할은 Service 레이어에 맡기세요.
오늘 가장 엉망인 컨트롤러를 찾아보세요. 유효성 검사를 Form Request로 추출하세요. 코드가 줄어드는 것을 확인하실 수 있을 겁니다.
지금까지 본 가장 긴 store 메서드는 무엇이었나요? 댓글로 알려주세요.
Source: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o
