
# 실행 없이 미리보기

`DryRun::generate()`은 값이 인라인으로 삽입된 사람이 읽을 수 있는 SQL 문을 생성합니다. 데이터베이스에 적용하기 전에 병합이 어떤 작업을 수행할지 검토할 때 사용하세요.

```php
use Merql\Apply\DryRun;

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}
```

미리보기에는 결과의 각 작업에 대한 문이 포함되며, `Applier`이 작업을 묶는 방식대로 삽입, 업데이트, 삭제 순으로 그룹화됩니다. 병합의 전체 결과에는 양쪽의 기준 대비 모든 변경 사항이 포함되며, 기준 상태를 그대로 유지하는 데이터베이스에서 `Merql::apply()`이 실행할 내용입니다. 적용할 작업의 문만 보려면 [선택한 결과](https://merql.inline0.dev/ko/docs/merge/plans)를 미리 보세요.

## 출력 예시

```sql
INSERT INTO `posts` (`id`, `title`, `content`, `status`) VALUES ('42', 'New Post', 'Body text', 'draft');
UPDATE `posts` SET `title` = 'Updated Title', `status` = 'publish' WHERE `id` = '42';
DELETE FROM `posts` WHERE `id` = '99';
```

업데이트는 작업에 포함된 모든 비식별 열을 설정하며 변경된 열만 설정하지는 않습니다. 설정할 열이 없는 업데이트는 제외됩니다.

## 값 형식

모든 값은 작은따옴표로 감쌉니다. 안전하게 표시하기 위해 특수 문자를 이스케이프합니다:

| 문자 | 이스케이프 결과 |
|---|---|
| `\` (백슬래시) | `\\` |
| `'` (작은따옴표) | `''` |
| `\0` (널 바이트) | `\0` |
| `\n` (줄바꿈) | `\n` |
| `\r` (캐리지 리턴) | `\r` |

NULL 값은 따옴표 없는 리터럴 `NULL`로 표시됩니다:

```sql
UPDATE `posts` SET `subtitle` = NULL WHERE `id` = '42';
```

## 매개변수

`DryRun::generate()`은 `SqlGenerator::generate()`과 같은 매개변수를 받습니다:

```php
$statements = DryRun::generate(
    $result,
    base: $baseSnapshot,
    fkDependencies: ['comments' => ['posts']],
    driver: new SqliteDriver(),
);
```

| 매개변수 | 유형 | 설명 |
|---|---|---|
| `$result` | `MergeResult` | 미리 볼 병합 결과입니다. |
| `$base` | `?Snapshot` | 식별자 열의 기준 스냅샷입니다. 기본값은 `$result->baseSnapshot()`입니다. |
| `$fkDependencies` | `array` | 순서 지정을 위한 외래 키 종속성 맵입니다. |
| `$driver` | `?Driver` | 식별자 인용을 위한 데이터베이스 드라이버입니다. |

## Dry run과 SqlGenerator 비교

`DryRun`은 `SqlGenerator`을 감쌉니다. 차이점은 다음과 같습니다:

- `SqlGenerator::generate()`은 어댑터에서 준비된 문을 실행하기 위한 `['sql' => '...', 'params' => [...]]` 배열을 반환합니다.
- `DryRun::generate()`는 사람이 읽을 수 있도록 값이 삽입된 평면 문자열을 반환합니다.

실행 없이 미리보기 결과를 SQL로 실행하지 마세요. 안전한 실행이 아닌 표시용 형식입니다. 병합을 실행하려면 준비된 문을 사용해 `Applier` 또는 `SqlGenerator`를 직접 사용하세요.

## 파사드 사용

파사드를 통해 병합 결과를 캡처하고 미리 봅니다:

```php
use Merql\Merql;
use Merql\Apply\DryRun;

$result = Merql::merge('base', 'ours', 'theirs');

$statements = DryRun::generate($result);

foreach ($statements as $sql) {
    echo "{$sql};\n";
}
```

또는 CLI에서 `--dry-run` 플래그와 함께:

```bash
vendor/bin/merql merge base ours theirs --dry-run
```

CLI은 외래 키 순서 지정이나 드라이버 없이 문을 출력하므로, 데이터베이스에 관계없이 식별자에는 기본 백틱 인용을 사용합니다. 식별자 열을 위해 기준 스냅샷을 전달합니다. 병합은 `Merql::merge()`처럼 열 수준으로 수행됩니다.
