# 2.1. TERASOLUNA Server Framework for Java (5.x)のスタック

## 2.1.1. TERASOLUNA Server Framework for Java (5.x)のSoftware Framework概要

TERASOLUNA Server Framework for Java (5.x)で使用するSoftware Frameworkは独自のフレームワークではなく、Spring Frameworkを中心としたOSSの組み合わせである。

## 2.1.2. Software Frameworkの主な構成要素

TERASOLUNA Server Framework for Java (5.x)を構成するライブラリを以下に示す。

### 2.1.2.1. DIコンテナ

DIコンテナとしてSpring Frameworkを利用する。

- Spring Framework 6.2

### 2.1.2.2. MVCフレームワーク

Web MVCフレームワークとしてSpring MVCを利用する。

- Spring MVC 6.2

### 2.1.2.3. O/R Mapper

本ガイドラインでは、以下のいずれかを想定している。

- MyBatis 3.5

  - Spring Frameworkとの連携ライブラリとして、MyBatis-Springを使用する。

- JPA3.1

  - プロバイダは、Hibernate 6.6を使用する。

Note

MyBatisは正確には「SQL Mapper」であるが、本ガイドラインでは「O/R Mapper」に分類する。

Warning

どんなプロジェクトでもJPAを採用できるわけではない。”テーブルがほとんど正規化されていない”、”テーブルのカラム数が多すぎる”というテーブル設計がされている場合には、JPAの利用は難しい。

また、本ガイドラインではJPAの基本的な説明は行っておらず、JPA利用経験者がチーム内にいることが前提である。

### 2.1.2.4. View

本ガイドラインでは、以下のいずれかを想定している。

- JSP

- Thymeleaf

Tip

TERASOLUNA Server Framework for Java (5.x) 5.7 まではViewのレイアウトの共通化としてApache Tilesを利用していたが、Jakarta EE 9 以降のライブラリバージョンが存在しておらず、代替ライブラリも存在していない。そのため、TERASOLUNA Server Framework for Java (5.x) 5.8以降では、JSPのレイアウトの共通化は行っていない。

画面レイアウトを行いたい場合は、Thymeleafの使用を検討されたい。

### 2.1.2.5. セキュリティ

認証・認可のフレームワークとしてSpring Securityを利用する。

- Spring Security 6.4

Tip

Spring Security 3.2 から、認証・認可の仕組みの提供に加えて、悪意のある攻撃者からWebアプリケーションを守るための仕組みが強化されている。

悪意のある攻撃者からWebアプリケーションを守るための仕組みについては、

- CSRF対策

- ブラウザのセキュリティ対策機能との連携

を参照されたい。

### 2.1.2.6. バリデーション

- 単項目チェックにはBean Validation 3.0を利用する。

  - 実装は、Hibernate Validator 8.0を利用する。

- 相関チェックにはBean Validation 3.0、もしくはSpring Validationを利用する。

  - 使い分けについては入力チェックを参照されたい。

### 2.1.2.7. ロギング

- ロガーのAPIはSLF4Jを使用する。

  - ロガーの実装は、Logbackを利用する。

Tip

CVE-2021-42550に対応するため、Logback1.2.8以降のバージョンではモジュール構成が変更されDBAppenderに関する機能は別モジュールとなった。

logback-classicやlogback-accessのDBAppenderを使用した機能を利用するためには、pom.xmlに以下のアーティファクトを追加する必要がある。

- ch.qos.logback.db:logback-classic-db:1.2.11.1

- ch.qos.logback.db:logback-access-db:1.2.11.1

### 2.1.2.8. 共通ライブラリ

- https://github.com/terasolunaorg/terasoluna-gfw/tree/5.10.0.RELEASE

- 詳細は共通ライブラリの構成要素を参照されたい。

Note

単体テストで利用するOSSライブラリについては、本章とは別に単体テスト概要で解説している。

## 2.1.3. 利用するOSSのバージョン

version 5.10.0.RELEASEで利用するOSSの一覧を以下に示す。

Note

version 5.5.1.RELEASEより、Spring Bootが提供するspring-boot-dependenciesの`<dependencyManagement>`をインポートする構成を採用している。

`spring-boot-dependencies`の`<dependencyManagement>`をインポートすることで、

- Spring Frameworkが提供しているライブラリ

