(第5回) コントローラクラスの作成、日記一覧データを取得【Spring Boot2で日記ウェブアプリ】

Spring Boot2.3,2.4で日記投稿ウェブアプリ入門の第5回です。コントローラクラスを作成し、日記の一覧データを取得する処理を作ります。CRUDでいうと、R(Read、読み込み・データ取得)の部分にあたります。Spring Bootの初心者・入門者の方は、参考にしてみてください。

環境と今回の目的

最終更新日:2021/4/19

前回はDiaryテーブルのCRUD操作をするために、リポジトリインタフェースDiaryRepositoryの作成をしました。
(第4回) テーブルのCRUD操作のためにリポジトリインタフェースの作成【Spring Boot2で日記ウェブアプリ】

今回はSpring Bootのコントローラクラスを作成し、日記の一覧データを取得する処理を作ります。CRUDでいうと、R(Read、読み込み・データ取得)の部分にあたります。

◾️開発環境やバージョンは以下の通りです。
OS:macOS Catalina(バージョン10.15.5)
開発環境:Eclipse(Pleiades All in One、4.16(2020-06)、Java Full Edition版)
Spring Bootバージョン:2.3.3、2.4.0
Java:11
データベース:H2

今回作成するファイル

今回作成するファイルを先に書いておきます。

新規に作成するファイルは「DiaryController.java」の1つです。

コントローラクラスについて、MVCのC(Controller)

コントローラクラスは、ウェブアプリのMVCモデルのC(Controller)になります。
コントローラクラスの役割はいくつかありますが、まずユーザからのHTTPリクエストを受け付けます。
そして、HTTPリクエストを受けた後にサービス側で様々な処理をして(処理はアプリ毎に異なる)、最後にどのView(HTML、MVCのV)を返すかを指定してユーザ側(クライアント側・フロント側)に返します。

今回開発している日記投稿ウェブアプリでは、ユーザから投稿した日記情報の一覧取得のリクエスト、日記の新規作成リクエスト、編集リクエスト、削除リクエストなどを想定していますが、それらのリクエストを受けて、サービス側でなんらかの処理をした後にView(HTML)を返す役割のコントローラクラスDiaryController.javaを作ります。

コントローラクラスDiaryControllerの作成、日記の一覧データを取得、@Autowired、Modelクラス

それでは、JavaのコントローラクラスDiaryController.javaを作成して編集します。

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("diary")
public class DiaryController {
  @Autowired
  DiaryRepository diaryRepository;
  
  //日記一覧情報の取得
  @GetMapping("summary")
  public String summary(Model model) {
    Iterable<Diary> diarys = diaryRepository.findAll();
    model.addAttribute("diarys", diarys);
    return "summary";
  }
}

上のDiaryController.javaはまだ未完成形で、投稿した日記の一覧情報取得リクエストを受け付けるだけのコントローラクラスです。 その他の日記の新規作成、編集、削除機能を持ったDiaryController.javaは、またこれから作っていきます。

まず、コントローラクラスには@Controllerを付けます。今回の日記投稿ウェブアプリはブラウザ上で動作するアプリでフロントエンドはView(HTML)になります。この場合、コントローラクラスには@Controllerを使用します。

@RestController
Spring BootでREST API(Web API)サービスを作成する場合はフロントエンドにView(HTML)はありません。その場合のコントローラクラスには@RestControllerを付けます。

そして、DiaryControllerには@RequestMapping("diary")も付けています。
@RequestMappingでは、ルーティング情報(URLマッピング)を設定します。ここでは、@RequestMappingの引数に「"diary"」を指定していますので、DiaryControllerは下のURLにリクエストされた時に受け付けます。
(*ただし、最終的に受け付けるURLはメソッドのルーティング情報で決まりますので、下のURLにHTTPリクエストしてもエラーになります。)

http://localhost:8080/diary/

次にsummaryメソッドについです。summaryメソッドは日記の一覧情報を取得してフロントエンドに返すメソッドです。

summaryメソッドには、@GetMapping("summary")を付けています。@GetMappingは@RequestMappingと同様にルーティング情報(URLマッピング)を設定しますが、HTTPリクエストのGETだけを受け付けてPOSTは受け付けません。@RequestMappingは、HTTPリクエストのGET・POST関係なくURLが合っていれば受け付けます。

