
# 워크플로 템플릿

워크플로 템플릿을 사용하면 워크플로 단계 구조를 한 번 정의하고 이름으로 여러 번 디스패치할 수 있습니다. 동일한 다단계 프로세스를 서로 다른 페이로드로 실행해야 할 때 유용합니다.

## 템플릿 정의

`Queuety::define_workflow()`을 사용해 템플릿을 만든 다음 등록합니다:

```php
use Queuety\Queuety;
use Queuety\Enums\Priority;

$builder = Queuety::define_workflow( 'onboarding' )
    ->on_queue( 'pipelines' )
    ->with_priority( Priority::Normal )
    ->max_attempts( 5 )
    ->then( CreateAccountHandler::class )
    ->then( SendWelcomeEmailHandler::class )
    ->then( NotifyAdminHandler::class );

Queuety::register_workflow_template( $builder );
```

예를 들어 플러그인의 초기화 훅에서 템플릿을 일찍 등록하세요:

```php
add_action( 'init', function () {
    $builder = Queuety::define_workflow( 'onboarding' )
        ->then( CreateAccountHandler::class )
        ->then( SendWelcomeEmailHandler::class )
        ->then( NotifyAdminHandler::class );

    Queuety::register_workflow_template( $builder );
} );
```

## 템플릿 실행

`Queuety::run_workflow()`을 사용해 이름으로 등록된 템플릿을 디스패치합니다:

```php
$workflow_id = Queuety::run_workflow( 'onboarding', [ 'email' => 'user@example.com' ] );
```

두 번째 인수는 빌더의 `->dispatch()`과 마찬가지로 초기 페이로드/상태입니다. 반환되는 정수는 워크플로 ID입니다.

템플릿이 등록되지 않은 경우 `RuntimeException` 예외가 발생합니다.

## 등록된 템플릿 목록 조회

템플릿 레지스트리에 액세스합니다:

```php
$registry = Queuety::workflow_templates();
$template = $registry->get( 'onboarding' ); // WorkflowTemplate or null
```

## 전체 예시

```php
// Register templates on init.
add_action( 'init', function () {
    // User onboarding pipeline
    $onboarding = Queuety::define_workflow( 'onboarding' )
        ->on_queue( 'users' )
        ->then( CreateAccountHandler::class )
        ->then( SetupDefaultsHandler::class )
        ->then( SendWelcomeEmailHandler::class );
    Queuety::register_workflow_template( $onboarding );

    // Content generation pipeline
    $content = Queuety::define_workflow( 'generate_content' )
        ->on_queue( 'llm' )
        ->max_attempts( 5 )
        ->then( BuildPromptHandler::class )
        ->then( CallLLMHandler::class )
        ->then( ReviewOutputHandler::class )
        ->then( PublishHandler::class );
    Queuety::register_workflow_template( $content );
} );

// Dispatch them anywhere in your application.
$wf1 = Queuety::run_workflow( 'onboarding', [ 'email' => 'alice@example.com' ] );
$wf2 = Queuety::run_workflow( 'generate_content', [ 'topic' => 'WordPress performance' ] );
```

## 템플릿과 인라인 워크플로 비교

| | 인라인 워크플로 | 템플릿 |
|---|---|---|
| 정의 | 디스패치 시점에 정의 | 등록 시 한 번 정의 |
| 디스패치 | `Queuety::workflow('name')->then(...)->dispatch()` | `Queuety::run_workflow('name', $payload)` |
| 재사용 | 매번 체인 구성 | 한 번 등록하고 여러 번 디스패치 |
| 적합한 경우 | 일회성 또는 동적으로 구성되는 워크플로 | 표준화된 반복 프로세스 |
