概要
本記事は、下記の本を読んでSpring Boot2(その他諸々)について学んだことを簡単に整理したものとなります。整理している内容としては、概念的な部分から細かいTipsまでをピックアップしております。大体、本の目次ごとに整理しております。
Spring Bootとは
- Spring Frameworkの本体をベースに「Spring MVC」「Spring Roo」「Spring Boot」で構成されている。
- 「Spring MVC」は、WebアプリのベースでありModel-View-Controllerで構成されいる。
- 「Spring Roo」は、各種コードの自動生成機能ライブラリ(RubyでいうRailsのようなイメージ)である。
- つまり、「Spring Boot」は、「Spring MVC」を土台にして「Spring Roo」を組み合わせて全体をシンプルに使えるように統合したものである。
- 「Spring Boot」での開発は、正確には「Spring MVCをベースにしたSpring Bootによる開発」と言える。なお、Spring Frameworkの「DI」「AOP」が基本思想となる。だたし、Spring Frameworkは、WEB開発専用ではない。(「Spring MVC」、「Spring Boot」はWEB専用である。
- Spring Bootは、従来の「XMLによる設定だらけ」のJavaEEの開発から「アノテーションにより設定を使わない」開発へシフトするような思想である。
- Spring FrameworkとSpring BootでWEBアプリを開発した場合の違いとして、Spring Frameworkは、Warファイルを作成してサーバーにデプロイする必要がある。Spring Bootは、サーブレットコンテナが内臓されており、そのサーバーにデプロイしてアプリケーションを実行するので「サーバーへのデプロイ」が不要となる。
Spring開発のツール
- 「Spring Tool Suite(STS)」は、フレームワークが提供する専用の開発ツールである。https://spring.io/tools
- Eclipse,VSCode,AtomのIDEに対応したアドインがある。
- 「Spring Tool Suite(STS)」自体は、EclipseがベースになったIDEである。
Groovyについて
- Groovyは、Java仮想マシン上で動作するスクリプト言語で、本格開発の前のプロトタイピング等で使用される
- Groovyアプリは、「Javaで開発するSpring Bootアプリの基本部分を簡単に作れるようにした簡易版Spring Bootアプリである」
- Spring Boot CLIを下記のコマンドによりインストールする
$ brew tap pivotal/tap
$ brew install springboot
$ spring --version
- GroovyのHello Worldは下記のように実装する
# app.groovy
@RestController
class App {
@RequestMapping("/")
def home() {
"Hello!!"
}
}
spring run app.groovy #コンソールで起動
JavaによるSpring Boot開発の基本
MavenとGradle
- Mavenは、セントラルリポジトリの考え方でJavaのほとんどのライブラリがMaven経由でビルドすることができる
- Gradleは、ビルドの情報や処理をGroovyによるスクリプトによって記述できる
Mavenhttp://maven.apache.org/
# スケルトン作成
mvn archetype:generate
# Group Id:パッケージ名
# Artifact Id:アプリケーション名
# コンパイル
maven compile
# Spring Bootアプリの起動
mvn spring-boot:run
- pom.xmlの継承は、<parent>タグで記載する
- <build>タグは、プログラムのビルド時に使用される
- <plugins>タグは、ビルド時に使うプラグインが記載される
Gradle https://gradle.org/
# スケルトンを作成
gradle init
# ビルド
gradle build
Spring Bootの基礎
- @SpringBootApplicationは、Spring Bootのアプリケーションであることを示す。
- @PathVariableは、@RequestMapping(“/”{num})のような記載をした場合に変数を受け取ることができる。
- RestControllerは、JavaのインスタンスをJSON型式のテキストの形に変換して出力できる。
- @Controllerを使って、通常のWebページは実装する。
- @Controllerで返される文字列でテンプレート(resource/templatesフォルダ)を検索する。
- Modelクラスは、@Controllerアノテーションのメソッドの引数で受け取ることができる。
- Webページで利用するデータを管理するためのクラスModelクラスとModeAndViewクラスの違いは、テンプレートの名前をインスタンスに設定できる。
- @RequestParamは、フォーム送信された値を指定するためのアノテーションである。
- @RequestParamは、value(htmlのIDを指定する値)とrequired(必須か否か)のパラメータを設定する。
- ページの移動は、@Controllerのreturで”redirect:/XX”か”forward:/XX”でurlを指定する。
テンプレートエンジン(Thymeleafについて)
- Tymeleaf(タイムリーフ)は、基本がHTMLの形式であり、動的に変える部分を${{XX}}(変数式という)という形で記載する。
- 変数式の中は、OGNL(Object-Graph Navigation Language)式というJavaの値にアクセスするための言語で記載する。
- 「#名前」でユーティリティオブジェクトを指定することができる例)${#data.format(new java.util.Date(), ‘dd/MMM/yyyy HH:mm’)}
- メッセージ式で、あらかじめ用意したプロパティファイルを読み込むことができる。Htmlでは、#{ 値の指定 }と記載する。
- リンク式は、@{ アドレス }で記載する。
- 選択オブジェクトの記載は、th:object=”${オブジェクト}”とth:text=”*{プロパティ}”とセットで指定する。なお、オブジェクトは、@Controllerからreturnに設定する。
- リテラル置換は、”| テキストの内容 |”でもできる。もしくは”(ダブルコート)と'(シングルコート)の組み合わせ
- テンプレートエンジンとして、なぜJSPが、Spring Bootに向いていないか?「JSPは、JAR形式では動作せず、WARファイルとしてデプロイする必要があるため」「既にJSP自体がサーバーサイドJavaで使われなくなっている」「スクリプトレットでJavaのソースをJSPの中に記載できるのが、逆にロジックの分散に繋がってしまう」
モデルとデータベース
- Spring BootのModelは、Javaの「JPA」(Java Persistence API)の機能を使用して実装される。「オブジェクトなどのデータを保存して常に利用できるようにすること」
- エンティティクラスが、テーブルとして自動で用意されて保存されるイメージである。@Entityをクラスに対してつけることで作成できる。
- @Table(name=”myData”)でテーブル名を指定し、@Idはプライマリキーの項目につける。
- @GeneratedValue(strategy = GenerationType.Auto)で、自動採番の項目とする。
- @Columnは、カラムに対してつける。
- 「リポジトリ」機能によりEntityManagerでデータベースアクセスのクラスを作成する。
- @Repositoryアノテーションをつけて、JpaRepositoryクラスを継承する
- @Autowiredで、Spring MVCにより自動でオブジェクトが生成されてアプリケーションで利用できるようになる「@Repositoryを指定したインターフェースクラス(EntityManager)を用意する」「@Autowiredを指定したリポジトリインターフェースのフィールドを用意する」
- フレームワークでは、Spring MVCが、@Repositoryがついたインターフェースの実装クラスのインスタンスを自動で生成してアプリケーションに自動でBeanとして登録した後に、コントローラーなどのクラスで@Autowiredの変数があるとBeanからから同じクラスのものを探し、自動的にフィールドに割り当てる。
- @ModelAttributeは、エンティティクラスのインスタンスを自動的に用意するものである。
- @Transactionalは、データベースを利用する一連の処理を一括して実行するための仕組みである。
- @PostConstructは、コンストラクタによりインスタンスが生成された後に呼び出される処理である。
- Optionalクラス(Java8で登場したクラス)は、nullかもしれないオブジェクトをラップするためのクラスである。
- @SuppressWarnings(“unchecked”)は、ビルド時に警告が出ないようにする。
- @PersistenceContextは、Beanを取得して設定する。
- JPQLというクエリ言語をJPAがSQLクエリに変換してDBに投入する。
Spring Bootの構成
- ドメイン層にあるものは、コントローラーやモデルのビジネスロジックから呼び出される。
- @Serviceは、サービスとして登録するもの。
- @AutoWiredで利用するコンポーネントとは、アプリケーション内で自動生成されるBeanのことである。
- サービスもコンポーネントの一種であり、@Componentのとして登録するもの。
- @Componentのクラスでは、@Autowiredコンストラクタによってインスタンスが生成される。
その他
- MongoDBは、NoSQLのDBで「ドキュメント指向データベース」でありデータは一つの巨大なテキストファイルとして保存される保管されるデータは、JSON形式で書かれたコレクションのような形となっている。
サンプルアプリ
本の中のソースを一部カスタマイズして、Herokuにサンプルアプリをデプロイしておりますので、下記のURLから動作確認できます。
https://spring-boot-sample-yhayash30.herokuapp.com/
サンプルコード
サンプルコードは下記に格納しております。
https://github.com/yhayashi30/spring-boot-sample-app
最後に
Spring Bootは、Webアプリに非常に最適化されておりJavaで実装するのであれば有力な選択肢となると感じました。
また、本としても初学者でもわかりやすいように整理された内容に感じたのでおすすめです。