- Spring Frameworkが依存しているOSSライブラリ

- Spring Frameworkと相性のよいOSSライブラリ

への依存関係を解決しており、TERASOLUNA Server Framework for Java (5.x)で使用するOSSのバージョンは、原則として、Spring Bootで管理されているバージョンに準ずる。

なお、version 5.10.0.RELEASEではSpring Boot 3.4.1に依存しており、管理されるライブラリはSpring Boot Reference Guide - Appendix F. Dependency versionsの通りとなる。

Type | GroupId | ArtifactId | Version | Spring Boot | Remarks
--- | --- | --- | --- | --- | ---
Spring | org.springframework | spring-aop | 6.2.1 | * |
Spring | org.springframework | spring-aspects | 6.2.1 | * |
Spring | org.springframework | spring-beans | 6.2.1 | * |
Spring | org.springframework | spring-context | 6.2.1 | * |
Spring | org.springframework | spring-context-support | 6.2.1 | * |
Spring | org.springframework | spring-core | 6.2.1 | * |
Spring | org.springframework | spring-expression | 6.2.1 | * |
Spring | org.springframework | spring-jdbc | 6.2.1 | * |
Spring | org.springframework | spring-orm | 6.2.1 | * |
Spring | org.springframework | spring-oxm | 6.2.1 | * |
Spring | org.springframework | spring-tx | 6.2.1 | * |
Spring | org.springframework | spring-web | 6.2.1 | * |
Spring | org.springframework | spring-webmvc | 6.2.1 | * |
Spring | org.springframework | spring-jms | 6.2.1 | * |
Spring | org.springframework | spring-messaging | 6.2.1 | * |
Spring | org.springframework.data | spring-data-commons | 3.4.1 | * |
Spring | org.springframework.security | spring-security-acl | 6.4.2 | * |
Spring | org.springframework.security | spring-security-config | 6.4.2 | * |
Spring | org.springframework.security | spring-security-core | 6.4.2 | * |
Spring | org.springframework.security | spring-security-taglibs | 6.4.2 | * | *1
Spring | org.springframework.security | spring-security-web | 6.4.2 | * |
Spring | org.springframework.security | spring-security-oauth2-client | 6.4.2 | * |
Spring | org.springframework.security | spring-security-oauth2-resource-server | 6.4.2 | * |
Spring | org.springframework.security | spring-security-oauth2-jose | 6.4.2 | * |
MyBatis3 | org.mybatis | mybatis | 3.5.17 |  | *3
MyBatis3 | org.mybatis | mybatis-spring | 3.0.4 |  | *3
JPA(Hibernate) | org.hibernate | hibernate-core | 6.6.4.Final | * | *4
JPA(Hibernate) | org.springframework.data | spring-data-jpa | 3.4.1 | * | *4
DI | jakarta.inject | jakarta.inject-api | 2.0.1 | * |
AOP | org.aspectj | aspectjrt | 1.9.22.1 | * |
AOP | org.aspectj | aspectjweaver | 1.9.22.1 | * |
ログ出力 | ch.qos.logback | logback-classic | 1.5.12 | * |
ログ出力 | org.slf4j | slf4j-api | 2.0.16 |  | *5
JSON | com.fasterxml.jackson.core | jackson-databind | 2.18.2 | * |
JSON | com.fasterxml.jackson.datatype | jackson-datatype-jsr310 | 2.18.2 | * |
Thymeleaf | org.thymeleaf | thymeleaf | 3.1.3.RELEASE | * | *2
Thymeleaf | org.thymeleaf | thymeleaf-spring6 | 3.1.3.RELEASE | * | *2
Thymeleaf | org.thymeleaf.extras | thymeleaf-extras-springsecurity6 | 3.1.3.RELEASE | * | *2
入力チェック | org.hibernate.validator | hibernate-validator | 8.0.2.Final | * |
Bean変換 | commons-beanutils | commons-beanutils | 1.9.4 |  |
Bean変換 | org.mapstruct | mapstruct | 1.6.3 |  |
Bean変換 | org.apache.commons | commons-lang3 | 3.17.0 | * |
日付操作 | net.sargue | java-time-jsptags | 2.0.2 |  |
コネクションプール | org.apache.commons | commons-dbcp2 | 2.12.0 | * |
ファイルダウンロード | com.github.librepdf | openpdf | 1.3.35 |  |
ファイルダウンロード | org.apache.poi | poi-ooxml | 5.3.0 |  |
E-mail送信(SMTP) | org.eclipse.angus | jakarta.mail | 2.0.3 | * |
HTTP通信 | org.apache.httpcomponents.client5 | httpclient5 | 5.4.2 |  | *5
ユーティリティ | com.google.guava | guava | 33.3.1-jre |  |
ユーティリティ | org.apache.commons | commons-collections4 | 4.4 |  |
ユーティリティ | commons-io | commons-io | 2.18.0 |  |
サーブレット | org.glassfish.web | jakarta.servlet.jsp.jstl | 3.0.1 | * | *1
コーディングサポート | org.projectlombok | lombok | 1.18.36 | * |

