DAY 1

ハンズオンガイド Day1
Copilot基礎とJava実装

手を動かす時間で画面の横に開いて使う進行ガイドです。今どのセッションで何をどの順番でやるかを示します。

2026年7月15日(水)
9:00 - 17:00
GitHub Copilot + Java
タイムテーブル
01

本日のゴールとオリエンテーション[30min]

研修の進め方と配布物を確認します。

座学

生成AIリテラシーとガバナンス(理解度確認テストを含む)[80min]

ガバナンスの座学と確認テストです。詳細は座学編で扱います。

休憩

休憩[10min]

短い休憩をはさみます。

05

環境セットアップと Copilot 基本操作[90min]

題材の確認と起動(SESSION 03)、開始前チェック(SESSION 04)を済ませ、補完・Chat・スラッシュコマンドを練習します。

休憩

昼休憩[60min]

午後はすべてハンズオンに使います。

06-1

Java コード生成ハンズオン[90min]

演習1 DTO・演習2 Repository・演習3 Service CRUD です。

休憩

休憩[10min]

演習3と演習4の間の短い休憩です。

06-2

コードレビュー演習[80min]

演習4 動くけれど危ないコードをレビューで見抜きます。

07

Day1 振り返り[30min]

到達チェックと提出物の確認です。

SESSION 01

本日のゴール

Day1が終わったとき、次の状態になっていることを目指します。完璧に書けることより、Copilotの提案を読んで採否を判断できることを重視します。

01 到達したい状態

この資料の使い方

手順そのものは配布フォルダの exercises 内の各 md に詳しく書いてあります。このガイドは今どのセッションで何をどの順番でやるかを示す地図です。画面の横に開いて進めてください。

SOURCES
SESSION 02

ハンズオン共通ルール

演習に入る前に、ここだけは全員で揃えます。つまずきの大半はどのフォルダを開いているかで起きます。最初にこの章を読んでください。

01 作業フォルダを VSCode で開く

配布された id-task-app-starter フォルダを、VSCode のファイル → フォルダーを開く(Open Folder)で開きます。フォルダの中の1ファイルだけを開くのではなく、フォルダごと開いてください。Copilot はフォルダ全体を見て提案するため、開く単位がずれると的外れな提案が増えます。

フォルダーを開く(Open Folder)で id-task-app-starter を開いた画面
図1:フォルダーを開く(Open Folder)でプロジェクトを開いた画面
id-task-app-starter/ このフォルダをフォルダーを開くで開く ├── pom.xml ├── memo.md 予想・気づきを書く(自分用メモ) ├── exercises/ 各演習の詳しい手順 │ ├── ex01-dto.md │ ├── ex02-repository.md │ ├── ex03-service-crud.md │ └── ex04-review.md ├── hints/ 答え合わせ用の参考プロンプト └── src/main/java/jp/idhd/taskapp/ ├── domain/ repository/ service/ controller/ dto/

02 予想と気づきは memo.md に書く

各演習で Copilot はどう書いてくると思うかを先に予想し、実際の結果と照らし合わせます。予想と気づきは memo.md に書きます。memo.md は配布フォルダに最初から入っていて、## 演習1## 演習7 の見出しが用意してあります。該当の見出しの下に書き足してください。手を動かすだけでなく、予想と結果の差を残すことで理解が定着します。

03 新しいファイルの作り方と保存

演習で新規ファイルを作るときは、エクスプローラー(左側のファイル一覧)で対象フォルダを右クリック → 新しいファイル(New File)を選び、ファイル名を入力します。たとえば dto フォルダを右クリックして TaskDto.java と入力します。

Copilot Chat に出たコードは、コードブロック右上の Apply(適用)や Insert(挿入)で対象ファイルに反映します。インライン補完なら Tab、インラインチャットの提案なら Accept(採用)を押します。反映したら Ctrl+S(Mac は Cmd+S)で保存します。保存しないとコンパイルに反映されません。

プロンプトの入力先

Copilot への指示(プロンプト)は、サイドパネルの Copilot Chat 入力欄、またはコード上で起動するインラインチャットに直接打ち込みます。このガイドや exercises の md にある指示文を、Chat にそのまま貼り付けて構いません。

