1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
  6. test 6
  7. test 7
コース一覧
Spring Boot入門
ルーティング表という発想

Spring Boot入門

Java で Web API サーバーを作るための Spring Boot の入門コースです。DI コンテナ、REST コントローラ、リクエスト検証、レイヤ分割、Spring Data JPA、例外ハンドリング、テストまでを扱います。毎レッスン、Spring が裏側でやっている判断そのものを pure Java の関数として自分で書き、フレームワークが何を肩代わりしてくれているのかを手触りで理解できる構成にしました。約 12 時間 (1 日 30 分 × 24 日) で 48 レッスンを修了できます。

1
Spring Bootとは何か
01. Spring Bootで何が作れるのか10分
02. サーブレットからフレームワークへ15分
03. ルーティング表という発想15分
04. プロジェクトの構成10分
05. 起動のしくみと自動設定15分
06. パスのマッチング15分
2
DIコンテナ
01. newで書くと何が困るのか15分
02. コンストラクタインジェクション15分
03. インターフェースへの依存15分
04. @Componentと@Bean15分
05. 自作のDIコンテナ20分
06. Beanのスコープとライフサイクル15分
3
RESTコントローラ
01. RESTという設計方針15分
02. @RestControllerの役割15分
03. @GetMappingとパス変数15分
04. クエリパラメータの受け取り15分
05. @PostMappingとリクエストボディ15分
06. ステータスコードの選び方15分
07. ResponseEntityで組み立てる15分
4
リクエストとレスポンスの変換
01. JSONとオブジェクトの往復15分
02. DTOとエンティティを分ける15分
03. recordでDTOを書く15分
04. 入力検証の基本15分
05. 検証エラーをまとめて返す15分
06. アノテーションによる検証15分
5
レイヤ構成とビジネスロジック
01. 3層アーキテクチャ10分
02. @Serviceに置くもの15分
03. 状態遷移をルールにする15分
04. 料金計算のような業務ロジック15分
05. @Transactionalとは何か15分
06. トランザクションの巻き戻し15分
6
データアクセス
01. @Entityとテーブルの対応15分
02. リポジトリという抽象15分
03. メソッド名からクエリを作る20分
04. 検索条件の組み立て15分
05. ページングと並び替え15分
06. N+1問題15分
7
例外処理と横断的関心事
01. 例外をHTTPに変換する15分
02. @ExceptionHandlerと@ControllerAdvice15分
03. エラーレスポンスの形を決める15分
04. フィルタとインターセプタ15分
05. ログとリクエストの追跡15分
06. 設定値の外部化15分
8
テストと仕上げ
01. テストの種類と使い分け15分
02. Serviceの単体テスト15分
03. モックで依存を差し替える15分
04. MockMvcでエンドポイントを試す15分
05. 本番へ出すための次の一歩10分

ルーティング表という発想

このレッスンでは、Spring Boot が「どの URL のときにどのメソッドを呼ぶか」をどうやって決めているのかを掴みます。答えは意外なほど素朴で、表を引いている だけです。

入口はいつも1つです

Spring Boot の Web アプリでは、届いたリクエストはまず DispatcherServlet という 1 つのサーブレットに集まります。URL がいくつあっても入口は 1 つで、そこから先の振り分けを DispatcherServlet が担当します。この設計をフロントコントローラと呼びます。

DispatcherServlet がやることは、大きく次の流れです。

  1. リクエストのメソッドとパスを見る
  2. 対応するハンドラ (コントローラのメソッド) を ハンドラマッピング に問い合わせる
  3. 見つかったら引数を組み立てて呼び出す
  4. 戻り値を JSON などに変換して書き戻す
  5. 見つからなければ 404 を返す

この 2 番目、ハンドラマッピングが今回の主役です。中身は「メソッドとパスの組み合わせから、呼ぶべきメソッドを引く表」です。

@GetMapping は、表への登録です

次のコントローラを見てください。

Java

