티스토리 뷰

라라벨 모던하게 DTO 사용하기 (feat: Laravel Spring)

필요패키지 : 

# laravel-data
$ composer require spatie/laravel-data
$ php artisan vendor:publish --provider="Spatie\LaravelData\LaravelDataServiceProvider" --tag="data-config"


# laravel-route-attributes
$ composer require spatie/laravel-route-attributes
$ php artisan vendor:publish --provider="Spatie\RouteAttributes\RouteAttributesServiceProvider" --tag="config"

 

 

지금까지 라라벨에 Modren 하게 DTO를 하려는 시도는 많았으나,

많이 어설프거나 오히려 불편했었습니다.

대부분의 한국 개발자들은 언어의 상관없이 Java Spring 을 경험했기 때문에 그 모습을 생각하고 모던 DTO를 접했다가는 실망이 이만저만이 아니었는데.. 이번 PHP8 의 Attirubte (특성)이 생기면서 많이 비슷해졌습니다.

 

위에 패키지를 적용한 Laravel Controller 의 모습

<?php

namespace App\Http\Controllers;

use App\DTO\DogData;
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Prefix;

#[Prefix('dogs')]
class DogController extends Controller
{
    #[Get('/', name: 'dog.index')]
    public function index(): array
    {
        return [
            'type' => 'dog',
            'list' => [],
        ];
    }

    #[Get('/store')]
    public function store(DogData $dto): array
    {
        return [
            'type' => $dto->type,
            'name' => $dto->name,
        ];
    }
}

 

DogData class (DTO)

<?php

namespace App\DTO;

use Spatie\LaravelData\Attributes\Validation as Rule;
use Spatie\LaravelData\Data;

class DogData extends Data
{
    public function __construct(
        #[Rule\Required]
        public ?string $name,

        #[Rule\Min(5)]
        #[Rule\Nullable]
        public ?string $type
    )
    {
    }
}

 

등록된 라우터 리스트의 모습

 

DogData class를 보면, 기존 Rule 검사를 위해서 Custom Request 를 만들었어는데, 이제는 Spring 과 같이 DTO 에서 룰검사를 하는 모습을 보여줍니다. 뿐만 아니라 DogController 에서 PHP8에서 생긴 Attribute 를 이용하면 web.php 나 api.php 에 별도 등록 없이 바로 Route 가 등록되는 모습을 볼수 있습니다.

이제 Laravel 에서도 자바 스프링과 같이 DTO를 모던하게 쓸수 있게 되었는데..

필자는 이 작업을 하면서 좀 회의감이 들었습니다. 확실히 좋아진건 맞는데 이럴거면 내가 왜 PHP 를 하고 있는걸가, 그냥 자바나 코틀린을 하지.. 라는 생각이 드는것은 기분 탓일지...

 

ps..

자바와 유사항 형태의 DTO를 만들기 위해서 패키지를 만들고 있었는데,
이미 있었네요. 역시 spatie 형은 대단해..

댓글


최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday