1.Springframeworkを1からはじめる

#Springframeworkとは
そもそもJavaのWebアプリケーション開発には、フレームワークの存在は欠かせないです。
その中で最も使用されているフレームワークのひとつが、このSpringframeworkです。
Springの歴史は長く、2002年に最初のSpring がリリースされてから、現在に至るまでオープンソースとして改良が進められています。 
Springが人気な理由としては、システムの仕様変更のしやすさやプログラムテストの行いやすさ、拡張性、システムの安定性などが評価されてるのが主なようです。

###Springの概要
Springはモジュールの使い方次第で幅広いジャンルのアプリケーションやソフトの開発に利用することができます。
その中で実際の業務等でよく使われるなじみ深いものをいくつかあげるとすると、
　・I/Oプロジェクト
　・アプリケーション開発
　・Webアプリ開発
　・クラウド上のソフト開発
　・データベース管理ソフト
　・Android用アプリ開発
など、少し挙げただけでも多種多様なジャンルで使われていることがわかります。

###Springのメリット
具体的なSpringのメリットをいくつか
　**・DIコンテナとAOPフレームワークによるハイレベルな開発環境**
　　　([AOPの参考記事](https://qiita.com/ughirose/items/a7c66782f93cd1ae0d68))
　**・モジュール群が豊富**
　**・RESTful対応**
　　　([RESTfulAPIの参考記事](https://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2))
　**・Spring 用の IDE （STS）が無料で公開されている**
　**・大規模データベースNoSQL対応**
　　　([NoSQLの参考記事](https://qiita.com/t_nakayama0714/items/0ff7644666f0122cfba1))

###Springのデメリット
メリットだけでなく、デメリットも存在します。
全体的に学習コスト面なデメリットが多いです。
　**・フレームワークの規模が大きく全体を把握するのが難しい
　・DIコンテナの正しい使い方が難しい
　・正しく理解するには高度なJava知識が必要になる**


#Springの代表的な機能群
上記にも登場しましたが、Springの嬉しい機能の一部を掘り下げていこうと思います。

###DIコンテナ
そもそもDI (Dependency injection) とは何なのか？
調べているとよく「依存性の注入」出てくるものではあるのだが、これだけ聞いてもいまいちよく意味が分からない…。
wikiで見ると以下のように書かれています。
>
コンポーネント間の依存関係をプログラムのソースコードから排除し、 
外部の設定ファイルなどで注入できるようにするソフトウェアパターンである。
依存性の注入を利用したプログラムを作成する場合、コンポーネント間の関係はインターフェースを用いて記述し、
具体的なコンポーネントを指定しない。
具体的にどのコンポーネントを利用するかは外部ファイルに記述することで、 コンポーネント間の依存関係をソースコードから排除できる。

やりたき事としては、**「クラス同士を疎結合にし、実データを外部へ出そう」**って事みたいです。

####DIのメリット
コンポーネントAとコンポーネントBを設定ファイルに記述するので、
コンポーネント内で関係を定義する必要がなくなります。これによって、
**コンポーネントAが完成しなければコンパイルエラーが出てしまいコンポーネントBを作れない**
といった作業順序の影響なく開発を行う事が出来ます。

また、クラスの単体テストも行いやすくなります。
テストコードを書くときの問題として、依存性の問題があります。
上記の例で言うと、コンポーネントBのテストを行うのにコンポーネントAまで範囲を広げてテストしなければなりません。
DIコンテナではインターフェースを実装したモックオブジェクトを使用することにより、
クラスそのものの完成やバグ等にかかわらずにテストしたいクラスのみのテストを可能にします。
また、コンポーネントAに修正が入ったとしてもコンポーネントBのテストコードをそのまま利用可能です。

####DIの使用例
設定ファイルというのは例によってxmlの事です。
・servlet-context.xml

```console
1<context:annotation-config />
2<context:component-scan base-package="com.example.controller" />
```
com.example.controller以下のクラスをすべてDI出来るように設定します。

```java
@Controller
public class ExampleController {

    @Autowired
    private ExampleService exampleService ;

    @RequestMapping('/')
    @ResponseBody
    public String find(String itemId) {
        ItemEntity item = exampleService.findItemData(itemId);
        return item.getItemName();
    }
}
```

ExampleServiceに@Autowiredアノテーションを付与しDIしています。
このようにすることでnewせずにオブジェクトを使用することができるようなります。

###Spring MVCとデータアクセス
SpringでWebアプリケーションを開発するためのフレームワークであり、アーキテクチャパターンとしてMVCを用いています。
まんま名前の通り、MVCを実現するためのコントローラ層のフレームワークです。
言わずもがなMVCの概要としては

　**・Model：モデル。ビジネスロジック（アプリケーションの中心となる機能）を処理
　・View：ビュー。情報を表示する
　・Controller：コントローラー。ユーザからのイベントを受け付け、処理と表示を制御する**

Springではコントローラクラスを基にModel操作やViewからの値の受け渡しを実現しています。
さらにコントローラクラス、またはLogicクラスから(たいていの場合トランザクション境界をはさみ)、ドメイン層のサービスクラスの呼び出しを行います。



####アノテーション
Springでは様々なアノテーションで明確に処理を振り分けています。
Springアノテーション「@Component、@Service、@Repository、@Controller」等があります。

**@Controller**
Spring MVCでコントローラ層のクラスに付与します。
これを付与するだけでSpringはこのクラスをコントローラクラスだと認識してくれます。

Spring MVCでは、「あるURLがリクエスト」されたときに、「Aクラスのinit()メソッドを呼び出す」といった流れでリクエストとJavaの処理メソッドのマッピングを行います。

この処理を行うメソッドを決める条件としてURLだけでなく、
header、クッキー、httpメソッド(GETやPOST等)、パラメータ等
ブラウザから送られてくる情報ほぼ全てを使用することが可能です。
上記のような値の受け渡しを、アノテーションで行うことが可能です。

また、コントローラクラス内のメソッドに@ModelAttributeというアノテーションを付与し、
メソッドの返り値をModelに追加し、JSP等で実装したviewへ返すことが可能です。


**@Service**
サービス層のクラス（ビジネスロジック等）に付与します。
コントローラ側から呼び出され、DAO等のDBアクセスを行うクラスを呼び出す事を主とします。


**@Repository**
データ層のクラス（DBアクセスクラス）に付与します。
いわゆるDAOと呼ばれるクラス等、サービスから呼び出されDBアクセスを行います。


**@Component**
SpringのDIコンテナに登録したいクラスへ付与します。
component-scan配下のコンポーネント用アノテーションのついたものを@Autowiredでインスタンスを取得できるようになります。


#次回
Springの記事その1としては一旦ここまでとします。
次回は様々なアノテーションやここまでに書いた機能を掘り下げながら、
実際に小規模システムを作成していきます。