Spring Frameworkの公式スタートガイドについて

# はじめに
今更ながらSpring Frameworkを覚えようと思い[公式のスタートガイド](https://spring.io/guides)を覗いてみたが、数が滅茶苦茶多かった。
本当はすべて実際に実行しようと思っていたが挫折し、カテゴリ分けすら中途半端な感じになったが、一応一通り目は通したので供養のためにまとめた。
なお内容は2018年6月時点のものである。

# スタートガイド
## Spring Bootのビルドの基本について
https://spring.io/guides/gs/spring-boot/
Spring Bootのビルドにおける基本的な内容について。
他のスタートガイドと同列に扱われているが、最初に目を通してもいいと思う。

## IDE
### Spring Tool Suite
https://spring.io/guides/gs/sts/
Spring Framework用のIDEであるSpring Tool Suiteについて。

### IntelliJ IDEA
https://spring.io/guides/gs/intellij-idea/
IntelliJ IDEAの使い方について。Ultimate EditionはSpring Frameworkと連携しているらしいが、多分有料。

## REST API
### 作成
https://spring.io/guides/gs/rest-service/
HTTP GETリクエストでJSONを返すAPIの作り方。
POSTリクエストによるAPIの作成等には特に触れていないので、そこは別途調べる必要がある。

### 実行
https://spring.io/guides/gs/consuming-rest/
`RestTemplate`クラスによる簡単なREST APIの実行方法。

## 定期タスクの実行
https://spring.io/guides/gs/scheduling-tasks/
一定間隔ごとにタスクを実行させたい場合の実装方法について。
サンプルでは`fixedRate`（実行中のタスクが完了したかどうかにかかわらず、一定間隔でタスクを実行）を使用しているが、その他にも`fixedDelay`（実行中のタスクが完了してから一定時間待機して次のタスクを実行）や`cron`なんかもある。

## プロジェクトのビルドについて
### Gradle
https://spring.io/guides/gs/gradle/
Gradleによるビルド。
### Maven
https://spring.io/guides/gs/maven/
Mavenによるビルド。
### WARファイルの作成
https://spring.io/guides/gs/convert-jar-to-war/
WARファイルの作成について。
### マルチプロジェクト
https://spring.io/guides/gs/multi-module/
複数のプロジェクトをビルドする方法について。

## DB
### JDBCによるRDBへの接続
https://spring.io/guides/gs/relational-data-access/
`JdbcTemplate`クラスを使用したRDBへの接続方法について。

### トランザクション管理
https://spring.io/guides/gs/managing-transactions/
その名の通りDBのトランザクション管理について。

## ファイルのアップロード
https://spring.io/guides/gs/uploading-files/
ファイルのアップロード方法について。
インターフェースしか例を表示してない箇所とかあるので、とりあえず動かしたいとかいう場合は[公式のGitHub](https://github.com/spring-guides/gs-uploading-files)を参考にするのが良い。
あとテストコードで`MockMvcRequestBuilders.fileUpload`メソッドを使用しているが[もう非推奨](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/request/MockMvcRequestBuilders.html#fileUpload-java.net.URI-)のようなので、代わりに[`MockMvcRequestBuilders.multipart`](https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/request/MockMvcRequestBuilders.html#multipart-java.net.URI-)メソッドを使うのが良さそう。あんまちゃんと更新してないんだろうか……

##セキュリティ
### LDAPによる認証
https://spring.io/guides/gs/authenticating-ldap/
LDAPによる認証について。
`application.properties`の修正内容を省略しているようなので、その点については[公式のGitHub](https://github.com/spring-guides/gs-authenticating-ldap)が参考になる。
テスト用のためユーザー情報をファイルで管理してたり、パスワードのエンコード用に`LdapShaPasswordEncoder`（[既に非推奨になっているクラス](https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/crypto/password/LdapShaPasswordEncoder.html)）を使用していたりするので、本番で使う場合はもっと色々調べる必要がありそう。

### ページの認証
https://spring.io/guides/gs/securing-web/
Spring Securityを使って認証されたユーザーしか閲覧できないページを作成している。

## Facebook
**※2018/08追記**
下記のリンク自体はあるが、公式のスタートガイド一覧からは削除されていた。GitHubのサンプルプログラムもプロジェクト名が`deprecated`になっているため、今後Facebook関係のプロジェクトは使えない気がする。

### アプリケーションへの接続
~~https://spring.io/guides/gs/register-facebook-app/
`FacebookTemplate`クラスを使ったFacebookアプリケーションへの接続。[公式のGitHub](https://github.com/spring-guides/gs-register-facebook-app)にサンプルあり。~~

### データへのアクセス
~~https://spring.io/guides/gs/accessing-facebook/
Facebookのデータへのアクセスについて。例ではフィード情報を取得しているが、[ドキュメントを見る限り](https://docs.spring.io/spring-social-facebook/docs/current/apidocs/org/springframework/social/facebook/api/Facebook.html)いいね!や友達情報なんかも拾ってこれそう。~~

## Pub/Sub
### Redis
https://spring.io/guides/gs/messaging-redis/
NoSQLデータベースとして知られるRedisだが、メッセージの送受信なんかも出来るらしい。サンプルではそのメッセージの送受信についてまとめている。

### RabbitMQ
https://spring.io/guides/gs/messaging-rabbitmq/
RabbitMQを使ったメッセージの送受信について。

### JMS
https://spring.io/guides/gs/messaging-jms/
JMSによるメッセージの送受信について。

### Google Cloud Pub/Sub
https://spring.io/guides/gs/messaging-gcp-pubsub/
Google Cloud Pub/Subの利用について。サンプルだとSpring Integrationも使用してる。

## Twitter
**※2018/08追記**
下記のリンク自体はあるが、公式のスタートガイド一覧からは削除されていた。GitHubのサンプルプログラムもプロジェクト名が`deprecated`になっているため、今後Twitter関係のプロジェクトは使えない気がする。

### アプリケーションへの接続
~~https://spring.io/guides/gs/register-twitter-app/
Twitterアプリケーションへの接続方法……なのだがなんかページがバグってる気がする。GitHubへのリンクもうまく張れてない。一応公式のGitHubは[ここ](https://github.com/spring-guides/gs-register-twitter-app)。~~

### データへのアクセス
~~https://spring.io/guides/gs/accessing-twitter/
Twitterのデータへのアクセスについて。[ドキュメントを見る限り](https://docs.spring.io/spring-social-twitter/docs/current/apidocs/org/springframework/social/twitter/api/Twitter.html)タイムラインやユーザーリストの操作なんかもできそう。~~

## Neo4j
### データへのアクセス
https://spring.io/guides/gs/accessing-data-neo4j/
グラフデータベースであるNeo4jへのデータアクセスについて。

### REST
https://spring.io/guides/gs/accessing-neo4j-data-rest/
RESTによるNeo4jへのアクセスについて。

## Spring Boot Actuator
https://spring.io/guides/gs/actuator-service/
Spring Bootには[Spring Boot Actuator](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready)なるサブプロジェクトがあり、これを組み込むことでヘルスチェック用のエンドポイント等様々なエンドポイントが追加されるらしい。

## バッチ処理
https://spring.io/guides/gs/batch-processing/
Springにおけるバッチ処理について。
CSVからデータ取得→値を大文字に変換→DBに値を保存という一連の処理を実行している。

## HATEOAS
https://spring.io/guides/gs/rest-hateoas/
HATEOASの考え方？を組み込んだRestful APIの作成について。

## Pivotal GemFire
### データへのアクセス
https://spring.io/guides/gs/accessing-data-gemfire/
インメモリデータグリッドであるPivotal GemFireの利用について。

### データのキャッシュ
https://spring.io/guides/gs/caching-gemfire/
Pivotal GemFireのデータのキャッシュについて。

### REST
https://spring.io/guides/gs/accessing-gemfire-data-rest/
RESTによるPivotal GemFireへのアクセスについて。

## EIP
https://spring.io/guides/gs/integration/
スタートガイドのタイトルは「Integrating Data」（データのインテグレーション？）。
Springのプロジェクトの一つにSpring Integrationなるプロジェクトがあり、調べた限りではEIP（Enterprise Integration Patterns）の概念に従ったフレームワークらしい。データをメッセージとしてやり取りし、他のアプリケーションと統合させるために利用されるんだとか。

## JPA
### データへのアクセス
https://spring.io/guides/gs/accessing-data-jpa/
JPAによるDBへのデータアクセスについて。

### REST
https://spring.io/guides/gs/accessing-data-rest/
REST+JPAによるDBアクセスについて。専用のアノテーションつけるだけでコントローラーとか作成せずとも動作するみたい。

### MySQL
https://spring.io/guides/gs/accessing-data-mysql/
JPAを使用したMySQLへのデータアクセスについて。

## MongoDB
### 利用方法
https://spring.io/guides/gs/accessing-data-mongodb/
NoSQLであるMongoDBの利用について。

### REST
https://spring.io/guides/gs/accessing-mongodb-data-rest/
RESTによるMongoDBへのアクセスについて。

## Webページ
### 作成
https://spring.io/guides/gs/serving-web-content/
SpringフレームワークによるWebページの作成について。

### フォーム入力のバリデーション
https://spring.io/guides/gs/validating-form-input/
タイトルの通り、フォーム入力のバリデーションについて。

### フォーム送信
https://spring.io/guides/gs/handling-form-submission/
フォーム送信について。

## 非同期処理の実行
https://spring.io/guides/gs/async-method/
マルチスレッドによる処理の実行について。

## WebSocket
https://spring.io/guides/gs/messaging-stomp-websocket/
WebSocketの利用について。

## AngularJS
https://spring.io/guides/gs/consuming-rest-angularjs/
AngularJSを利用する場合について。

## rest.js
https://spring.io/guides/gs/consuming-rest-restjs/
rest.jsの利用について。というか、検索かけてもrest.jsが何なのかがいまいちわからなかったがメジャーなんだろうか。

## jQuery
https://spring.io/guides/gs/consuming-rest-jquery/
jQueryの利用について。

## CORS
https://spring.io/guides/gs/rest-service-cors/
CORSへの対応について。

## YARN
### Gradleによるビルド
https://spring.io/guides/gs/gradle-yarn/
YARNを利用したビルドについて（Gradle）。

### Mavenによるビルド
https://spring.io/guides/gs/maven-yarn/
YARNを利用したビルドについて（Maven）。

### アプリケーションの作成
https://spring.io/guides/gs/yarn-basic-single/
YARNを使用したシンプルなアプリケーションの作成について。

### アプリケーションの作成（マルチプロジェクト）
https://spring.io/guides/gs/yarn-basic/
YARNを使用したシンプルなアプリケーションの作成について。シンプルと言いつつHadoopと連携したりすることでJARが3つくらい作成される。

### テスト
https://spring.io/guides/gs/yarn-testing/
YARNを使用したアプリケーションに対するテストについて。

### バッチ処理
https://spring.io/guides/gs/yarn-batch-processing/
YARNを使用したアプリケーションにおけるバッチ処理について。

### バッチ処理の再実行
https://spring.io/guides/gs/yarn-batch-restart/
YARNを使用したアプリケーションで失敗した所からバッチ処理を再開する方法について。

## SOAP
### Webサービスの利用
https://spring.io/guides/gs/consuming-web-service/
SOAPベースのWebサービスを利用する方法について。

### Webサービスの作成
https://spring.io/guides/gs/producing-web-service/
こちらはSOAPベースのWebサービスを作成する方法について。

## キャッシュ
https://spring.io/guides/gs/caching/
データのキャッシュについて。メソッド等の実行結果とかをキャッシュから取得したりとかできるらしい。

## Cloud Foundry
https://spring.io/guides/gs/sts-cloud-foundry-deployment/
STSを利用してPaaSのひとつであるCloud Foundryへアプリケーションをデプロイする方法について。

## HashiCorp Vault
### 設定方法
https://spring.io/guides/gs/vault-config/
機密情報管理のためのアプリケーションにHashiCorp Vaultなるものがあるらしく、それをSpringから利用するための設定方法が記述されている。

### データアクセス
https://spring.io/guides/gs/accessing-vault/
上記HashiCorp Vault内のデータアクセスについて。

## WebFlux
https://spring.io/guides/gs/reactive-rest-service/
Version 5からの新機能で、リアクティブプログラミングによって従来とは異なりノンブロッキングなアプリケーションを作成できるらしい。
……と書いても単語の意味を知らないと何のことだが分からないが、要はより少ないスレッドで効率的な処理を実行できるらしい。
これまでのREST APIの実行には`RestTemplate`があったが、ノンブロッキングなアプリケーションとの通信のために`WebClient`というクラスもVersion 5から追加されており、そちらの使い方も記述されている。

## Azure
https://spring.io/guides/gs/spring-boot-for-azure/
SpringによるアプリケーションをMicrosoft Azureにデプロイする方法について。

## ロードバランサ
https://spring.io/guides/gs/client-side-load-balancing/
Netflix Ribbonというクライアント側ロードバランサを使った例について。[後述](/nulltemp/items/22655c8dde1fe23c1297#サービスディスカバリ)のNetflix Eurekaなんかと絡めて使ったりするらしい。

## ルーティング
### Zuul
https://spring.io/guides/gs/routing-and-filtering/
Netflix Zuulというライブラリを使用したリクエストのルーティング＆フィルタリングについて。

### Spring Cloud Gateway
https://spring.io/guides/gs/gateway/
Spring Cloud Gatewayを使用したリクエストのルーティング。サンプルではNetflixが開発しているHystrixというライブラリ（接続先サービスに障害が発生していた場合に対処してくれたりするらしい）を使用した場合の例が紹介してある。
正直ライブラリの目的をちゃんと理解できていないが、よくZuulと比較されているらしいので多分同じカテゴリなんだろう。
Zuul 1時点ではブロッキングAPIでWebSocket等に対応していないが、Spring Cloud GatewayはノンブロッキングAPIなのでWebSocketにも対応している……というのが[強みだったらしい](https://stackoverflow.com/questions/47092048/how-spring-cloud-gateway-is-different-from-zuul)が、Zuul 2はノンブロッキングAPIになったようなので、他の点で差別化しているんだろうか。

## サービスディスカバリ
https://spring.io/guides/gs/service-registration-and-discovery/
サービスディスカバリ（作成したサービスを登録しておき、必要に応じて検索したりするミドルウェアらしい）であるNetflix Eurekaの利用について。

## APIドキュメント
https://spring.io/guides/gs/testing-restdocs/
Spring REST Docsを使用したAPIドキュメントの作成について。

## テスト
### Consumer Driven Contract
https://spring.io/guides/gs/contract-rest/
コンシューマ駆動契約？について。マイクロサービスにおけるテストの考え方らしい。Spring Cloud Contractというサブプロジェクトがあり、そちらの例になっている。

### Webレイヤーのテスト
https://spring.io/guides/gs/testing-web/
Spring Frameworkのテストの基本について。サーバーが立ち上げられるかどうかの簡単なテストから、サーバーを立ち上げずにAPIの動作テストをしたりしている。

## Circuit Breaker
https://spring.io/guides/gs/circuit-breaker/
[Spring Cloud Gatewayのサンプル](/nulltemp/items/22655c8dde1fe23c1297#spring-cloud-gateway)にも出ていたNetflix Hystrixについて。関連するサービスが停止していた場合、その他の関係するサービスへの影響を食い止めるための仕組み。

## Vaadin
https://spring.io/guides/gs/crud-with-vaadin/
Javaを使用したUIフレームワークであるVaadinについて。サンプルではJPAも使用してDB操作できるUIを作成している。

## Redis
https://spring.io/guides/gs/spring-data-reactive-redis/
Pub/Subで[Redisを使用した場合の例](/nulltemp/items/22655c8dde1fe23c1297#redis)もあったが、普通に値突っ込んで取得する場合のサンプルはこちらになる。

## 設定の管理
https://spring.io/guides/gs/centralized-configuration/
Config Serverなるものを立ち上げクライアントサーバーから参照させることで、複数のクライアントサーバーに対して同じ設定を動的に適用させることが出来る……んだと思ってる。

## Docker
https://spring.io/guides/gs/spring-boot-docker/
みんな大好きDockerとの連携について。

# おわりに
*  数が多すぎる
*  一通り眺めて知らない単語を調べるだけでも勉強にはなる
*  Spring Frameworkの基本といえばDIとかだろうが、それらに関するアノテーションの解説等は上記に含まれていない。それらについては別途調べたり、[公式のリファレンス](https://spring.io/projects/spring-framework#learn)を見るのがいいと思うが、こっちも多い……