このページでは、プレゼンテーション層の実装であるコントローラーをSpringBootを使ってコーディングする方法を説明します。
Contents
コントローラーの役割
コントローラーはHTTPリクエスト/レスポンスを捌くことと、ビジネス層を呼び出すことが役割です。
コントローラの処理の流れは基本的にこのようになります。
# | 処理 |
1 | リクエストを受ける |
2 | リクエスト内容をチェックする(バリデーション) |
3 | リクエスト内容をビジネス層向けに変換する |
4 | ビジネス層を呼び出す |
5 | ビジネス層の処理結果をレスポンス向けに変換する |
6 | レスポンスを返す |
実装例
典型的なコントローラーの実装は下記のようになります。
TODO
その他の実装例については、3層構造の実装例を参考にしてください。
コントローラーの作成単位
コントローラーの作成単位は明確です。コントローラーの作成単位はURL(パス)ごとに1つです。
次に例を示します。
# | URL | 作成するコントローラー |
1 | /books | BooksController |
2 | /books/foo | BooksFooController |
3 | /books/1/bar | BooksBarController |
4 | /bookReserve | BookReserveController |
5 | /bookLend?foo=bar | BookLendController |
上記の例はあくまでも推奨するコントローラ-の作成単位です。プロジェクト固有の方針があれば、それに従う必要があります。
もし方針がなかったり、方針を策定していく場合は、上記の例のようにURLに紐付けておくと、開発者がコントローラーのクラス名を迷わなくて良い、保守する人がコントローラーを探しやすいというメリットがあります。
デメリットとしては、URLを変更すると(@RequestMappingのvalueを変更すると)、クラス名との整合がとれなくなることです。しかし、現場ではURLを変更することはあまりありませんので、上記の例に従うことを推奨します。
@Controller
@RequestMapping("/okozukai/registerConfirm")
public class OkozukaiRegisterConfirmController {
@PostMapping
public String doPost() {
// do something
return "okozukai/register_confirm";
}
}
このコントローラークラスが処理するパスを明確にするために、
@RequestMappingのURL指定はクラス宣言に対して付与するのが良いです。
実行メソッドには、@PostMapping/@GetMappingなどHTTPメソッドに応じたものを付与します。
実行メソッドのメソッド名は、@PostMappingに対してはdoPost、@GetMappingに対してはdoGetと決めておくと、コード全体で一貫性がとれて美しくなります。
コントローラーの実装規約
コントローラーの実装にあたって、規約として明示することは下記です。
- 命名規則
- URLをキャメルケースにし、末尾に"Controller"をつける。
- (または、APIのID+末尾に"Controller"をつける。)
リクエストの受け取り方
リクエストのJSON文字列をString型でそのまま受け取りたい
@RequestBody はリクエストのボディ内容を受け取ることができます。
@PostMapping
public void post(@RequestBody String body) {
上記のように書くことで、ボディ内容をそのまま見ることができます。
リクエストのJSON文字列を任意のオブジェクト(DTO)で受け取りたい
@RequestBody に続いて、任意のオブジェクトを記述することで、リクエスト内容がオブジェクトに格納された状態で受け取ることができます。
@PostMapping
public void post(@RequestBody Shop shop) {
@Data
public class Shop {
private String id;
private String name;
}
上記のように書くことで、リクエストボディに存在する属性のみ、オブジェクトに格納してくれます。
リクエストの属性名とオブジェクトのフィールド名が一致している部分のみが格納対象となっています。
リクエスト内容に応じた受け取り時の型指定
No | input type | Javaの型 |
1 | date 実際の値: "2021-02-11" | LocalDate |
2 | datetime-local 実際の値:"2021-02-11T18:00" | LocalDateTime @DateTimeFormat(pattern = "yyyy-MM-dd") を併せて付与する必要あり。 |
3 | ||
4 |
コントローラーのポイント
コントローラーの実装にあたっては、下記を意識してください。
- コントローラーは薄く保つようにする。ロジックを書かないようにする。
- コントローラーでする処理をプロジェクト内で統一しておく。(具体的には、「コントローラーの処理の流れ」を推奨する。)