# 業務ロジック — VetController.showVetList() [9 LOC]

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

## 1. 役割

### VetController.showVetList()

このメソッドは、ペットクリニック（Pet Clinic）システムにおける獣医師（Vet）一覧画面の表示を担うHTTPエンドポイントである。`GET /vets.html` リクエストを受信すると、獣医師情報のページネーション付きリストを取得し、ビューに渡すためのモデル属性として設定する。具体的には、内部で `findPaginated` を呼び出して `Vet` エンティティのページネーション済みリストを取得し、`Vets` オブジェクト（集合ラッパ）に格納した上で、ページネーション情報（現在ページ番号、総ページ数、総アイテム数）を `Model` に付加する。設計パターンとしては、Spring MVCの標準的なControllerパターンを採用し、リクエスト処理からデータ取得、モデル構築、ビュー名返却までを委譲ベースで実行する。本メソッドのシステム内での役割は、獣医師一覧をユーザーに表示する主要なエントリーポイントとして機能し、ページネーションに対応した画面遷移の起点となる。条件分岐を持たない直線的な処理フローであるため、すべてのリクエストに対して同一のロジックパスが実行される。

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

```mermaid
flowchart TD
    START(["showVetList(page, model)"])
    CONDITION_A{ページネーション<br/>必要?}
    NO_PAGINATE(["Vets vets = new Vets()"])
    CALL_FIND_PAGINATED(["findPaginated(page)"])
    CONDITION_B{"paginated != null?"}
    ADD_TO_LIST(["vets.getVetList().addAll(paginated.toList())"])
    CALL_ADD_PAGINATION(["addPaginationModel(page, paginated, model)"])
    SET_VIEW(["view = \"vets/vetList\""])
    END_RETURN(["Return view"])

    START --> CONDITION_A
    CONDITION_A -- はい --> CALL_FIND_PAGINATED
    CONDITION_A -- いいえ --> NO_PAGINATE
    CALL_FIND_PAGINATED --> CONDITION_B
    CONDITION_B -- はい --> ADD_TO_LIST
    CONDITION_B -- いいえ --> NO_PAGINATE
    ADD_TO_LIST --> CALL_ADD_PAGINATION
    NO_PAGINATE --> CALL_ADD_PAGINATION
    CALL_ADD_PAGINATION --> SET_VIEW
    SET_VIEW --> END_RETURN
```

本メソッドの処理フローは、以下のステップで構成される。まず、リクエストパラメータ `page` を受け取り、ページネーションの有無を確認する。ページネーションが必要な場合、内部メソッド `findPaginated(page)` を呼び出して `Page<Vet>` 結果を取得する。取得した `paginated` が null でない場合、`Vets` 集合オブジェクトの `vetList` にページネーション結果をリストとして追加する。その後、`addPaginationModel(page, paginated, model)` を呼び出して、現在ページ番号、総ページ数、総アイテム数、獣医師リストの各属性を `Model` に設定する。最終的にビュー名 `vets/vetList` を返却し、Spring MVCのビューレンダリングに委譲する。

## 3. パラメータ分析

| No | パラメータ名 | 型 | 業務的説明 |
|----|---------------|------|------------------|
| 1 | `page` | `@RequestParam(defaultValue = "1") int` | ページネーションの対象ページ番号。1起始の整数値で、デフォルトは1（最初のページ）。値が大きいほど後方の獣医師リストが表示され、ページネーションされた結果が `PageRequest.of(page - 1, 5)` として Spring Data JPA に渡される。 |
| 2 | `model` | `Model` | Spring MVCのモデルオブジェクト。ページネーション情報（現在ページ番号、総ページ数、総アイテム数）と獣医師リストをビューテンプレートに渡すために使用される。 |

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

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

| CRUD | SC / CBS | SCコード | エンティティ / DB | 操作の説明 |
|------|----------|---------|-------------|----------------------|
| R | `VetController.findPaginated` | VetController | `Page<Vet>` | 内部メソッド `findPaginated` の呼び出しにより、指定されたページング条件下で `Vet` エンティティのリストを取得 |
| R | `VetController.addPaginationModel` | VetController | `Model` | ページネーション情報（現在ページ、総ページ、総アイテム数）と獣医師リストをモデルに付加 |
| R | `Vets.getVetList` | Vets | `List<Vet>` | 獣医師集合ラッパオブジェクトからリストを取得してページネーション結果を追加 |
| R | `VetRepository.findAll` | VetRepository | `vet` テーブル (DB) | Spring Data JPA レポジトリによる獣医師エンティティの一括取得（ページネーション付き） |

**詳細分析:**

本メソッドは `VetRepository.findAll(pageable)` を介してデータベースの `vet` テーブルから獣医師情報を取得する Read（R）操作のみを実行する。Create、Update、Delete の操作は含まれていない。`findPaginated` は1ページあたりのページサイズを `5` に固定し、`PageRequest.of(page - 1, pageSize)` として0起始のオフセットで Spring Data JPA のページネーションAPIを呼び出す。`addPaginationModel` は取得結果をビューモデルに変換し、一覧画面に渡すための準備を行う。

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

