Spring サマリー

:::note warn
<sub>https://www.inflearn.com/users/74366/@yhから習った内容を整理しています。
まだ作成中で、個人の勉強に合わせてその都度内容を追加しています。
:::

# Spring
1. [Spring](https://qiita.com/eunaa2934/items/97a0888eb25f926ce0fe
)
2. [Springのヒストリー](https://qiita.com/eunaa2934/items/b1694ada2fc7a93bf2b4)

# SpringFramework 
## 1. 多形性を極大化して利用できるように支援する。
- Javaの長所にもすでに多様性がありましたが、[SOLID](https://qiita.com/eunaa2934/items/20f59faea7844dd92eb1)、良いオブジェクト指向設計の5つの原則をすべて満たすことはできなかった。
1. 最初は[AppConfig](https://qiita.com/eunaa2934/items/67ce41ac583e3e27331b)という別の設定クラスを作り、外部で実装オブジェクトを生成して接続する責任を持つようにした。
    > このように外部からプログラムの制御の流れを管理することを[IOC](https://qiita.com/eunaa2934/items/dbd0aae96c335a3b6598) 、制御の逆転といい、外部から実装オブジェクトを生成し、アプリケーション実行時点（ランタイム）にクライアントに接続することを[DI](https://qiita.com/eunaa2934/items/dbd0aae96c335a3b6598)、依存関係注入という。
    > そしてAppConfigのようにオブジェクトを生成して管理しながら依存関係を連結することをIoCコンテナ、またはDIコンテナという。 （アセンブラ、オブジェクトファクトリーなどと呼ばれることもある。）
    - 短所:開発者がAppConfigを使って直接オブジェクトを生成し依存性を注入しなければならず、[Singleton](https://qiita.com/eunaa2934/items/d4d5873003c7b372ddec)を具現するためには繰り返されるソースを作成しなければならないという問題点があった。(+ [Singleton作成時の注意点](https://qiita.com/eunaa2934/items/4149b5f8961179670fec))

2. そして[Spring Container](https://qiita.com/eunaa2934/items/7ed590a747b1208f2dbb)を使うようになり、最近はAnnotationベースのJava設定クラスを使ってSpring ContainerにSpring Beanを登録する方法を主に使うが、[手動登録方法(@Bean)](https://qiita.com/eunaa2934/items/89128afc84cb3806a6f3)と[自動登録方法(@Component、@Autowired)](https://qiita.com/eunaa2934/items/d95841d8c0b3ae4faf08)がある。
    - ちなみに [@Autowired](https://qiita.com/eunaa2934/items/797b99d91883bf27465d) は自動登録で必須であるだけで、手動と自動登録の両方で使用する。)
    - 業務ロジック[^1]はある程度類似したパターン(Controller、Service、Repositoryなど)があり、自動登録することを推奨し、技術支援ロジック[^2]は手動登録して明確に示すことが良い。
    - [SpringContainerを使った Singleton](https://qiita.com/eunaa2934/items/d9cc34fe780b043b4cb8)先にあったSingletonに関する問題を解決してくれた。

## 2. Spring MVC(Model View Controller)アーキテクチャを提供する。
- Springを通じて主に作るのがウェブアプリケーションだが、スプリングMVCは複雑なウェブアプリケーションを簡単かつ迅速に開発できるように支援する、最も人気のあるウェブフレームワークだ。
- [SpringMVCの大きな流れ](https://qiita.com/eunaa2934/items/8974cde05a15947956c2) + ([ForwardではなくRedirectをした場合])(https://qiita.com/eunaa2934/items/afde3d2294479d154f89)
- 基本機能としては以下のようなものがある。
    1. [リクエストマッピング(@RequestMapping)](https://qiita.com/eunaa2934/items/524c951d1bb2d9423432)
        - 要請を送った時、どのコントロールラーが呼び出されるべきか、どのような方式で処理するかを定義する。
    2. リクエスト照会
        - [クライアントからサーバに要求データを転送する際に主に使用する方法](https://qiita.com/eunaa2934/items/14e0e1f340bf32338b47)が3つありますが、

        - [1.Query Parameter (GET) と 2.HTML Form (POST) のパラメータ照会](https://qiita.com/eunaa2934/items/ebeb9a3d22bdd9004bec)は、Http Servlet Request の@Model Atribute、@Request Param、request.get Parameter() を使用する必要がある。
        - [3.HTTP message body(POST、PUT、PATCHなど)のRequestパラメータ照会](https://qiita.com/eunaa2934/items/1afa0168eb66be5818f5)は@RequestBodyを使用して行うことができる.
        
    3. レスポンス生成
          - [サーバーからクライアントに配信するResponseデータを作成する方法は3つ](https://qiita.com/eunaa2934/items/6af70631eb04a32c3122)がある。
          - ちなみにSpringMVCの大きな流れでForwardとRedirectがあるとしたが、ForwardではModelに、RedirectではRedirectAttributeにデータを入れて伝達する。
          
- その他の活用機能としては、以下のようなものがある。
    1. ログイン処理機能
        - **HTTP**(Hypertext Transfer Protocol、クライアントとサーバ間の通信のための通信規則セットまたはプロトコル)は**無状態(Stateless)**　プロトコルで要請と応答をやり取りすると接続が切れる。 つまり、**クライアントがリクエストをやり直すと、サーバーは以前のリクエストを覚えていない。**　しかし、ログイン後にページにアクセスする場合のようにデータを維持しなければならない時がある。この時に使うものとして[Cookie](https://qiita.com/eunaa2934/items/df95765b953e08d29839)と[Session](https://qiita.com/eunaa2934/items/a19056a03584e4269fc9)、[HttpSession(最も推薦)](https://qiita.com/eunaa2934/items/f84b9a5de4056747dbc9)がある。  
    2. [メッセージ、国際化機能](https://qiita.com/eunaa2934/items/eab4de80195098c9f98b)
        - メッセージを一ヶ所で管理し、地域別に言語を変えることができるよう支援する。
    3. [Logging機能](https://qiita.com/eunaa2934/items/2d258643733049b68ca5)
        - ログインしているかどうかをチェックするロジックのように、共通の関心事(cross-cutting concern)に使いやすいものとして、Servlet FilterとSpring Interceptorがある。        
        > HTTP リクエスト → WAS → **Servlet Filter** → (Dispatcher) Servlet → **Spring Interceptor** → Controller
        - [Servlet Filter](https://qiita.com/eunaa2934/items/36b306152e1428fbad52) はJava EE の一部であり、セキュリティ、ロギング、圧縮などのサブレットレベルでの作業に適している。

[^1]: 業務ロジック : 通常、ビジネス要件を開発する際に追加または変動する内容である。
[^2]: 技術支援ロジック : 業務ロジックを支援するための下部技術や共通技術である。 データベース接続のような技術的な問題や共通ログ処理のような共通関心事(AOP)を処理する際に主に使われる。