1. Viewに、JSPを使用する場合に依存するライブラリ
2. Viewに、Thymeleafを使用する場合に依存するライブラリ
3. データアクセスに、MyBatis3を使用する場合に依存するライブラリ
4. データアクセスに、JPAを使用する場合に依存するライブラリ
5. Spring Bootで管理されているバージョンから、TERASOLUNA Server Framework for Java (5.x)で使用するバージョンを変更しているライブラリ

## 2.1.4. 共通ライブラリの構成要素

共通ライブラリは、TERASOLUNA Server Framework for Java (5.x)が含むSpring Ecosystem や、その他依存ライブラリでは足りない+αな機能を提供するライブラリである。
基本的には、このライブラリがなくてもTERASOLUNA Server Framework for Java (5.x)によるアプリケーション開発は可能であるが、”あると便利”な存在である。
また、提供している2種類の マルチプロジェクト構成のブランクプロジェクトおよび シングルプロジェクト構成のブランクプロジェクトの共通ライブラリの標準の組込状況は以下の通りである。なお、マルチプロジェクト構成およびシングルプロジェクト構成の共通ライブラリの標準の組込状況は同じである。

項番 | プロジェクト名 | 概要 | Javaソースコード有無 | ViewにJSPを使用したブランクプロジェクトの組込 | ViewにThymeleafを使用したブランクプロジェクトの組込
--- | --- | --- | --- | --- | ---
(1) | terasoluna-gfw-parent | 依存ライブラリの管理とビルド用プラグインの推奨設定を提供する。 | 無 | 有*1 | 有*1
(2) | terasoluna-gfw-common-libraries | 共通ライブラリのうち、Javaソースコードを含むプロジェクトの構成を定義する。依存関係としてpom.xmlに追加する必要はない。 | 無 | 無 | 無
(3) | terasoluna-gfw-dependencies | 共通ライブラリのうち、依存関係定義のみを提供するプロジェクト(terasoluna-gfw-parent以外)の構成を定義する。依存関係としてpom.xmlに追加する必要はない。 | 無 | 無 | 無
(4) | terasoluna-gfw-common | Webに依存しない汎用的に使用できる機能を提供する。本ライブラリを利用する場合は、依存関係としてterasoluna-gfw-common-dependenciesをpom.xmlに追加する。 | 有 | 有*2 | 有*2
(5) | terasoluna-gfw-common-dependencies | terasoluna-gfw-commonプロジェクトが提供する機能を使用する場合の依存関係定義を提供する。 | 無 | 有 | 有
(6) | terasoluna-gfw-web | Webアプリケーションを作成する場合に使用する機能を提供する。Viewに依存しない機能を集約している。本ライブラリを利用する場合は、依存関係としてterasoluna-gfw-web-dependenciesをpom.xmlに追加する。 | 有 | 有*2 | 有*2
(7) | terasoluna-gfw-web-dependencies | terasoluna-gfw-webプロジェクトが提供する機能を使用する場合の依存関係定義を提供する。 | 無 | 有 | 有
(8) | terasoluna-gfw-web-jsp | ViewにJSPを採用するWebアプリケーションを作成する場合に使用する機能を提供する。本ライブラリを利用する場合は、依存関係としてterasoluna-gfw-web-jsp-dependenciesをpom.xmlに追加する。 | 有 | 有*2 | 無
(9) | terasoluna-gfw-web-jsp-dependencies | terasoluna-gfw-web-jspプロジェクトが提供する機能を使用する場合の依存関係定義を提供する。 | 無 | 有 | 無
(10) | terasoluna-gfw-security-web | Spring Securityの拡張部品を提供する。本ライブラリを利用する場合は、依存関係としてterasoluna-gfw-security-web-dependenciesをpom.xmlに追加する。 | 有 | 有*2 | 有*2
(11) | terasoluna-gfw-security-web-dependencies | Spring Securityを使用する場合の依存関係定義(Web関連)と、terasoluna-gfw-security-webプロジェクトが提供する機能を使用する場合の依存関係定義を提供する。 | 無 | 有 | 有
(12) | terasoluna-gfw-string | 文字列処理に関連する機能を提供する。 | 有 | 無 | 無
(13) | terasoluna-gfw-codepoints | 対象の文字列を構成するコードポイントがコードポイント集合に含まれることをチェックする機能を提供する。 | 有 | 無*3 | 無*3
(14) | terasoluna-gfw-validator | 汎用的なBean Validationの制約アノテーションを追加して提供する。 | 有 | 無 | 無
(15) | terasoluna-gfw-security-core-dependencies | Spring Securityを使用する場合の依存関係定義(Web以外)を提供する。 | 無 | 有 | 有
(16) | terasoluna-gfw-mybatis3-dependencies | MyBatis3を使用する場合の依存関係定義を提供する。 | 無 | 有 | 有
(17) | terasoluna-gfw-jpa-dependencies | JPAを使用する場合の依存関係定義を提供する。 | 無 | 有 | 有
(18) | terasoluna-gfw-recommended-dependencies | Webに依存しない推奨ライブラリへの依存関係定義を提供する。 | 無 | 有 | 有
(19) | terasoluna-gfw-recommended-web-dependencies | Webに依存する推奨ライブラリへの依存関係定義を提供する。 | 無 | 有 | 有