ですのでsummaryメソッドは、このURLにHTTP GETリクエストされた時に呼び出されます。

http://localhost:8080/diary/summary

続いてsummaryメソッド内の説明です。最初の1行のコードでdiaryテーブルから日記の一覧情報を取得します。

Iterable<Diary> diarys = diaryRepository.findAll();

DiaryRepositoryは前回のページで作成しましたリポジトリインタフェースで、これはdiaryテーブルのCRUD操作をするために作ったものです。
そのDiaryRepositoryを下のように@Autowiredを付けて定義して、DiaryController内で使用できるようにしています。

@Autowired
DiaryRepository diaryRepository;

@Autowired
Springでは、@Autowiredを付けるとプログラマがリポジトリクラスやサービスクラスをnewしなくても、オブジェクトを自動でセット(注入)してくれます。

diaryRepositoryのfindAll()メソッドは、diaryテーブルから全件取得するメソッドです。
findAll()はSpring Data JPAのCrudRepositoryが宣言しているメソッドで、実装はSimpleJpaRepositoryクラスにあります。
SimpleJpaRepositoryクラスを使用するコードを全く書いていませんが、これはすぐ上でも書きましたが@Autowiredを付ける事によってSpringが自動でやってくれているのでできる事です。

summaryメソッドの次の行ではModelを使っています。

model.addAttribute("diarys", diarys);

ModelクラスのaddAttributeメソッドを使用する事で、サーバサイドからフロントエンド(クライアント側)へデータの受け渡しができるようになります。
上のコードでは、日記一覧データが入っている変数diarysをフロントエンドへ返しています。
これでフロントエンドでは、diarysという変数で日記一覧データを扱えるようになります。

そして、summaryメソッドの最後の行です。

return "summary";

この行は、summary.htmlファイル(View、MVCのVの役割)をフロントエンドに返す事を意味しています。
ですのでsummary.htmlファイルをまた別で作成する必要があります。summary.htmlファイルを作成し、summary.html内でサーバサイドから受け取った日記一覧情報を表示するように書けばいいわけです。

[広告] Kindle Unlimitedなら対象の本が定額で読み放題
対象本には、プログラミングなどのIT関連本、マンガ、雑誌、ビジネス書などがたくさんあります!

サービスクラスの作成について

DiaryController.javaでは、直接リポジトリインタフェースDiaryRepository.javaを使用していますが、これは今回開発しているウェブアプリがとてもシンプルだからです。

サービス側でもっと複雑な処理をするアプリならば、サービスクラスを作るのが一般的だと思います。
コントローラクラスでサービスクラスを呼び出し、サービスクラス内でリポジトリインタフェースを使用したり、処理ロジックをコーディングするというような役割分担をすべきです。

プロジェクトのパッケージ構成について

前回と前々回で、エンティティクラスとリポジトリインタフェースを作成して、今回はコントローラクラスを作成しました。
そしてこの作成した3つのファイルは、プロジェクトの同一パッケージに入れています。これも今回開発しているウェブアプリがとてもシンプルだからです。

もっと大きなウェブアプリになれば、エンティティクラス、リポジトリインタフェース、コントローラクラスも多く作るでしょうから、パッケージを分ける事になると思います。
パッケージ構成は個人やプロジェクトの考えや方針に寄ると思いますが、今まで見てきたり経験したプロジェクトではコントローラ用のパッケージ、エンティティクラス用のパッケージというような分け方が一般的だと思います。

最後に、次回

今回はコントローラクラスDiaryController.javaを作成して、DiaryControllerでは日記一覧データを取得してフロントエンドへ返すメソッドを作成しました。

ですので次回は、フロントエンド側の作成になります。日記一覧データを表示するHTMLファイル(テンプレートエンジンのThymeleaf)を作っていきたいと思います。MVCモデルのV(View)の部分にあたります。

(第6回) 日記データ一覧の表示、フロントエンドの開発、Thymeleaf【Spring Boot2で日記ウェブアプリ】
Spring Bootの日記投稿ウェブアプリ開発入門トップ