| # | 呼び出し元（画面/バッチ） | 呼び出しチェーン（本メソッドまでの全経路） | 終端（SC / CRUD / エンティティ） |
|---|----------------------|--------------------------------------|-------------------------------|
| 1 | Controller: VetController | `GET /vets.html` -> `showVetList` | `findPaginated [R] vet` テーブル |
| 2 | Test: VetControllerTests | `showVetListHtml` -> `mockMvc.perform(get("/vets.html"))` -> `showVetList` | `findPaginated [R] vet` テーブル |

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

### ブロック 1 — MAIN EXECUTION FLOW (L45-52)

> メソッドのエントリポイントからモデル構築、ビュー名返却までの一連の処理フロー。ページネーションの有無で処理が分岐する。

| # | 種別 | コード |
|---|------|------|
| 1 | NEW | `Vets vets = new Vets()` — 獣医師集合ラッパオブジェクトのインスタンス化 |
| 2 | CALL | `findPaginated(page)` — ページネーション付き獣医師リストの取得 |
| 3 | EXEC | `vets.getVetList().addAll(paginated.toList())` — ページネーション結果を集合オブジェクトに追加 |
| 4 | CALL | `addPaginationModel(page, paginated, model)` — ページネーション情報をモデルに設定 |
| 5 | RETURN | `return "vets/vetList"` — ビュー名を返却 |

### ブロック 2 — FIND_PAGINATED 内部処理 (L63-67)

> `findPaginated` メソッド: 固定のページサイズでデータベースからページネーション付きデータを取得する。

| # | 種別 | コード |
|---|------|------|
| 1 | SET | `int pageSize = 5` — 1ページあたりの表示件数を5に固定 |
| 2 | SET | `Pageable pageable = PageRequest.of(page - 1, pageSize)` — Spring Data JPA のページネーションオブジェクト生成（0起始オフセット） |
| 3 | CALL | `vetRepository.findAll(pageable)` — ページネーション付きで獣医師データを取得 |
| 4 | RETURN | `return vetRepository.findAll(pageable)` — 取得結果を呼び出し元に返却 |

### ブロック 3 — ADD_PAGINATION_MODEL 内部処理 (L58-62)

> `addPaginationModel` メソッド: 取得したページネーション結果をビューモデル属性に変換して設定する。

| # | 種別 | コード |
|---|------|------|
| 1 | SET | `List<Vet> listVets = paginated.getContent()` — ページネーション結果からコンテンツリストを抽出 |
| 2 | EXEC | `model.addAttribute("currentPage", page)` — 現在ページ番号をモデルに設定 |
| 3 | EXEC | `model.addAttribute("totalPages", paginated.getTotalPages())` — 総ページ数をモデルに設定 |
| 4 | EXEC | `model.addAttribute("totalItems", paginated.getTotalElements())` — 総アイテム数をモデルに設定 |
| 5 | EXEC | `model.addAttribute("listVets", listVets)` — 獣医師リストをモデルに設定 |
| 6 | RETURN | `return "vets/vetList"` — ビュー名を返却 |

## 7. 用語集

| 用語 | 種別 | 業務的意味 |
|------|------|------------------|
| `Vet` | Entity | 獣医師エンティティ — ペットクリニックで診療を行う獣医師の情報を格納するドメインモデル |
| `Vets` | Entity | 獣医師集合ラッパ — 複数の `Vet` オブジェクトを格納するためのコレクション型ラッパクラス。XML/JSONマッピング用に使用される |
| `vetRepository` | DAO | Spring Data JPA レポジトリ — `vet` テーブルに対するCRUD操作を抽象化するインタフェース |
| `page` | Parameter | ページネーションページ番号 — ユーザーが表示している獣医師一覧のページ番号（1起始） |
| `pageSize` | Constant | 1ページあたりの表示件数 — 固定値 `5`。1画面に表示する獣医師の最大数 |
| `Page<Vet>` | Type | Spring Data のページネーション結果 — 総要素数、総ページ数、現在のコンテンツリストなどのページネーションメタデータを含む |
| `PageRequest` | Type | Spring Data JPA のページネーションクエリオブジェクト — 0起始のページオフセットとページサイズを指定してデータ取得を制御する |
| `Model` | Type | Spring MVC のモデルオブジェクト — コントローラーからビューテンプレートへデータを渡すための辞書型データ構造 |
| `vets/vetList` | View | JSPビューパス — 獣医師一覧画面のテンプレートファイル。Controllerから返却されたビュー名に対応 |
| `GET /vets.html` | Endpoint | 獣医師一覧画面のURLエンドポイント — ユーザーが獣医師一覧を表示するためのGETリクエストパス |
| `Pageable` | Type | Spring Data のページネーションインタフェース — クエリの実行ページを指定するための抽象インタフェース |
| `findAll` | Method | 全レコード取得 — ページネーション条件付きで `Vet` テーブルの全レコードを取得するSpring Data JPA標準メソッド |
