# 課題B 備品管理システム（Spring Boot）

社内備品の一覧・検索・詳細・貸出ができる Web アプリです。このプロジェクトには意図的な不具合が仕込まれています。AI と一緒にコードを読み、Issue に起こしてから直していく題材です。

## 到達基準

次の3つがそろえば到達です。

1. 不具合を **2件** 修正した
2. ブラウザで、修正前におかしかった画面が正しく表示される
3. `./mvnw test` が `BUILD SUCCESS` で終わる

3件目以降の不具合を探して直すのは発展課題です（`exercises/challenges/ch05_third_bug.md`）。時間内に2件を確実に終わらせてください。

## 技術スタック

- Java 17
- Spring Boot 3.4
- Spring Data JPA + H2 Database（インメモリ）
- Thymeleaf（一覧・詳細の2画面）
- Maven（Maven Wrapper 同梱。Maven のインストールは不要です）

## 起動

VSCode で開くフォルダは常に `handson` です。起動はターミナルから行います。VSCode のメニューの「表示」から「ターミナル」を開き、`kadaiB` に移動してください。

```
# Mac
cd kadaiB
./mvnw spring-boot:run

# Windows PowerShell
cd kadaiB
.\mvnw.cmd spring-boot:run
```

初回はライブラリのダウンロードで数分かかります。研修当日までに一度 `./mvnw -q -DskipTests package` を実行しておくと、当日は数十秒で起動します。

起動後にブラウザで開きます。

- 一覧画面: http://localhost:8080/equipments
- H2 コンソール: http://localhost:8080/h2-console（JDBC URL は `jdbc:h2:mem:equipmentdb`、ユーザー名は `sa`、パスワードは空欄）

停止はターミナルで <kbd>Ctrl</kbd>+<kbd>C</kbd> です。

## 画面と機能

- 一覧: 備品20件を表形式で表示します。備品名の部分一致検索が付いています
- 詳細: 一覧の備品名をクリックすると全項目を表示します。貸出フォームで在庫を減らせます

## 構造

レイヤードアーキテクチャです。

```
controller → service (interface) → serviceImpl → repository → model (JPA Entity)
```

| パス | 役割 |
|---|---|
| `src/main/java/.../controller/EquipmentController.java` | 画面コントローラ |
| `src/main/java/.../service/EquipmentService.java` | ビジネスロジックのインターフェース |
| `src/main/java/.../service/EquipmentServiceImpl.java` | ビジネスロジックの実装 |
| `src/main/java/.../repository/EquipmentRepository.java` | データアクセス |
| `src/main/java/.../model/Equipment.java` | 備品エンティティ |
| `src/main/resources/templates/` | `list.html`（一覧）と `detail.html`（詳細） |
| `src/main/resources/data.sql` | 初期データ20件。書き換えません |
| `src/test/java/` | テストコードの置き場所 |
| `issues/` | Issue（不具合の記録） |

## 業務ルール（5項目）

この5項目が仕様の正本です。実装との食い違いが不具合です。

1. 在庫が5個以下の備品は「要補充」として扱う（5個ちょうども含む）
2. 貸出は在庫の範囲内でのみ可能（在庫を0未満にしてはいけない）
3. 日付の画面表示は `yyyy/MM/dd` 形式に統一する
4. 存在しない備品IDへのアクセスは、エラー画面ではなく「見つかりません」とわかる表示にする
5. 備考が未設定の備品も、詳細画面が正常に表示される

同じ5項目が `CLAUDE.md` の `## 業務ルール（課題B）` にも入ります（演習 A-3 で配置します）。Claude Code は起動時にそれを読むため、依頼のたびにルールを貼り直す必要はありません。

## テスト

テストコードは `src/test/java/com/example/equipment/` に置きます。

```
# Mac は ./mvnw test 、Windows PowerShell は .\mvnw.cmd test
./mvnw test
```

最初から入っているのは受け入れテスト（`EquipmentAcceptanceTest`）と起動確認テスト（`EquipmentApplicationTests`）の2クラスです。受け入れテストは到達基準の判定に使います。**配布時点では失敗するテストがあります。** 不具合を直すと成功に変わります。

受け入れテストの中身は、不具合を自分で探し終えるまで開かないでください。先に読むと、探す時間が成立しません。修正が終わってから `./mvnw test` を実行し、`BUILD SUCCESS` を確認します。

自分で書き足すテストは、対象クラス名 + `Test` の名前で新しいファイルを作ります（例: `EquipmentServiceImplTest`）。直した不具合1件につき最低1つ、何を確かめているかがわかる日本語のコメントを添えて残します。

## Issue の起票

見つけた不具合は `issues/` フォルダに Markdown で起票します。

- ファイル名は `ISSUE_00N_内容がわかる名前.md` の形にします（例: `ISSUE_002_在庫5個の備品に要補充が出ない.md`）
- 見出しは `issues/ISSUE_TEMPLATE.md` の5つ（現象／期待する動作／発生箇所／再現手順／修正方針）を使います。増やしも減らしもしません
- 「期待する動作」には、上の業務ルール5項目のどれに当たるかを書きます
- 修正が終わったら、Issue ファイルの末尾に `## 修正結果` の見出しを足し、変更したファイルと確認方法を書きます

記入例として `issues/ISSUE_001_詳細画面がエラーになる備品がある.md` が入っています。書き方の見本にしてください。

Issue はローカルの Markdown ファイルです。本研修では Git と GitHub を使いません。

## 進め方

| ステップ | やること | 手順書 |
|---|---|---|
| B-0 | 起動して現状を掴む。Skill 3種を配置する | `exercises/exB0_start_kadaiB.md` |
| B-1 | 自動化の提案を出させる | `exercises/exB1_setup_recommender.md` |
| B-2 | Plan モードで調べさせ、不具合を2件見つける | `exercises/exB2_plan_hunt.md` |
| B-3 | Issue を起票する | `exercises/exB3_issue.md` |
| B-4 | 修正して、動かして、テストを通す | `exercises/exB4_fix_and_test.md` |
| B-5 | 自分の Skill を作る | `exercises/exB5_skill_creator.md` |
| B-6 | 脅威モデリングを回す | `exercises/exB6_threat_model.md` |

## やらないこと

- `src/main/resources/data.sql` の書き換え。データを変えて症状を消すのは修正ではありません
- 1つの Issue に複数の修正を混ぜること。差分が読めなくなります
- `Optional` を `.get()` で開くこと。値が無い場合の振る舞いを決めてから書きます
- 依頼していない機能の追加

## つまずいたら

- 起動が3分待っても進まないときは挙手してください。社内ネットワークの経路で外部リポジトリに繋がらない場合があります
- エラー画面が出たら、ターミナルに出ているスタックトレースの一番上の行を Claude Code に貼り付けて、意味を説明させてください
- 詰まったときの参考プロンプトは `hints/` にあります
