---
title: VetController.findPaginated
---

# 業務ロジック — VetController.findPaginated() [5 LOC]

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

## 1. 役割

### VetController.findPaginated()

`VetController.findPaginated()` メソッドは、獣医師（Vet）一覧データをページネーション付きで取得するための内部支援メソッドである。このメソッドは、ページャー画面におけるリスト表示の基盤となるデータ取得ロジックを担っている。具体的には、パラメータで受け取ったページ番号をゼロベースのインデックスに変換した上で、Spring Data の `Pageable` 機構を通じてデータベースから指定されたページ数のレコードを切り出して返す。

本メソッドのページサイズ（5件）はハードコードされており、条件分岐や種別による分岐処理は含まない。システム全体における役割としては、獣医師一覧画面（`/vets.html`）の表示準備において、画面上のページネーション情報と併せてデータセットを供給する点に尽きる。`VetController.showVetList()` からのみ呼び出される private メソッドとして実装されており、画面コントローラ内のプレゼンテーション層に属するユーティリティ的な役割を担う。

このメソッドが返す `Page<Vet>` オブジェクトには、切り出された獣医師リストのほか、総ページ数や総アイテム数などのページネーションメタデータも含まれており、呼び出し元はこれをそのまま ViewModel へ転送して画面描画に利用する。

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

```mermaid
flowchart TD
    START(["findPaginated(int page)"])

    SUB1["pageSize = 5"]
    SUB2["PageRequest.of(page - 1, pageSize)"]
    SUB3["vetRepository.findAll(pageable)"]
    RETURN(["return Page<Vet>"])

    START --> SUB1
    SUB1 --> SUB2
    SUB2 --> SUB3
    SUB3 --> RETURN
```

本メソッドには条件分岐が含まれておらず、単純な順次処理のみで構成される。各ステップは以下の通り。

- **ステップ 1**: ページサイズ（5件）をローカル定数 `pageSize` として定義。
- **ステップ 2**: 入力されたページ番号（1ベース）をゼロベースに変換し、`PageRequest` オブジェクトを構築。
- **ステップ 3**: `vetRepository.findAll()` へ `Pageable` を渡してページネーション付きの読み取りを実行。
- **ステップ 4**: 取得した `Page<Vet>` をそのまま呼び出し元へ返却。

## 3. パラメータ分析

| No | パラメータ名 | 型 | 業務的説明 |
|----|---------------|------|---------------------|
| 1 | `page` | `int` | 画面から指定されたページ番号（1ベース）。この値はゼロベースのインデックスに変換された後、ページネーションの起点として使用される。 |
| 2 | `vetRepository` | `VetRepository` | インスタンスフィールド。獣医師データへのアクセスを仲介する Spring Data リポジトリ。このメソッドは `showVetList()` から依存Injected に受け取ったインスタンス経由でデータを取得する。 |

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

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

| CRUD | SC / CBS | SCコード | エンティティ / DB | 操作の説明 |
|------|----------|---------|-------------|----------------------|
| R | `VetRepository.findAll` | VetRepository | Vet | Spring Data JPA の `findAll(Pageable)` を介して `vets` テーブルからページネーション付きで獣医師レコードを読み取る |

### コール階層

| 呼び出し元 | 呼び出された側 | CRUD種別 | 対象データ |
|------------|----------------|---------|------------|
| `VetController.findPaginated` | `VetRepository.findAll(pageable)` | R | Vet（`vets` テーブル） |

- **R: `VetRepository.findAll(pageable)`** — Spring Data JPA が提供するインターフェースメソッド。`@Transactional(readOnly = true)` および `@Cacheable("vets")` アノテーションが付与されており、キャッシュ経由での読取も行う。実態は `vets` データベーステーブルへの SELECT クエリに相当する。

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

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

| # | 呼び出し元（画面/バッチ） | 呼び出しチェーン（メソッドまでの全経路） | 終端（SC / CRUD / エンティティ） |
|---|----------------------|----------------------------------|-------------------------------|
| 1 | Controller:VetController | `VetController.showVetList` -> `VetController.findPaginated` | `findAll` [R] Vet |
| 2 | Controller:VetController | `VetController.showResourcesVetList` -> `VetController.findPaginated` | `findAll` [R] Vet |

### 呼び出し先

| # | 呼び出し先 | 呼び出し先種別 | 対象データ |
|---|-----------|----------------|------------|
| 1 | `VetRepository.findAll(pageable)` | Repository | Vet（`vets` テーブル） |

- `showVetList()` メソッドは `/vets.html` の GET リクエストに対応し、ページネーション情報を付与した獣医師一覧ビュー（`vets/vetList`）を返すために本メソッドを呼び出す。
- `showResourcesVetList()` メソッドは `/vets` の GET リクエストに対応し、JSON 形式の獣医師一覧を返すために本メソッドを呼び出す。

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

### ブロック 1 — 順次処理 (L64-L67)

> ページネーション付きの獣医師リストを取得するための一連の処理。条件分岐は存在せず、単純な順次実行である。

| # | 種別 | コード |
|---|------|------|
| 1 | SET | `int pageSize = 5;` // 1ページあたりの表示件数を5に固定 |
| 2 | SET | `Pageable pageable = PageRequest.of(page - 1, pageSize);` // 1ベースのページ番号を0ベースに変換しPageableを構築 |
| 3 | CALL | `vetRepository.findAll(pageable);` // ページネーション付きでVetエンティティを読み取り |
| 4 | RETURN | `return vetRepository.findAll(pageable);` // Page<Vet>を呼び出し元に返却 |

## 7. 用語集

| 用語 | 種別 | 業務的意味 |
|------|------|------------------|
| `Vet` | Entity | 獣医師 — 動物病院の診療に携わる専門家のドメインエンティティ |
| `Vets` | Entity | 獣医師コレクション — 複数の Vet オブジェクトをまとめて格納するためのラッパークラス。JSON/XML マッピング用に利用 |
| `VetRepository` | Repository | 獣医師データの永続化を抽象化する Spring Data リポジトリインターフェース |
| `Page<Vet>` | Type | ページネーション付きの結果セット。切り出されたリストとメタデータ（総ページ数、総アイテム数）を含む |
| `Pageable` | Interface | Spring Data が提供するページネーション指示のインターフェース。ページ番号とページサイズを指定 |
| `PageRequest` | Class | `Pageable` の実装クラス。ゼロベースのページ番号とページサイズからページネーションパラメータを構築 |
| `pageSize` | Field | 1ページあたりの表示件数。本メソッドではハードコードで5 |
| `vets` | DB Table | 獣医師情報を格納するデータベーステーブル |
| `vet_specialties` | DB Table | 獣医師とその専門分野の多対多関連テーブル |
| `Specialty` | Entity | 獣医師の専門分野（例: 外科、内科）を表すエンティティ |
| `@Cacheable("vets")` | Annotation | VetRepository の findAll メソッドに適用されるSpringキャッシュアノテーション。結果を"vets"という名前のキャッシュストアに格納 |
| `/vets.html` | URL | ページネーション付きの獣医師一覧ビューを配信するHTMLエンドポイント |
| `/vets` | URL | JSON形式の獣医師一覧を配信するRESTエンドポイント |
| `vets/vetList` | View | 獣医師一覧を表示するThymeleafビューテンプレートのパス |
