Your Controller Is Doing Too Much Work

컨트롤러를 열어보세요. store 메서드를 확인해 보세요.

코드가 40줄이나 되나요? 거대한 유효성 검사 블록으로 시작해서, 여러 개의 if 문이 이어지고, 비즈니스 로직이 나온 뒤, 마지막에 return으로 끝나나요?

컨트롤러가 자신의 역할이 아닌 일을 하고 있습니다.

컨트롤러의 역할은 단순합니다. 요청을 받고, 문제를 해결하기 위해 서비스를 호출하며, 응답을 반환하는 것입니다. 웨이터를 떠올려 보세요. 웨이터는 음식을 가져다줄 뿐, 직접 요리하지는 않습니다.

컨트롤러 안에 유효성 검사(validation), 권한 부여(authorization), 데이터 처리(data processing)를 모두 넣으면 엉망이 됩니다. 결국 아무도 건드리고 싶어 하지 않는 80줄짜리 괴물을 만들게 됩니다.

Laravel에는 내장된 해결책이 있습니다: Form Request.

모든 메서드에서 유효성 검사와 권한 부여 로직을 반복하는 것을 멈추세요. 단일 책임 원칙(Single Responsibility Principle)을 사용하세요. 클래스는 변경되어야 할 이유가 단 하나여야 합니다. 컨트롤러는 요청 흐름이 바뀔 때 변경되어야 합니다. 단순히 유효성 검사 규칙이 바뀌었다고 해서 컨트롤러가 바뀌어서는 안 됩니다.

전용 Request 클래스를 생성하려면 다음 명령어를 실행하세요: php artisan make:request StorePostRequest

로직을 이 새로운 클래스로 옮기세요. Form Request는 크게 세 가지를 처리합니다:

• Authorization(권한 부여): authorize 메서드를 사용하여 사용자가 작업을 수행할 수 있는지 결정합니다. false를 반환하면 Laravel이 자동으로 403 에러를 보냅니다.

• Validation(유효성 검사): rules 메서드를 사용하여 데이터 요구 사항을 정의합니다.

• Data Preparation(데이터 준비): 유효성 검사가 실행되기 전에 데이터를 정제하거나 변환하려면 prepareForValidation을 사용하세요. 슬러그(slug)를 생성하거나 전화번호 형식을 맞추는(normalize) 작업에 완벽합니다.

이 로직을 옮기고 나면 컨트롤러가 간결해집니다. 다음과 같은 모습이 될 것입니다:

public function store(StorePostRequest $request)
{
    $post = Post::create($request->validated());
    return redirect()->route('posts.show', $post);
}

그게 전부입니다. 단 두 줄이죠.

Laravel이 메서드가 시작되기도 전에 유효성 검사와 권한 부여를 실행하기 때문에 컨트롤러는 가볍게 유지됩니다. 데이터가 잘못되었다면 사용자는 즉시 에러를 받게 됩니다.

주의할 점이 있습니다. 모든 곳에 Form Request를 사용하지는 마세요. 필드가 하나뿐인 아주 간단한 라우트라면 유효성 검사를 인라인(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