1. `<dependency>`要素ではないが、各プロジェクトの`<parent>`要素として組み込まれる。
2. `<dependency>`要素ではないが、`<dependency>`要素からの推移的依存関係として組み込まれる。
3. 使用するコードポイント集合に応じて複数のアーティファクトを提供している。詳細は共通ライブラリから提供しているコードポイント集合クラスを参照されたい。

Javaソースコードを含まないものは、ライブラリの依存関係のみ定義しているプロジェクトである。

なお、プロジェクトの依存関係は以下の通りである。

Note

一部を除き、共通ライブラリにはプロジェクト名末尾に”dependencies”が付与されたプロジェクトが存在する。(例えば、terasoluna-gfw-commonに対応するterasoluna-gfw-common-dependenciesなどである)

このようなプロジェクトでは、共通ライブラリへの依存関係定義の他に、利用を推奨するOSSライブラリへの依存関係定義を提供している為、共通ライブラリを利用する際は”dependencies”が付与されたプロジェクトの方を、依存関係としてpom.xmlに追加することを推奨する。

### 2.1.4.1. terasoluna-gfw-common

terasoluna-gfw-commonは以下の部品を提供している。

分類 | 部品名 | 説明
--- | --- | ---
例外ハンドリング | 例外クラス | 汎用的に使用できる例外クラスを提供する。
| 例外ロガー | アプリケーション内で発生した例外をログに出力するためのロガークラスを提供する。
| 例外コード | 例外クラスに対応する例外コード(メッセージID)を解決するための仕組み(クラス)を提供する。
| 例外ログ出力インターセプタ | ドメイン層で発生した例外をログ出力するためのインターセプタクラス(AOP)を提供する。
システム時刻 | システム時刻ファクトリ | JSR-310 Date and Time APIを利用してシステム時刻を取得するためのクラスを提供する。
コードリスト | コードリスト | コードリストを生成するためのクラスを提供する。
データベースアクセス（共通編） | クエリエスケープ | SQL及びJPQLにバインドする値のエスケープ処理を行うクラスを提供する。
| シーケンサ | シーケンス値を取得するためのクラスを提供する。
メッセージ管理 | メッセージ管理機能 | 結果メッセージを格納するクラスを提供する。

### 2.1.4.2. terasoluna-gfw-string

terasoluna-gfw-stringは以下の部品を提供している。

分類 | 部品名 | 説明
--- | --- | ---
文字列処理 | 半角全角変換 | 半角文字列と全角文字列のマッピングテーブルに基づき、入力文字列の半角文字を全角に変換する処理と全角文字を半角に変換する処理を行うクラスを提供する。

