５分で分かるTERASOLUNA5.x ！

## 0. はじめに

最近、研修等で「[TERASOLUNA Server Framework for Java (5.x)](http://terasolunaorg.github.io/)」について説明する機会が増えてきました。[公式ガイドライン](http://terasolunaorg.github.io/guideline/5.3.0.RELEASE/ja/) は詳細に書かれていて概要（全体像）を理解するには難しいため、毎回ホワイトボードに概要を書いて説明していました。
せっかくなので今回TERASOLUNA5.xの概要を記事としてまとめました。これからTERASOLUNA5.xを使ってみたい人の理解に少しでも役立ては幸いです。

## 1. TERASOLUNA5.xとは？

TERASOLUNA5.xとはNTTデータが無償で公開しているフレームワーク＆ガイドラインで、エンタープライズ開発で広く使われているOSSを組み合わせた動作検証済みのノウハウ集みたいなものです。
利用しているOSSの概要は以下の通りです。

| 項番 | 機能 | OSS |
|:---:|:------|:-------|
| 1 | DIコンテナ　| Spring Framework 4.3 |
| 2 | MVCフレームワーク |Spring MVC 4.3 |
| 3 | DBアクセス |MyBatis 3.4 または JPA2.1（プロバイダは Hibernate 5.0）|
| 4 | 入力チェック |BeanValidation 1.1（実装は Hibernate Validator 5.2）|
| 5 | セキュリティ（認証、認可） |Spring Security 4.1 |

スタックの詳細については公式ガイドラインの「[2.1. TERASOLUNA Server Framework for Java (5.x)のスタック](http://terasolunaorg.github.io/guideline/5.3.0.RELEASE/ja/Overview/FrameworkStack.html)」を参照ください。

## 2. コンポーネントの概要

TERASOLUNA5.xのアプリケーションを実装する際の主要なコンポーネントについて、レイヤ毎に概要を説明したいと思います。

### 2.1. アプリケーション層のコンポーネント（Webプロジェクトの資材）

いわゆるプレゼンテーション層を担当するコンポーネントです。

|       | [Controller](#41-controller) | [Form](#42-form) | [JSP](#43-jsp)     | [Helper](#44-helperオプション)   | [Validation](#45-validationオプション) |
|:-----:|:----------:|:----------:|:----------:|:----------:|:----------:|
| 説明  |画面遷移を制御するクラス |入力データを保持するクラス<br>入力チェックを設定するクラス |画面を構成するファイル |Controllerのサポートクラス|独自の入力チェッククラス|
| 必須  |     ○     |     ○     |     ○     |     －     |     －     |
| 工数  |   **大きい**   |   小さい   |   **大きい**   |   小さい   |    普通    |

### 2.2. ドメイン層のコンポーネント（Domainプロジェクトの資材）

業務ロジックや永続化を担当するコンポーネントです。
**今回はMyBatisを利用する場合について以下に示します。JPAを利用する場合は構成が異なるので注意してください。**

|       |[Service<br>インターフェース](#51-serviceインターフェース)|[ServiceImpl<br>【業務ロジック】](#52-serviceimpl) |[モデル、エンティティ、入出力ビーン](#53-モデルエンティティ入出力ビーン) |[Repository<br>インターフェース](#54-repositoryインターフェース) |[Mapperファイル<br>【業務ロジック】](#55-mapperファイル) |
|:-----:|:----------:|:----------:|:----------:|:----------:|:----------:|
| 説明  |業務ロジックのインターフェース|業務ロジックを実装するクラス|業務データを格納するクラス|DBアクセスのインターフェース|SQLを記述するXMLファイル|
| 必須  |     ○     |     ○     |     ○     |     ○     |     ○     |
| 工数  |   小さい   |  **大きい**   |   小さい   |   小さい   |    **大きい**  |

**（依存関係について）**

レイヤ間の依存関係（ライブラリの依存関係）として、アプリケーション層はドメイン層に依存します。
アプリケーション層からドメイン層のコンポーネントを利用することができますが、反対にドメイン層からアプリケーション層のコンポーネントを利用することはできません。

## 3. 各コンポーネントとデータと処理の流れ

### 3.1. イメージ

<img src="https://qiita-image-store.s3.amazonaws.com/0/195748/ea113904-e6b0-bd08-1a07-dd7cf73c799e.jpeg" width="100%">

### 3.2. データと処理の流れ

1. 入力したデータはFormに格納される。<br>必要ならその際、入力チェックを実施する。
2. ControllerのメソッドでFormを引数として受け取る。<br>業務ロジックを実行するためServiceのメソッドを呼び出す。<br>**トランザクション境界はServiceのメソッドである。**
3. ServiceはRepositoryを利用してDBアクセスを行う。<br>Repositoryのメソッドを呼び出すと、Mapperファイルに記述したメソッドに対応するSQLが実行される。<br>必要なら複数のRepositoryを利用する。
4. Controllerは画面に表示するデータをSpring MVCの`Model`に格納する。<br>JSPは`Model`に格納されているデータを利用し、画面を構築する。<br>JSPがHTMLに変換されてHTTPレスポンスとして返却される。

## 4. アプリケーション層のコンポーネントの詳細

### 4.1. Controller
* 画面遷移を制御するクラス
* 普通のJavaクラス
* Struts1のstruts-config.xml相当の内容を担当
* `@Contoller`アノテーションや`@RequestMapping`アノテーションが付与されているのがポイント

### 4.2. Form
* 入力データを保持するクラス
* 普通のJavaクラス
* 入力チェックのルールを設定するクラス
* Struts1のvalidation.xml相当の内容を担当
* `@Max`、`@Size`、`@NotEmpty`等々の入力チェックのアノテーションが付与されているのがポイント

### 4.3. JSP
* 画面を実装するファイル
* 普通のJSP
* Spring MVCのタグもあるが、ほとんどEL式とJSPタグを利用

### 4.4. Helper（オプション）
* Controllerのサポートクラス
* 普通のJavaクラス
* Controllerの処理が大きくなった場合に作成したり、複数のControllerの共通的な処理として作成
* DIコンテナに登録するため`@Component`アノテーションを付与する
* `@Component`＝Helperではないので注意すること

### 4.5. Validation（オプション）
* 独自の入力チェックを実装するクラス
* Bean Validationの仕様に沿って作成
* チェック用のアノテーションとチェック処理の実装クラスの２つで構成される

## 5. ドメイン層のコンポーネントの詳細

### 5.1. Serviceインターフェース
* 業務ロジックのインターフェース
* 普通のJavaインターフェース

### 5.2. ServiceImpl
* 業務ロジックを実装するクラス
* 普通のJavaクラス
* `@Service`アノテーションが付与されているのがポイント
* DBアクセスが必要な場合、`@Transactional`アノテーションを付与する
* DBアクセスが必要な場合、Repositoryインターフェースをインジェクションして利用

### 5.3. モデル、エンティティ、入出力ビーン
* 業務データを格納するクラス
* 普通のJavaクラス
* DTOやDBのテーブルに対応したEntityのクラス等

### 5.4 Repositoryインターフェース
* DBアクセスのインターフェース
* 普通のJavaインターフェース
* 引数や戻り値の型変換やオブジェクトとレコードのマッピングをMyBatisが簡単にやってくれる

### 5.5. Mapperファイル
* SQLを記述するXMLファイル
* MyBatisのルールに従って作成
* バインド変数（入力パラメータ）の状況に応じて動的にSQLを変更する**動的SQLが便利**

## 6. さいごに

今回はTERASOLUNA5.xの概要について説明しました。ここではなんとなく全体像を分かってもらえれば十分です。
実際にTERASOLUNA5.xを利用してWebアプリを実装するには各コンポーネントの実装方法、環境構築、ツールの使い方、テストの実施方法等々を覚える必要があります。「[TERASOLUNA5.x記事のまとめページ](https://qiita.com/5zm/items/c39f5225c648c62f36ad)」に記事をまとめていますので、興味のある方は参照ください。