スポンサーリンク

Webアプリケーション開発

プレゼンテーション層(コントローラー層)の作り方

投稿日:2021年2月8日 更新日:

このページでは、プレゼンテーション層の実装であるコントローラーをSpringBootを使ってコーディングする方法を説明します。

コントローラーの役割

コントローラーはHTTPリクエスト/レスポンスを捌くことと、ビジネス層を呼び出すことが役割です。

コントローラの処理の流れは基本的にこのようになります。

#処理
1リクエストを受ける
2リクエスト内容をチェックする(バリデーション)
3リクエスト内容をビジネス層向けに変換する
4ビジネス層を呼び出す
5ビジネス層の処理結果をレスポンス向けに変換する
6レスポンスを返す
コントローラーの処理の流れ

実装例

典型的なコントローラーの実装は下記のようになります。

TODO

その他の実装例については、3層構造の実装例を参考にしてください。

コントローラーの作成単位

コントローラーの作成単位は明確です。コントローラーの作成単位はURL(パス)ごとに1つです。

次に例を示します。

#URL作成するコントローラー
1/booksBooksController
2/books/fooBooksFooController
3/books/1/barBooksBarController
4/bookReserveBookReserveController
5/bookLend?foo=barBookLendController
URLとコントローラーの関係

上記の例はあくまでも推奨するコントローラ-の作成単位です。プロジェクト固有の方針があれば、それに従う必要があります。

もし方針がなかったり、方針を策定していく場合は、上記の例のように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;
}

上記のように書くことで、リクエストボディに存在する属性のみ、オブジェクトに格納してくれます。

リクエストされた内容

リクエストの属性名とオブジェクトのフィールド名が一致している部分のみが格納対象となっています。

リクエスト内容に応じた受け取り時の型指定

Noinput typeJavaの型
1date
実際の値: "2021-02-11"
LocalDate
2datetime-local
実際の値:"2021-02-11T18:00"
LocalDateTime
@DateTimeFormat(pattern = "yyyy-MM-dd") を併せて付与する必要あり。
3
4
input type別、コントローラーにおけるリクエストの受け取り方

コントローラーのポイント

コントローラーの実装にあたっては、下記を意識してください。

  • コントローラーは薄く保つようにする。ロジックを書かないようにする。
  • コントローラーでする処理をプロジェクト内で統一しておく。(具体的には、「コントローラーの処理の流れ」を推奨する。)

Udemyのハンズオン動画講座でSpringBootのスキルを磨く!

スポンサーリンク

-Webアプリケーション開発

Copyright© 【Spring Hack】 , 2022 All Rights Reserved Powered by AFFINGER5.