### 2.1.4.3. terasoluna-gfw-codepoints

terasoluna-gfw-codepointsは以下の部品を提供している。

分類 | 部品名 | 説明
--- | --- | ---
文字列処理 | コードポイントチェック | 対象の文字列を構成するコードポイントが、定義されたコードポイント集合に含まれることをチェックするクラスを提供する。
入力チェック | コードポイントチェック用Bean Validation制約アノテーション | コードポイントチェックをBean Validationで行うための制約アノテーションを提供する。

### 2.1.4.4. terasoluna-gfw-validator

terasoluna-gfw-validatorは以下の部品を提供している。

分類 | 部品名 | 説明
--- | --- | ---
入力チェック | バイト長チェック用Bean Validation制約アノテーション | 入力文字列の文字コードにおけるバイト長が、指定した最大値以下であること、最小値以上であることのチェックをBean Validationで行うための制約アノテーションを提供する。
| プロパティ値比較チェック用Bean Validation制約アノテーション | 2つのプロパティ値の比較チェックをBean Validationで行うための制約アノテーションを提供する。

### 2.1.4.5. terasoluna-gfw-web

terasoluna-gfw-webは以下の部品を提供している。

分類 | 部品名 | 説明
--- | --- | ---
二重送信防止 | トランザクショントークンチェック | リクエストの二重送信からWebアプリケーションを守るための仕組み(クラス)を提供する。
例外ハンドリング | 例外ハンドラ | 共通ライブラリが提供する例外ハンドリングの部品と連携するための例外ハンドラクラス(Spring MVC提供のクラスのサブクラス)を提供する。
| 例外ログ出力インターセプタ | Spring MVCの例外ハンドラがハンドリングした例外をログ出力するためのインターセプタクラス(AOP)を提供する。
コードリスト | コードリスト埋込インターセプタ | Viewからコードリストを取得できるようにするために、コードリストの情報をリクエストスコープに格納するためのインターセプタクラス(Spring MVC Interceptor)を提供する。
ファイルダウンロード | 汎用ダウンロードView | ストリームから取得したデータを、ダウンロード用のストリームに出力するための抽象クラスを提供する。
ロギング | トラッキングID格納用サーブレットフィルタ | トレーサビリティを向上させるために、 クライアントから指定されたトラッキングIDを、ロガーのMDC(Mapped Diagnostic Context)、リクエストスコープ、レスポンスヘッダに設定するためのサーブレットフィルタクラスを提供する。 (クライアントからトラッキングIDの指定がない場合は、本クラスでトラッキングIDを生成する)
| 汎用MDC格納用サーブレットフィルタ | ロガーのMDCに任意の値を設定するための抽象クラスを提供する。
| MDCクリア用サーブレットフィルタ | ロガーのMDCに格納されている情報をクリアするためのサーブレットフィルタクラスを提供する。

### 2.1.4.6. terasoluna-gfw-web-jsp

terasoluna-gfw-web-jspは以下の部品を提供している。

分類 | 部品名 | 説明
--- | --- | ---
二重送信防止 | トランザクショントークン出力用のJSPタグ | トランザクショントークンをhidden項目として出力するためのJSPタグライブラリを提供する。
ページネーション | ページネーションリンク表示用のJSPタグ | Spring Data Commons提供のクラスと連携してページネーションリンクを表示するためのJSPタグライブラリを提供する。
メッセージ管理 | 結果メッセージ表示用のJSPタグ | 処理結果を表示するためのJSPタグライブラリを提供する。
EL Functions | XSS対策用EL関数 | XSS対策用のEL関数を提供する。
| URL用EL関数 | URLエンコーディングなどのURL用のEL関数を提供する。
| DOM変換用EL関数 | DOM文字列に変換するためのEL関数を提供する。
| ユーティリティEL関数 | 汎用的なユーティリティ処理を行うためのEL関数を提供する。

### 2.1.4.7. terasoluna-gfw-security-web

terasoluna-gfw-security-webは以下の部品を提供している。

分類 | 部品名 | 説明
--- | --- | ---
ロギング | 認証ユーザ名格納用サーブレットフィルタ | トレーサビリティを向上させるために、 認証ユーザ名をロガーのMDCに設定するためのサーブレットフィルタクラスを提供する。