Java読書会BOF主催「Spring徹底入門 第2版」を読む会(第1回)が10月20日(日)に開催されました。
前回の書籍(基礎からのサーブレット/JSP入門 第5版)は、参加人数が2-3人と少し寂しい読書会でした。今回は7人の参加で開催となり、前回の書籍の読書会に比べると賑わった会となりました。
Springの書籍
今回の課題図書となった「Spring徹底入門 第2版」(2024年5月刊)のほかに、類書で「プロになるためのSpring入門 ――ゼロからの開発力養成講座:書籍案内|技術評論社(2023年7月刊)」があります。書籍の対象とするSpring Frameworkのバージョンが、「Spring徹底入門 第2版」が5系 である一方「プロになるためのSpring入門」が6系となっています。
書籍のボリュームは、「Spring徹底入門 第2版」が752ページに対して「プロになるためのSpring入門」が384ページとほぼ倍のボリュームとなっています。
目次構成を見ると、「Spring徹底入門 第2版」は、Springの概要紹介の薄い1章の後は、2章でDIとAOPの詳細な説明が開始され、頭から読んで手を動かしながら徐々に詳しく解説していくる体裁ではなく、リファレンス的な構成になっています。開発環境についてはAの付録で記載、Hello World的なサンプルは13章の Spring Bootの章で初めて出てきます。 「プロになるためのSpring入門」は、第1部基本編と第2部詳細編と2部構成で徐々に詳しく解説していくスタイルのようです。
入門としての読みやすさは「プロになるためのSpring入門」で、独学でも読めそうです。一方、読書会向き(議論が活発になる書籍)ということではSpring徹底入門なのかなとの感触です。入門本で700ページ越えもサイズが強烈です。
PDFの入手
書籍サイトでは電子書籍の購入で、一見PDF版が見当たらず、KindleやKobo、Hontoに誘導されるように見えますが、PDF版を翔泳社から購入可能です。今回、電子書籍購入して参加の方の多くが、PDF版がないと思いKindle版を購入したと言っていました。次の図の操作でPDF版の購入に辿れました。
Spring Boot開発環境
書籍で解説されるコード断片を実行しようとする場合、DIコンテナを含めて各フレームワーク・ライブラリが動く環境が必要です。簡単にSpringアプリケーションを動かすのがSpring Bootの機能なので、まずはSpring BootでSpringアプリケーションを作って動かせるようにします。
書籍では、A.付録において、Spring Frameworkを使うアプリケーションの開発環境として、EclipseベースのSTS(Spring Tool Suite)の準備が説明されています。
Spring Bootの開発では、WebサービスのSpring Initializr へアクセスし、設定を入力するとプロジェクトの雛形がダウンロードできるので、これを展開してIDEに読ませるという流れになります。設定ではビルドツールにMavenかGradleを選択できます。
IntelliJ IDEAの場合、有償のUltimate版なら Spring Initializrにアクセスしなくてもプロジェクトの作成からSpring Bootを選択して雛形を生成できます。と言っても、プロジェクトの作成では裏でSpring Initializrをアクセスしているようです。無償のCommunity版の場合は、Spring Initializrにアクセスして生成した雛形を読み込んで使用する方法となります。
Spring Bootを使ってビルドしたアプリケーション(JAR形式)は、Webサーバーが組み込まれるので、JARファイルを実行するだけでWebサーバーを用意しなくてもWebブラウザからアクセスが可能になります。デフォルトではembedded TomcatらしきクラスファイルがJARに含まれていました。
IntelliJ IDEA(Ultimate版)でSpring Bootプロジェクト生成
新規プロジェクトを生成します(File > New > Project)
プロジェクト名、言語、ビルドツール、パッケージ名などを選択・入力します。
Dependencies で、Spring Webを選択します。これを選択することで、SpringのWeb機能の基本的な振る舞いを利用できるようになります。ブラウザにHelloメッセージを表示する最初のプログラムはこのライブラリを使用します。
アプリケーションのmainクラス(エントリーポイント)とテストクラスの雛形が生成されました。 生成されたmainクラスを実行すると、Webサーバー機能が動作し、デフォルトではデフォルトでは 8080ポートで待ち受けます。Webブラウザからlocalhost:8080に接続すると次のエラーが発生します。これは、ルート/にマッピングされる処理が未定義のため 404エラーとなっている場合のメッセージです。
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Mon Oct 28 00:00:55 JST 2024 There was an unexpected error (type=Not Found, status=404).
Hello World! とメッセージを表示するWebアプリケーションとするために、生成されたmainクラスに@RestControllerアノテーションを付与し、HTTPのGETメソッドでルート/を指定された際にメッセージを返却するメソッドを@GetMappingアノテーションを付与して定義します。
package com.torutk.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class DemoApplication { @GetMapping("/") String hello() { return "Hello World!"; } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
Hello World的なWebアプリとして単一クラスで完結させるのに、REST APIを扱う@RestControllerを使用しました。 コントローラのメソッドにREST APIのメソッド(GET)をマッピングし、メソッドの戻り値をAPIの戻り値にラップします。戻り値の型をStringとしているので単純な文字列が返却されますが、通常はリソースクラスを定義して返却します。
通常のWebアプリケーション用の@Controllerは、別途Viewに相当する仕組みを用意するか、@ResponseBodyを使うなどひと手間かかります。