うまくいかない・元に戻したいとき

Copilot Chat に「今の変更を元に戻して」「さっきのコードに戻して」と頼めば戻せます。キーボードの Ctrl+Z(Mac は Cmd+Z)でも戻せます。失敗しても壊れません。気軽に試してください。

つまずいたら最初に確認

提案が変、補完が出ない、コンパイルが通らない。そのほとんどは開いているフォルダが違うことが原因です。VSCode 左上のフォルダ名が id-task-app-starter になっているか、まず確認してください。

進め方の前提

本研修は一人で進める個人ワークです。詰まったら5分ほど自分で試してから、各部屋のサブ講師に声をかけてください。最初の5分の試行錯誤が一番伸びます。

SOURCES
SESSION 03

題材プロジェクトの構造

演習で触る id-task-app は、タスクを登録・一覧表示する小さな Web アプリです。Java スクラッチ研修で触れた Spring Boot と同じ構成です。

01 パッケージ構成

src/main/java/jp/idhd/taskapp/ ├── TaskAppApplication.java 起動の入り口(完成済み) ├── domain/ │ ├── Task.java タスクのEntity(完成済み) │ └── TaskStatus.java ステータスのEnum(完成済み) ├── exception/ │ └── TaskNotFoundException.java 見つからない例外(完成済み) ├── repository/ │ └── TaskRepository.java データ取得(演習2でメソッド追加) ├── service/ │ └── TaskService.java 処理の中身(演習3で実装) ├── controller/ │ └── TaskController.java Web層(完成済み・演習7で1か所修正) └── dto/ 空。演習1でTaskDtoを作る

02 tasks テーブル

アプリが扱うデータの形です。Entity の Task.java がこのテーブルに対応します。

カラム説明
idBIGINT(自動採番)タスクID
titleVARCHAR(120) NOT NULLタイトル(必須)
descriptionTEXT説明
statusVARCHAR(TODO / DOING / DONE)ステータス
due_dateDATE期限
created_atTIMESTAMP作成日時
updated_atTIMESTAMP更新日時

03 起動手順

