Springについて勉強したことまとめる#1 (Springってなんだ？)

こんにちは！
私は23卒の新卒でITエンジニアをしているのですが、つい先日初めての案件にアサインされまして、それに伴って``java spring``を使うことになったので、技術書を読みながら、学んだことをまとめようと思います！

※ この記事はSpringについて解説するものではなく、どちらかというと書籍を読むうえで必要になりそうな知識について調べてまとめた単語、技術集のようなものになる予定です。(もともとは本の内容について要約したような記事にする予定でしたが、読んでいるうちに、この本はその技術が必要になった時に、その部分を引いて活用する辞書タイプの本だと思ったので、引いて活用する際に躓かないように技術を蓄えるような記事にします)


#### 筆者のプロフ
・23卒の新卒でスタートアップのITエンジニアとして就職しました。
・特定の言語や技術に依存した仕事ではなく、幅広くいろいろなことをやるため、様々な知識を身に着ける必要があり、今回の`java spring`もそのうちの一つです。
・就職以前は、専門学校でゲーム制作について学んでおり、`C#`,`C++`はある程度は理解しています。
・`オブジェクト指向`に関しても、一通りの概念は理解しているつもりです。
・`java`に関しては、ここ3日間ほどで勉強系のサイトの教材を通して学びました。(めちゃくちゃ`C#`に構文が似てると思いました。)

#### 今回勉強する技術書
**Spring 徹底入門**
Spring FrameworkによるJavaアプリケーション開発

株式会社NTTデータ/著
出版社 : 翔泳社

https://www.shoeisha.co.jp/book/detail/9784798142470

この記事ではまず、本書のチャプター1にあたるSpringについての説明の部分について取り上げます。

## Spring Frameworkとは
10年以上の歴史を持つjavaアプリケーション開発用のオープンソースフレームワークの1つ
開発当初から掲げられていた設計思想として、「**古いインフラ環境でも、新しいインフラ環境でも、最新のプログラミング思想で設計できること**」を持っているため、長年愛され続けてきた。
大きな特徴として、DIやMVC、AOPといったものがあるようですが、現状は理解できていないので、読み進めていくうちに理解しようと思う。

## Springの各種プロジェクトについて
現在この記事で取り上げているのは、SpringFrameworkだが、実際にはSpringには10以上のプロジェクトがあり、それらが相互的に機能しあいエコシステムを形成している

### Spring MVC
Webアプリケーション開発をするためのフレームワークであり、アーキテクチャにMVCパターンを採用している。
Spring MVCではさらにその中でも、`アクションベースフレームワーク`という、アクション(ユーザーの要求)を中心に処理が構成されるものを採用している。(こっちのほうがアプリケーション開発では一般的)

##### MVCパターン
アプリケーションを`モデル`、`ビュー`、`コントローラ`の3つに分割する設計パターン。
これらが疎結合であることで保守性、拡張性、テスト容易性を確保したソフトウェア開発を行える。
|コンポーネント|役割|
|:-:|:-:|
|モデル|情報を保持するデータ構造を定義|
|ビュー   |ユーザーに見える部分の実装(HTMLなどで表示)|
|コントローラ|入力を受け取り、処理する部分の実装|

### Spring Security
Springベースのアプリケーションに対して**認証**、**認可**などのセキュリティ要件を容易に実現できるフレームワーク
サードパーティー製の認証方法も利用可能

### Spring Data
リレーショナルデータベースやNoSQL、Key-Valueなど、様々なデータストアへのデータアクセスを容易にするもの。(これはフレームワークではない？)
SpringData自体がさらにサブプロジェクトを持っている
<dl>
  <dt>Spring Data Commons</dt>
  <dd>SpringDataの核となるインターフェース。このインターフェースでデータのアクセスを行うことができる。</dd>
  <dt>Spring Data JPA</dt>
  <dd>JPAを用いてデータアクセスを行うためのインターフェースの実装を最小限にする仕組み</dd>
  <dt>そのほか複数のサブプロジェクト</dt>
  <dd>他にも複数サブプロジェクトはあり、これらのサブプロジェクトにはアルファベット順で名前を付けている。</dd>
</dl>

##### JPA
javaのオブジェクトとデータベースを紐づけることができるツール



### Spring Batch
バッチアプリケーション向けの軽量フレームワーク。
大容量のデータ処理に必要な共通機能を提供している。

### Spring Integration
EIPという、システム間を連携させるアーキテクチャパターンに基づく開発をサポートするフレームワーク。

##### EIP
Enterprise Integration Patterns
大規模開発における、インテグレーション(異なるシステム、コンポーネント、ソフトウェア間の相互接続や統合)をサポートする設計原則の集合

### Spring Cloud
分散環境でCloud Nativeなアプリケーション開発をするためのフレームワークおよびツール群
多数のサブプロジェクトから構成される
<dl>
  <dt>Spring Cloud Config</dt>
  <dd>プロパティなどの設定情報をGitなどの外部環境で集中管理し、配布する仕組みを提供</dd>
  <dt>Spring Cloud Bus</dt>
  <dd>分散環境のノード間を軽量のメッセージングでつなぐ仕組みを提供</dd>
  <dt>Spring Cloud Connectors</dt>
  <dd>クラウド環境への接続の仕組みを提供</dd>
  <dt>Spring Cloud Netflix</dt>
  <dd>Netflixが提供するオープンソースソフトウェアを使う仕組みを提供</dd>
</dl>

### Spring Tool Suite
Springアプリケーション開発をするために最適化された`Eclipse`ベースのIDE。
基本的に必要になるツールはすべて内包している。

### Spring IO Platform
Springベースのアプリケーションを開発、実行する際に必要なSpringのサードパーティー製含む各種ライブラリのバージョン決定をし。依存関係を解決するためのSpringサブプロジェクト。
さらには**バージョン管理**や**デプロイの簡易化**もしてくれる必需品。

### Spring Boot
最小限の設定でプロダクションレベルのSpringアプリケーションを容易に開発するためのプロジェクト。
敷居が高くなっていたJavaアプリケーションの開発のハードルを大きく下げた。

## あとがき
以上がSpring Frameworkに関する予備知識といったところでしょうか。
一応本を読みながらかみ砕いて書いてみたのですが、いかんせん知識がないので、本からそのまま引用する形になってしまったところがあって、反省です。
一通り勉強し終わったら、自分の言葉だけで再度書き直してみたいと思っています！