【Java】SpringBoot勉強してみた

# はじめに

こんにちは。
少し前にはなりますが、とある企業のセミナーに参加した際に、**SpringBoot**というフレームワークを使っていると知り、気になったので勉強してみました。
復習がてらに、備忘録として記事に残しておこうと思います:sunny:

今回は概念的な内容になります。

# Spring Frameworkってなんぞや

SpringBootを紹介する前に、SpringFrameworkについて説明しておきます:runner_tone1:
### ◆ SpringFrameworkについて

*  Javaの世界では老舗とも言えるフレームワーク
* DI(依存性注入)を実現するためのもの
* DIをベースに様々な機能を実装して「 統合フレームワーク 」に成長

### ◆ Spring Frameworkの「DI」とは? 
  * Dependency Injection(依存性注入)
  * オブジェクト間の依存関係を、オブジェクト内のコードに記述せず、<br> 実行時に外部から呼び出す手法

![DIについて.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906750/21ba6b43-7f54-c347-8664-0646a7ceb22a.png)



### ◆ 多数のフレームワークから構成
SpringFrameworkは多数のフレームワークの集合体です。中でも有名なものとして、SpringMVC、SpringRoo、SpringBootなどがあります。

 * SpringMVC：Model-View-Controllerアーキテクチャーによる開発
 
![MVC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906750/3292ab21-26d7-a75d-f127-d8cb51322d79.png)

 
 * SpringRoo：Spring MVCを補完するライブラリとして登場
      * コードの自動生成機能ライブラリ
      * 簡単なコマンドを実行するだけで、アプリケーションの枠組みが自動的にできあがるらしい(Railsみたいなイメージ)
 * SpringBoot



### ◆ SpringBoot誕生
先ほど説明したSpringMVCやSpringRooはどちらも便利そうで良さげに思えますが、問題点もいくつかあります。SpringMVCは、多くのSpring系のライブラリを正確に組み合わせる必要があり、環境構築も大変。SpringRooもある程度は自動化できましたが、やっぱりまだまだ大変、、

そこで登場したのが**SpringBoot**です！:dizzy:
SpringBootは、最良のWebアプリケーション開発を素早く構築するスターターキット的なライブラリです。**Spring Boot = 「Spring MVCの完成形」**と言えます :tada:

**【SpringBootの特徴】**

* 専用のスターターライブラリを設定ファイルに記述するだけで、 一通りのライブラリの読み込み、環境構築が可能
* データベースアクセスなどの機能をほとんど自動化






# Spring Bootのメリット

Javaの世界でも「Railsライク」とも言われる、効率的で高速開発ができるフレームワークがたくさん出来てきました。 それでも、「 Spring Boot 」を選ぶ理由は何なのでしょうか？

ここではSpringBootのメリットを**5つ**紹介します:raised_hands_tone2:

### ① 面倒なXML設定ファイルの記述がない

従来のJava EE開発はXMLによる設定ファイルだらけで、入力が面倒であったり、エラーの特定が困難である等、問題も多々ありました。

SpringBootでは  以下のような事でXML設定ファイルの記述を少なくしています。

* **Auto-configuration**: 各種設定を必要最低限の記述のみで自動設定
* 不足する部分はJavaConfigを追加 
* **アノテーション**による開発

### ② アノテーション(注釈)記述による コーディング量の削減

アノテーションとは、"@ Xxx" の形式でコンパイラや実行環境にJava の言語機能としては表現できない事や補足などを伝えるものです。
例：@ before(メソッド実行前に呼び出す)

アノテーションは大きく３つの種類に分けることが出来ます。
 
**マーカーアノテーション**：何らかの用途でマークする
**単一アノテーション**：データーを持つ事ができる
**フルアノテーション**：複数のデータを持つ事ができる


### ③ サーバー内蔵方式

一般的なものは、アプリケーションとは別にApache ,Tomcat等のサーバーを準備し、 開発したアプリを追加して動かします。
これに対して、SPringBootには**Javaサーバーが内蔵**されており、 直接サーバーを起動して実行します。

