> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Dumpable 트레이트

> Illuminate\Support\Traits\Dumpable로 임의의 클래스에 dump() / dd()를 추가하고, 체인을 무너뜨리지 않고 디버깅하는 방법을 해설합니다.

## Dumpable 트레이트란

`Illuminate\Support\Traits\Dumpable`은 임의의 클래스에 `dump()`와 `dd()`를 추가하기 위한 작은 트레이트입니다. Laravel 10에서 도입되었고, Collection·Eloquent Builder·Request 등 Laravel 코어의 디버깅 경험을 통일하기 위해 널리 사용되고 있습니다.

목적은 단순합니다. 오브젝트를 `var_dump` 상당으로 확인하면서, 필요하다면 그 자리에서 처리를 중단하는 것입니다.

```mermaid theme={null}
flowchart TD
    A["오브젝트에서 dump()/dd() 호출"] --> B{"어느 쪽을 호출했는가?"}
    B -- "dump()" --> C["$this 와 추가 인수를 출력"]
    C --> D["처리 계속"]
    B -- "dd()" --> E["$this 와 추가 인수를 출력"]
    E --> F["처리 종료"]
```

## 구현 확인하기

구현은 매우 단순해서 `dump($this, ...$args)`와 `dd($this, ...$args)`를 호출할 뿐입니다.

```php theme={null}
trait Dumpable
{
    public function dump(...$args): static
    {
        dump($this, ...$args);
        return $this;
    }

    public function dd(...$args): never
    {
        dd($this, ...$args);
    }
}
```

<Info>
  Laravel 13의 구현은 `src/Illuminate/Support/Traits/Dumpable.php`에 있습니다. 실제 시그니처는 PHPDoc으로 `@return $this`와 `@return never`를 표현하고 있습니다.
</Info>

## 자체 클래스에서 사용하기

`use Dumpable;`을 추가하는 것만으로, 인스턴스 메서드로서 `dump()` / `dd()`를 사용할 수 있습니다.

```php theme={null}
use Illuminate\Support\Traits\Dumpable;

class UserData
{
    use Dumpable;
    
    public function __construct(
        public readonly string $name,
        public readonly string $email,
    ) {}
}

$user = new UserData('Taro', 'taro@example.com');

$user->dump(); // dumpして続行
$user->dd();   // dumpして終了
```

## 체인 중간에 디버그 끼워 넣기

`dump()`는 `static`(구현상 `$this`)을 반환하므로, 메서드 체인 도중에 안전하게 사용할 수 있습니다.

```php theme={null}
$result = collect([1, 2, 3])
    ->map(fn ($n) => $n * 2)
    ->dump()  // ここで中身を確認
    ->filter(fn ($n) => $n > 2)
    ->values();
```

`dd()`로 바꾸면 그 지점에서 처리가 멈추므로, 무거운 후속 처리 이전에 상태를 확인하고 싶을 때 편리합니다.

## 패키지 개발에서의 활용

자체 Value Object·DTO·Builder에 `Dumpable`을 넣어 두면, 사용자가 추가 도구 없이도 상태를 확인할 수 있습니다.

<Steps>
  <Step title="Value Object / DTO에 추가하기">
    ```php theme={null}
    use Illuminate\Support\Traits\Dumpable;

    final class InvoiceData
    {
        use Dumpable;

        public function __construct(
            public readonly string $number,
            public readonly int $total,
        ) {}
    }
    ```
  </Step>

  <Step title="Fluent Builder 도중에 확인하기">
    ```php theme={null}
    $payload = (new PackageRequestBuilder)
        ->forUser($userId)
        ->withLocale('ja')
        ->dump('before send')
        ->toArray();
    ```
  </Step>
</Steps>

## 추가 인수 전달하기

`Dumpable`은 내부에서 `dump($this, ...$args)` / `dd($this, ...$args)`를 호출하므로, 문맥 정보를 함께 출력할 수 있습니다.

```php theme={null}
$user->dump('デバッグポイントA');
// $this と 'デバッグポイントA' が同時に出力される
```

이는 여러 곳에서 `dump()`를 사용할 때 유용합니다. 어느 지점에서 출력되었는지 즉시 판별할 수 있습니다.

## 관련 트레이트

<Columns cols={3}>
  <Card title="tap() 헬퍼 / Tappable" icon="hand-point-up" href="/ko/advanced/tap">
    부수 효과를 끼워 넣으면서 값을 반환하는 패턴을 배웁니다.
  </Card>

  <Card title="Conditionable 트레이트" icon="git-branch" href="/ko/advanced/conditionable">
    조건부로 체인 처리를 분기하는 설계를 배웁니다.
  </Card>

  <Card title="Macroable 트레이트" icon="puzzle-piece" href="/ko/advanced/macroable">
    기존 클래스를 확장하여 고유 메서드를 추가하는 방법을 배웁니다.
  </Card>
</Columns>


## Related topics

- [Macroable 트레이트](/ko/advanced/macroable.md)
- [Conditionable 트레이트](/ko/advanced/conditionable.md)
- [InteractsWithData 트레이트](/ko/advanced/interacts-with-data.md)
- [InteractsWithTime 트레이트](/ko/advanced/interacts-with-time.md)
- [ForwardsCalls 트레이트](/ko/advanced/forwards-calls.md)