@RestController @RequestMapping("/users") public class UserController { @GetMapping public List<User> list() { ... } @GetMapping("/{id}") public User find(@PathVariable Long id) { ... } @PostMapping public User create(@RequestBody UserRequest req) { ... } @DeleteMapping("/{id}") public void delete(@PathVariable Long id) { ... } }

アプリの起動時に、Spring はコンポーネントスキャンで @RestController の付いたクラスを見つけ、その中のメソッドに付いた @GetMapping などを全部読み取ります。そして次のような表を組み立ててメモリに持ちます。

メソッドパス呼ぶもの
GET/usersUserController#list
GET/users/{id}UserController#find
POST/usersUserController#create
DELETE/users/{id}UserController#delete

クラスに付いた @RequestMapping("/users") は、その中の全メソッドのパスの前に付く接頭辞として働きます。だから @GetMapping("/{id}") の実際のパスは /users/{id} になります。

ここで重要なのは、表が作られるのは起動時の一度きり だという点です。リクエストが来るたびにアノテーションを読み直しているわけではありません。だから 1 リクエストあたりの処理は、単に表を引くだけの軽い処理で済みます。

メソッドが違えば別の行です

同じ /users でも GET と POST は表の別々の行です。ここを取り違えると、動かないときの原因が分からなくなります。たとえば POST /users に対する登録しか無い状態でブラウザから /users を開くと、ブラウザは GET で送るので表に無く、404 ではなく 405 Method Not Allowed が返ります。Spring はパスは一致したがメソッドが違う、という状況を区別できるからです。

演習では話を単純にして、パスもメソッドも一致しなければ一律 404 を返す形で表を実装します。

表を引くコードは、実は普通の Map です

概念としては、キーが「メソッドとパスの組」、値が「ハンドラ名」の Map そのものです。今回の演習では、キーを "GET /users" のような 1 本の文字列に潰してしまうのが一番素直です。実際の Spring はパス変数やワイルドカードを含む照合をするので、単純な Map の完全一致だけでは足りず、もっと複雑な仕組みを持っています。その照合の部分は次のレッスンで扱います。

まずは「フレームワークがやっているのは表引きだ」という骨格を、自分の手で組み立ててみてください。

要件

  1. Map にメソッドとパスの組を鍵としたルーティング表を作り、5件を登録すること
  2. 表に一致する組があればハンドラ名を、無ければ "404" を返すこと
  3. HTTP メソッドは大文字小文字を区別せずに照合すること (get でも GET と同じ扱い)

入出力例

route("GET", "/users") → "listUsers" route("POST", "/users") → "createUser" route("GET", "/users/1") → "findUser" route("DELETE", "/users/1") → "deleteUser" route("get", "/health") → "health" route("PUT", "/users") → "404" route("GET", "/orders") → "404"

ヒント

鍵は method + " " + path のように1本の文字列に潰すと素直に書けます

大文字小文字を無視するには、鍵を組み立てる前に method.toUpperCase() をかけます

Map#get は見つからないと null を返します。null なら "404" を返してください

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/09

関連レッスン

  • プロジェクトの構成

    Spring Initializr が作るディレクトリと build ファイルを読めるようになります。

  • 起動のしくみと自動設定

    @SpringBootApplication が何を束ねているのかを確認します。

  • パスのマッチング

    パス変数を含む URL パターンの照合を実装します。

  • newで書くと何が困るのか

    直接 new する設計の差し替えにくさを、コードで確かめます。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • URLページの住所全体
  • メソッドクラスに属する関数
  • リクエストWeb 通信の基本単位、ブラウザの問い合わせとサーバーの返答
  • 設計何をどう作るかを決める前工程
  • 引数位置引数=順番で渡す。
  • 戻り値呼び出し元への返答を表す点線矢印
  • applicationJSON 本文を送るときの Content-Type
  • コンポーネントUI を構成する再利用可能な部品
main.java
学習モード
エディタを読み込んでいます

メモ

ルーティング表という発想

⌘S で保存