VSCode のターミナル(Ctrl+` で開きます)で次を実行します。Windowsの方は ./mvnw のかわりに .\mvnw(ドット+バックスラッシュ)と入力してください(配布プロジェクトに Maven Wrapper を同梱しています)。

./mvnw spring-boot:run

起動したら、ブラウザで http://localhost:8080/tasks を開きます。この時点では TaskService が未実装のため、タスク一覧は空のままで正常です。画面の枠と「新規タスクを追加」ボタンが表示されれば成功です。演習3で Service を実装すると、初期データが一覧に表示されるようになります。データベースは H2 インメモリが既定で、起動と同時にスキーマ作成と初期データ投入が走るため、追加のセットアップは要りません。

起動時のログと「Java: Building...」は待つ

初回の起動では英語のログが数分流れます。Started TaskAppApplication が出るまで Ctrl+C で止めないでください。フォルダを開いた直後に画面右下へ出る 「Java: Building...」 の表示や、その間の赤い波線・補完の遅れも正常で、表示が消えれば解消します。壊れたと思って再起動を繰り返さないでください。

演習中は起動しっぱなしでよい

毎回 ./mvnw spring-boot:run し直す必要はありません。コードを書いたら ./mvnw compile でコンパイルが通るか確認し、画面で動きを見たいときだけ起動します。止めるときはターミナルで Ctrl+C です。

SOURCES
SESSION 04

開始前セットアップチェック

ハンズオンに入る前に、環境が整っているかを5項目で確認します。1つでも欠けると後の演習で詰まります。

01 5項目チェック

02 クレジット残量の確認

ウィンドウ右下の Copilot アイコンをクリックし、使用状況(Usage)やクォータ(Quota)の表示から AI Credits の残量を確認します。2026年6月から従量制(AI Credits)に移行しているため、研修中も時々この残量を意識してください。インライン補完はクレジットを消費しませんが、チャットや高性能モデルの利用は消費します。

ウィンドウ右下の Copilot アイコン
図2:ウィンドウ右下の Copilot アイコン(ここをクリックして使用状況・クレジット残量を確認)
モデル設定は変えない

モデルピッカーは講師が指定したミドルクラスのモデル・低 effort 設定のまま使ってください。勝手に高性能モデルへ切り替えると、クレジットの消費が速くなります。迷ったら Auto のままで構いません。Agent モードなど重い使い方は Day2 終盤で紹介します。

SOURCES
SESSION 05

Copilot 基本操作

このセッションで身につける3つの基本操作です。演習はすべてこの組み合わせで進みます。

01 インライン補完

コードを書いていると、続きが薄いグレーで提案されます。これがインライン補完です。Tab で確定、Esc で却下します。別の候補を見たいときは Alt+](Mac は Option+])で次の候補に切り替えます。

インライン補完が薄いグレーで提案された画面
図3:インライン補完が薄いグレーで提案された画面
読んでから採用する

提案を読まずに Tab を押すのは事故のもとです。型・メソッド名・処理の流れが想定どおりか目で追ってから確定してください。違うと思ったら Esc で却下します。

02 Copilot Chat

サイドパネルの Copilot Chat に、日本語で指示や質問を打ち込めます。コードを選択した状態で質問すると、その範囲を踏まえて答えます。コード上で Ctrl+I(Mac は Cmd+I)を押すと、その場で対話するインラインチャットが開きます。

03 スラッシュコマンドとコンテキスト指定

Chat 入力欄で / を打つと、よく使う指示の一覧が出ます。Java の演習では次の3つが中心です。

コマンド用途
/explain選択したコードが何をしているか説明させる
/fixエラーや問題のあるコードを直させる
/tests選択したコードのテスト雛形を作らせる(Day2で詳しく扱う)

どのファイルを見て答えてほしいかは #file、プロジェクト全体を踏まえてほしいときは #codebase で指定します。たとえば #file このファイルの未実装メソッドを教えてください、のように使います。

出力が英語になったら

/tests や /explain の説明は英語で返ることがあります。日本語で説明してくださいと一言添えれば日本語になります。

HANDS-ONTRY IT 補完を体験する
1
コメントを書く

任意の Java ファイルで、メソッドの中に 1から10までの整数を合計して返す というコメントを書いて改行します。

2
提案を見る

薄いグレーで for ループや IntStream を使った提案が出ます。Tab で採用したり Alt+] で別案を見たりして、提案の出方を確かめます。

3
後片付け

確認できたら、書いたコードは消して構いません。次の演習に進みます。

SOURCES
SESSION 06

演習

午後のハンズオンです。各演習は考える → 書く → 実行 → 答え合わせの4段で進みます。考えるフェーズを飛ばさないでください。詳しい手順は exercises の各 md に、参考プロンプトは hints にあります。答え合わせのステップでは hints のファイルを開いて自分の結果と照らし合わせます。

HANDS-ON演習1 TaskDto を Record で生成する

Java 研修との接続:Web 層に渡すデータの入れ物(DTO)を作ります。DTO は Data Transfer Object の略で、Controller と Entity の間に挟むデータ専用クラスです。対象は src/main/java/jp/idhd/taskapp/dto/TaskDto.java(新規作成)、詳細手順は exercises/ex01-dto.md です。

1
考える

tasks テーブルのどのフィールドを Web に出すかを選び、クラス名・種類・フィールドを memo.md の ## 演習01 見出しに書き出します。id・title・description・status・dueDate の5つが目安です。

2
書く

dto フォルダを右クリックして TaskDto.java を作り、ねらいをコメントで書いて改行し、インライン補完で Record の定義を出させます。型が想定どおりか読んでから採用します。変換メソッドはインラインチャットで追加します。

3
実行

ターミナルで ./mvnw compile を実行し、BUILD SUCCESS を確認します。

4
答え合わせ

配布フォルダの hints/step01_dto_hint.md を開いて、参考プロンプトと比較観点を確認します。

AI の出方

補完は public record TaskDto(...) の形で出ることが多いですが、通常クラス+getter で出る場合もあります。研修環境では多くが Record で出ます。どちらで出たかを memo.md に残してください。

早く終わった人は
  • TaskDto と Task エンティティを相互に変換するメソッド(toEntity / fromEntity に相当するもの)を Copilot に提案させ、なぜその変換が必要になるのかの説明も合わせて求めてみてください。どう問いかければ理由まで答えてくれるか、プロンプトを自分で考えてみましょう。
  • 入力値を検証するバリデーション用のアノテーションを足すとどう変わるか、指示の文言を自分で考えて試してみてください。どのフィールドに何を求めたいかを言葉にするところから始めるとうまくいきます。
HANDS-ON演習2 Repository にカスタムクエリを追加する

Java 研修との接続:JPA の findAll / findById は研修で触れています。今回はメソッド名を書くだけで問い合わせが自動生成される Spring Data JPA の命名規則を体験します。対象は src/main/java/jp/idhd/taskapp/repository/TaskRepository.java、詳細手順は exercises/ex02-repository.md です。

1
考える

期限切れタスクを取得する、ステータスで絞るの2つを、どんなメソッド名にすれば命名規則に乗るかを memo.md に予想します。By+フィールド名+条件キーワードが基本です。

2
書く

ファイルを開き、ねらいをコメントで書いて改行し、補完で findByDueDateBefore と findByStatus の2メソッドを出させます。戻り値が List<Task> になっているか確認します。

3
実行

./mvnw compile を実行します。実装を書いていないのになぜ動くのか、Copilot Chat に日本語で説明を求めて理解します。

4
答え合わせ

配布フォルダの hints/step02_repository_hint.md を開いて、参考プロンプトと仕組みの解説を確認します。

AI の出方

補完が @Query 付きの JPQL で出ることもあります。@Query 版でも動きますが、今回は命名規則だけで動くシンプルな形を採用してください。どちらで出たかを memo.md に残します。

早く終わった人は
  • 状態と期限の複合条件で絞り込むメソッドを、メソッド名だけで自動生成できるか自分で考えて試してみてください。どんな名前にすれば2つの条件が命名規則に乗るか、命名から考えてみましょう。
  • @Query で JPQL を書かせ、メソッド名から自動生成する書き方との違いを Copilot に比較して説明させてみてください。どちらをどんな場面で選ぶか、自分なりの問いを立てて尋ねてみましょう。
HANDS-ON演習3 TaskService の CRUD を実装する

Java 研修との接続:CRUD は Create / Read / Update / Delete の頭文字で、データの登録・取得・更新・削除を指します。空のメソッドを Copilot で1つずつ埋めます。対象は src/main/java/jp/idhd/taskapp/service/TaskService.java、詳細手順は exercises/ex03-service-crud.md です。

1
考える

各メソッドで何の例外が起きうるかを memo.md に書き出します。存在しない ID を findById に渡したら TaskNotFoundException を投げる、という仕様を押さえます。

2
書く

空の本体(return null; など)を消し、Javadoc コメントをヒントに補完やチャットで実装します。findById は orElseThrow を使う、create は status が null なら TODO に補正する、という方針です。

3
実行

./mvnw compile を実行します。余裕があれば起動して http://localhost:8080/tasks で一覧を確認します。

4
答え合わせ

配布フォルダの hints/step03_service_hint.md を開いて、参考プロンプトとよくある勘違いを確認します。

AI の出方

findById が Optional.get() を直呼びする危ない形で出ることがあります。研修環境ではこのパターンが時々出ます。出たら一度受け入れてから、チャットで orElseThrow 版に直す経験をしてください。

早く終わった人は
  • 該当するタスクがなかったときにどう振る舞わせたいかを自分で決め、その仕様をプロンプトで伝えて実装させてみてください。例外を投げるのか空を返すのか、まず方針を言葉にしてから依頼しましょう。
  • 件数を取得するような補助メソッドを1つ追加し、そのメソッドをテストするならどんな観点で確認すべきかを Copilot に尋ねてみてください。自分が思いつかなかった観点が出てくるか確かめましょう。
HANDS-ON演習4 微妙なコードを生成させてレビューする

Java 研修との接続:これまでの3演習で書いてきたコードを、今度はレビューする側に回って見ます。生成されたコードを鵜呑みにしない習慣を作ります。対象は src/main/java/jp/idhd/taskapp/_review/UserSearchExample.java(新規作成)、詳細手順は exercises/ex04-review.md です。

1
考える

動くと安全は別だと意識します。セキュリティ・例外処理・リソース管理の3観点を memo.md に書き出しておきます。

2
書く

エクスプローラーで src/main/java/jp/idhd/taskapp を右クリックし「新しいフォルダー」で _review フォルダを作り、その中に UserSearchExample.java を新規作成します。あえて危ない指示で生成させます。文字列連結で SQL を組み立てる動くけれど危ないコードを引き出して採用します。

3
実行

生成されたコードの問題点を自分で3つ以上書き出し、その後 Copilot Chat にレビューを依頼して照合します。インラインチャットでプリペアドステートメントtry-with-resourcesの安全な形に書き換えます(言葉の意味は末尾の用語集を参照)。

4
答え合わせ

配布フォルダの hints/step04_review_hint.md を開いて、参考プロンプトとレビュー観点を確認します。

AI の出方

Copilot が最初から安全なコードを出して悪い例が引き出せないこともあります。その場合はコメントを文字列連結で SQL を組み立てるのように具体的にすると危ない例が出やすくなります。出なければサブ講師に声をかけてください。

早く終わった人は
  • モデルピッカーで別のモデルに切り替え、同じ生成を依頼して出力にどんな差が出るか見比べてみてください。研修中はこの確認が終わったら、講師指定のモデルに必ず戻してください。
  • セキュリティの観点でのレビューを Copilot に依頼し、自分が先に書き出した指摘と照らし合わせてみてください。どこまで一致したか、見落としはどちらにあったかを確かめましょう。
SOURCES
SESSION 07

到達チェックと提出物

Day1の終わりに、自分で次の項目を確認します。すべて埋まっていなくても構いませんが、どこまで進んだかを memo.md に残してください。

01 到達チェック

提出物

提出は memo.md と、各演習で編集した Java ファイルです。提出方法は研修当日に案内します。コンパイルが通らないまま終わっても、どこで詰まったかを memo.md に書いておけば十分です。

SOURCES
SESSION 08

よくある質問

演習中に出やすい疑問をまとめました。

01 FAQ

Q. 提案をそのまま採用してよいですか

必ず読んでから採否を決めてください。型・メソッド名・処理の流れが想定どおりかを確認します。読まずに Tab を押すのは事故のもとです。

Q. 別の候補を見たいときは

インライン補完では Alt+](Mac は Option+])で次の候補に切り替わります。チャットでは別の書き方も出してくださいと頼みます。

Q. 説明が英語で返ってきます

日本語で説明してくださいと一言添えれば日本語になります。/explain や /tests の出力は英語になりがちです。

Q. モデルを高性能なものに変えてもよいですか

研修中は講師指定のミドルクラス・低 effort 設定のまま使ってください。勝手に切り替えるとクレジットの消費が速くなります。

Q. クレジット残量はどこで見ますか

右下の Copilot アイコンをクリックし、使用状況(Usage)から確認します。補完は消費しませんが、チャットは消費します。

Q. 早く終わったら何をすればよいですか

各演習の md 末尾にあるチャレンジや、exercises/challenges の追加問題に進んでください。

Q. 演習の答えはどこにありますか

配布フォルダの hints に、各ステップの参考プロンプトと比較観点があります。考えてから開いてください。

SOURCES
SESSION 09

トラブルシューティング

よくあるトラブルと対処です。多くは開いているフォルダが違う、import が足りない、保存していないのいずれかです。

01 ./mvnw が動かない

ターミナルで ./mvnw -version を実行し、JDK 17 以上が認識されているか確認します(Windowsの方は .\mvnw -version)。java -version で 17 以上が出ない場合は、VSCode 右下から JDK の設定を確認します。フォルダを開く単位がプロジェクト直下(pom.xml がある階層)になっているかも確認してください。

02 Copilot が反応しない

下部ステータスバーの Copilot アイコンの状態を確認します。サインインが切れている場合は GitHubアカウントでサインインし直します。ネットワークが社内プロキシ経由の場合は、研修当日に案内する設定を確認してください。

03 補完が出ない・Tab で違うコードが入る

右下の言語モードが Java になっているか確認します(Plain Text のままだと補完が出ません)。違うコードが入ったときは別の拡張機能の補完が割り込んだ可能性があるので、Ctrl+Z(Mac は Cmd+Z)で戻します。

04 補完や説明が英語で出る

日本語で説明してください、日本語のコメントで書いてくださいとプロンプトに添えます。インライン補完のコメントは、日本語で書くと日本語のコメントが返りやすくなります。

05 H2 から MySQL に切り替えたい

既定は H2 インメモリで、追加設定なしで動きます。MySQL を使う場合は ./mvnw spring-boot:run -Dspring-boot.run.profiles=mysql で起動し、事前に taskdb データベースの作成と接続情報の修正が必要です。研修では H2 のままで構いません。

06 ポート 8080 が使用中・シンボルが見つかりません

ポート 8080 が使用中と出るときは、すでにアプリが起動している可能性があります。前のターミナルで Ctrl+C を押して止めてから起動し直します。シンボルが見つかりませんと言われるときは import 文が足りない可能性が高いので、Copilot Chat にこの Java ファイルに足りない import 文を追加してくださいと依頼します。コードを反映したあとに Ctrl+S で保存したかも確認してください。

SOURCES
SESSION 10

下流工程ミニ用語集

演習で出てくる言葉を1行で押さえる早見表です。意味が思い出せなくなったら、ここに戻ってきてください。各カードの説明の冒頭に、その語が登場する演習(例: Day2 演習6)を記しています。

01 演習で出る言葉

スタックトレース

エラーが起きたときに、どのメソッドからどのメソッドへ処理が進んで止まったかを上から並べた記録です。

Day2 演習6・演習7。上が最後に起きた例外、Caused by の下が本当の原因です。

Thymeleaf

HTML に Java の値を埋め込んで画面を作る Spring Boot 標準のテンプレートエンジンです。

Day2 演習7。list.html の th:each(行を繰り返す)・th:classappend(条件でクラスを足す)・${...}(値の差し込み)で出てきます。

プロキシ

社内ネットワークと外部の間に立ち、通信を中継する仕組みです。設定がないと Copilot が外部に届きません。

Day1 トラブルシューティング。Copilot が反応しないときに確認します。

Optional

値があるかもしれない/ないかもしれないことを表す Java の入れ物です。null による事故を防ぎます。

Day1 演習3。findById で orElseThrow を使う判断につながります。

Mockito

テストのときに本物の部品を偽物(モック)に差し替えるライブラリです。

Day2 演習5。@Mock(偽物を作る)・@InjectMocks(偽物を組み込んだ検証対象を作る)で出てきます。

アノテーション

@ で始まる印で、クラスやメソッドに役割や設定を付け足します。

Day1 演習1のバリデーション、Day2 の @Test など各所で出てきます。

JPQL

テーブルではなく Java のエンティティを対象に書く問い合わせ言語です。@Query に書きます。

Day1 演習2。命名規則で自動生成する書き方との違いとして出てきます。

try-with-resources

ファイルや DB 接続など、使い終わったら必ず閉じたい資源を自動で閉じる書き方です。

Day1 演習4・Day2 演習6。リソースリークを直すときに使います。

Entity

データベースの1行に対応する Java クラスです。tasks テーブルなら Task.java が当たります。

Day1 演習1・演習3。DTO との違いを意識する場面で出てきます。

Enum

決まった選択肢の集合を表す型です。TODO・DOING・DONE のように値を限定できます。

題材プロジェクトの TaskStatus。状態を扱う演習で出てきます。

Record

値を入れるだけのクラスを短く書ける Java の仕組みです。getter が自動で付きます。

Day1 演習1。TaskDto を Record で作ります。

シグネチャ

メソッドの名前・引数の型と並び・戻り値の型をまとめた「呼び出しの形」です。

全演習。補完の提案が想定どおりか読むときの確認ポイントです。

プリペアドステートメント

SQL の値の部分を別枠で渡す書き方です。文字列連結をやめることで SQL インジェクションを防ぎます。

Day1 演習4・Day2 演習6。危ないコードを安全な形に直すときに使います。