### ④ DIをベースとする一貫した実装

DIをベースとしているため、スッキリしていて分かりやすいのもSpringBootの特徴です:writing_hand_tone2:  

* 数多くのライブラリがあっても、基本的な設計思想は一貫している
* 新しいライブラリが追加されても覚え直す必要なし
* テスト時のインスタンスの差し替え可能


### ⑤ AOP( アスペクト指向プログラミング )

AOPとは、プログラミングを別の視点、側面から考えていこうよ！っていうプログラミング手法です。
 
オブジェクト指向の時、オブジェクト単位に処理を上手く分解できない...どうしよう... 
複数のオブジェクトで同じ操作が散在してしまう.....えらいこっちゃ...
こんな悩みを抱える事があります ( この状態を「横断的関心事」って言うらしいです)

そんな時はAOP！！
アスペクトというモジュールに分離します。AOPによって、オブジェクト指向ではカバーできない部分をカバーする事が出来ます :fist_tone2:

### ⑥ STS ( Spring Tool Suite)

一般的なフレームワーク「本体は提供するから、あとはそれぞれで自由に使ってくれ」 っていうスタンスですが、Spring Bootはフレームワーク本体に加えて**専用開発ツール(STS)**も提供しています。

**【STSの特徴】** 

* ベースは「 Eclipse 」で、Spring Framework利用のためのプラグインが追加されている  
* 必要な処理が自動化され、コードの作成のみに注力できる
*  ここまで環境整備を行っているフレームワークはSpring Framework以外にはほぼ無い(らしい)

# :warning: Spring Bootは「 十分条件 」ではない

フレームワークが提供するのは「プレゼンテーション層」の部分です。MVCにおける、View(画面)、Controller(全体の制御)の部分のみを提供します。つまり、ただ「仕組みがある」というだけで、別の技術も必要になってくるのです...

例えば、データベース関連ではSpring Data JPAやSpring Data MongoDBが必要ですし、画面実装にはテンプレートエンジン( Thymeleaf )というモノも使われます。



# おわりに

ここまで、SpringBootについて紹介してきました。まとめます :writing_hand_tone2:

* SpringBootでは、主にSpring Frameworkのフレームワークを組み合わせて開発
* 複雑な設定処理の記述が必要ない
* SpringBootを使えば、従来よりも簡単に素早く Webアプリケーションを開発できる



最後まで読んでいただきありがとうございます :bow_tone1:
間違っている点などございましたら、ご指摘いただけると嬉しいです！

# 参考文献

今回は主に「Spring Boot2 プログラミング入門」を参考にまとめさせていただきました。初心者にも分かりやすく説明してくれているので、興味のある方は是非:bow_tone1:

* <a href = "https://www.amazon.co.jp/Spring-Boot-2-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798053473">Spring Boot2 プログラミング入門(著者:掌田 津耶乃)</a>

* <a href ="https://www.slideshare.net/masatoshitada7/ 30spring-5-spring-boot-2-103523666">初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー</a>

* <a href ="https://proengineer.internous.co.jp/conten t/columnfeature/13988 ">ProEngineer「Webアプリの高速開発ならぜひ利用したい!Spring Bootとは?」</a>

* <a href ="https://www.qoosky.io/techs/390aad36f8">Qoosky「Java アノテーションに関する基本知識」</a>
* <a href ="https://www.nttdata.com/jp/ja/data- insight/2019/0805/"> DATA INSIGHT「Thymeleafを使ったテンプレー トベースのJava Webアプリケーション開発につ いて」</a>
* <a href="https://www.slideshare.net/aogane/20150724 -spring-50853725">slideshare「20150724 spring勉強会資料」</a>
* <a href ="http://marikooota.hatenablog.com/entry/201 6/04/28/014049">Marikoootaの日記「アスペクト指向」</a>