# 業務ロジック — VetController.addPaginationModel() [8 LOC]

| 項目 | 値 |
|-------|-------|
| 完全修飾名 | `org.springframework.samples.petclinic.vet.VetController` |
| レイヤー | Controller |
| モジュール | `vet` (パッケージ: `org.springframework.samples.petclinic.vet`) |

## 1. 役割

### VetController.addPaginationModel()

このメソッドは、獣医（Vet）の一覧ページを表示するためのビュー準備ロジックを担う。`showVetList()` メソッドから呼び出され、既にページ分割された獣医データ（`Page<Vet>`）を受け取り、Spring MVC の `Model` オブジェクトに対して画面表示用の属性を付加する。具体的には、現在のページ番号、総ページ数、総アイテム数、および表示対象の獣医リストの4つの属性を `Model` に格納し、ビューテンプレートのパス `"vets/vetList"` を返すことで、Spring MVC のビューレスポルバーが Thymeleaf テンプレート（`src/main/resources/templates/vets/vetList.html`）をレンダリングするよう制御する。

設計パターンとしては、モデルデータとビューテンプレートのパスを一元化する **View Preparation Pattern**（ビュー調整パターン）を採用している。ページネーション表示に必要なメタデータ（ページ番号・総ページ数・総件数）と本体データ（獣医リスト）を1か所に集約することで、ビュー側での複雑な計算を排除し、表示ロジックの単一責任を維持している。

システム全体における役割としては、`/vets.html` エンドポイントから呼ばれる画面遷移の要衝であり、データ層から取得したページ分割結果を Web 画面に表示可能な形式に変換するデータ変換レイヤーとして動作する。`findPaginated()` メソッドがページネーションクエリを実行した結果を、このメソッドがビュー層へブリッジする役割を担っている。

## 2. 処理パターン（詳細業務ロジック）

```mermaid
flowchart TD
    START(["addPaginationModel"])
    STEP1["listVets = paginated.getContent()"]
    STEP2["model.addAttribute(currentPage, page)"]
    STEP3["model.addAttribute(totalPages, getTotalPages())"]
    STEP4["model.addAttribute(totalItems, getTotalElements())"]
    STEP5["model.addAttribute(listVets, listVets)"]
    END_NODE(["Return vets/vetList"])

    START --> STEP1
    STEP1 --> STEP2
    STEP2 --> STEP3
    STEP3 --> STEP4
    STEP4 --> STEP5
    STEP5 --> END_NODE
```

本メソッドは条件分岐を含まない直列処理であり、ページネーションデータの属性抽出から Model への設定、ビュー名の返却までを一連の流れで実行する。

## 3. パラメータ分析

| No | パラメータ名 | 型 | 業務的説明 |
|----|---------------|------|---------------------|
| 1 | `page` | `int` | 現在表示中のページ番号（1起点）。`showVetList()` の `@RequestParam` から渡され、ユーザが選択したページ（1, 2, 3...）を特定する。値は正の整数であり、値が大きいほど総ページ数に応じた後ろのページが表示される。 |
| 2 | `paginated` | `Page<Vet>` | 既にページ分割された獣医コレクション。`findPaginated()` により `VetRepository.findAll()` の実行結果として取得されたページネーションオブジェクト。総件数・総ページ数・現在のページ内容を含む。 |
| 3 | `model` | `Model` | Spring MVC のビューモデルオブジェクト。画面テンプレートに渡すデータ属性（ currentPage, totalPages, totalItems, listVets）を格納するためのコンテナ。 |

## 4. CRUD操作／呼び出しサービス

本メソッドでは外部の CRUD（データベース読み書き）を直接実行しない。`Page<Vet>` オブジェクトは既に呼び出し元（`showVetList()` → `findPaginated()`）で取得済みのため、本メソッドはあくまで Model への属性付加に留まる。

| CRUD | SC / CBS | SCコード | エンティティ / DB | 操作の説明 |
|------|----------|---------|-------------|----------------------|
| R | `paginated.getContent()` | — | Vet（獣医情報） | ページ内の現在ページ分の獣医リストを取得 |
| R | `paginated.getTotalPages()` | — | Vet（獣医情報） | 獣医一覧の総ページ数を取得 |
| R | `paginated.getTotalElements()` | — | Vet（獣医情報） | 獣医一覧の総アイテム数を取得 |

## 5. 依存関係トレース

### コード解析グラフからの事前抽出エビデンス:

| # | 呼び出し元（画面/バッチ） | 呼び出しチェーン（メソッドまでの全経路） | 終端（SC / CRUD / エンティティ） |
|---|----------------------|----------------------------------|-------------------------------|
| 1 | `showVetList()` | `showVetList` -> `addPaginationModel` | `getContent(), getTotalPages(), getTotalElements()` [R] Vet |

## 6. 分岐ごとの詳細ブロック

**ブロック 1** — [処理] `(直列処理: L55〜L61)`

> 条件分岐を含まない直列処理。ページネーションデータから各属性を抽出し、Model に設定後、ビュー名を返却する。

| # | 種別 | コード |
|---|------|------|
| 1 | SET | `List<Vet> listVets = paginated.getContent();` // ページ内の獣医リストを抽出 |
| 2 | SET | `model.addAttribute("currentPage", page);` // 現在ページ番号を Model に設定 |
| 3 | SET | `model.addAttribute("totalPages", paginated.getTotalPages());` // 総ページ数を Model に設定 |
| 4 | SET | `model.addAttribute("totalItems", paginated.getTotalElements());` // 総アイテム数を Model に設定 |
| 5 | SET | `model.addAttribute("listVets", listVets);` // 獣医リストを Model に設定 |
| 6 | RETURN | `return "vets/vetList";` // ビューテンプレートのパスを返す |

## 7. 用語集

| 用語 | 種別 | 業務的意味 |
|------|------|------------------|
| `Vet` | Entity | 獣医情報 — 動物病院で働く獣医師の個人情報を格納するドメインエンティティ |
| `Vets` | Entity | 獣医コレクション — 複数の `Vet` オブジェクトをラップするコンテナオブジェクト（XML/JSON マッピング用） |
| `VetRepository` | DAO | 獣医データアクセスオブジェクト — `Vet` エンティティのデータベース操作を抽象化する Spring Data JPA リポジトリ |
| `Page<Vet>` | 型 | ページ分割コレクション — Spring Data によるページネーション結果。総件数、総ページ数、現在のページ内容を包含 |
| `Model` | 型 | Spring MVC ビューモデル — コントローラーからビューテンプレートへデータを渡すための属性コンテナ |
| `currentPage` | Field | 現在ページ番号 — 画面に表示中のページ番号（1起点） |
| `totalPages` | Field | 総ページ数 — ページネーションにおける全ページ数 |
| `totalItems` | Field | 総アイテム数 — 獣医一覧の全件数 |
| `listVets` | Field | 獣医リスト — 現在ページに表示する獣医オブジェクトのリスト |
| `vets/vetList` | ビューパス | 獣医一覧画面のビューテンプレートパス — `src/main/resources/templates/vets/vetList.html` に対応 |
| `@GetMapping` | アノテーション | Spring MVC の HTTP GET リクエストマッピングアノテーション |
| `@RequestParam` | アノテーション | HTTP リクエストパラメータをメソッド引数にバインドするアノテーション |
