1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
  6. test 6
コース一覧
Spring Boot入門
RESTという設計方針

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分

RESTという設計方針

このレッスンでは、扱いたいデータと操作から URL と HTTP メソッドを機械的に導けるようになります。

URL に動詞を書かない

Web API の設計で最初につまずくのが URL の付け方です。素直に書くと、こうなりがちです。

プレーンテキスト

GET /getUsers GET /getUserById?id=12 POST /createUser POST /updateUser POST /deleteUser

動いてはいますが、これは REST とは呼びません。URL の中に getUser や createUser という動詞が入っていて、しかも操作の種類が全部 GET と POST に押し込まれています。API が育つほど名前が増え、どれがどの操作なのか URL を読んでも分からなくなります。

REST の考え方はとても単純です。URL は名詞、操作は HTTP メソッド、この 2 つを分けます。先ほどの 5 つを書き直すと次のようになります。

プレーンテキスト

GET /users 一覧を取る GET /users/12 1 件を取る POST /users 新しく作る PUT /users/12 まるごと置き換える DELETE /users/12 消す

URL に出てくる名前は users だけになりました。操作の違いはすべてメソッド名が担当しています。

リソースは複数形の名詞にする

/users のように複数形を使うのが慣習です。理由は、一覧と単体を同じ語で自然に表せるからです。/users は「利用者の集合」、/users/12 は「その集合の中の 12 番」と読めます。ここが /user だと、一覧を返す /user が単数なのに複数返す、という気持ち悪さが残ります。

名前の付け方をまとめると次の通りです。

良い良くない理由
/users/getUsersURL に動詞を入れている
/users/12/users?id=12ID は集合の中の 1 件を指すのでパスに置く
/orders/orderListList は表現の都合であってリソース名ではない
/users/12/orders/getOrdersOfUser所属関係はパスの階層で表す

メソッドごとの意味

メソッド意味対象何度呼んでも同じ結果か
GET取得する集合 または 1 件はい
POST新しく作る集合いいえ
PUTまるごと置き換える1 件はい
PATCH一部だけ更新する1 件場合による
DELETE削除する1 件はい

注目してほしいのは対象の列です。POST だけが集合に対する操作で、それ以外の更新系はすべて 1 件を指します。新しく作る時点ではまだ ID が決まっていないので、ID をパスに書きようがないからです。作成した ID はサーバーが採番して返します。

Spring では属性ではなく型で表れる

Spring Boot では、この対応づけがアノテーションの種類そのものになります。

Java

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

クラスに付けた @RequestMapping("/users") が共通の接頭辞になり、メソッド側では差分だけを書きます。GET と POST の違いはアノテーション名が持っているので、メソッド名は list でも findAll でも API の形には影響しません。ここが動詞入り URL との決定的な違いです。メソッド名を変えても外から見た API は変わらない、という状態が作れます。

演習で確かめます

Spring では上のようにアノテーションが担っている「リソース名と操作から URL とメソッドを決める」という判断を、今回は自分の手で書きます。リソース名と操作の種類を受け取り、GET /users や DELETE /users/{id} のような 1 行を組み立てる関数を作ってください。単数形で渡されても複数形に直す、というところまでやります。

要件

  1. resource の末尾が s でなければ s を足して複数形にすること
  2. list は GET /users、get は GET /users/{id}、create は POST /users、update は PUT /users/{id}、delete は DELETE /users/{id} の形で返すこと
  3. list / get / create / update / delete 以外の action が来たら invalid を返すこと

入出力例

route("user", "list") → "GET /users" route("users", "get") → "GET /users/{id}" route("order", "create") → "POST /orders" route("book", "update") → "PUT /books/{id}" route("user", "delete") → "DELETE /users/{id}" route("user", "search") → "invalid"

ヒント

複数形にするかどうかは resource.endsWith("s") で判定できます

メソッド名とパスの末尾を別々に決めてから、最後に半角スペースでつなぐと見通しが良くなります

switch 文で action ごとに分岐し、既定の枝で invalid を返すと書きやすいです

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

関連レッスン

  • @RestControllerの役割

    @Controller との違いと戻り値の扱いを確認します。

  • @GetMappingとパス変数

    パスから ID を取り出して結果を返す処理を実装します。

  • クエリパラメータの受け取り

    クエリ文字列の解析と既定値の適用を実装します。

  • @PostMappingとリクエストボディ

    受け取った内容から新しいリソースの表現を組み立てます。

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

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

  • URLページの住所全体
  • HTTPWeb の通信プロトコル、HTTPS は TLS で暗号化したもの
  • メソッドクラスに属する関数
  • エンドポイント「この URL を叩くとこの機能が動く」入口の住所
  • APIアプリ間でデータをやり取りする窓口
  • 設計何をどう作るかを決める前工程
  • 階層ネットワークを役割ごとに積み重ねた構造
  • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
main.java
学習モード
エディタを読み込んでいます

メモ

RESTという設計方針

⌘S で保存