2.1. Macchinetta Server Framework (1.x)のスタック

2.1.1. Macchinetta Server Framework (1.x)のSoftware Framework概要

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

../_images/introduction-software-framework.png

2.1.2. Software Frameworkの主な構成要素

Macchinetta Server Framework (1.x)を構成するライブラリを以下に示す。

../_images/introduction-software-stack.png

2.1.2.1. DIコンテナ

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

2.1.2.2. MVCフレームワーク

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

2.1.2.3. O/R Mapper

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

Note

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

2.1.2.4. View

ViewにはJSPを利用する。

Viewのレイアウトを共通化する場合は、

を利用する。

2.1.2.5. セキュリティ

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

Tip

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

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

を参照されたい。

2.1.2.6. バリデーション

2.1.2.7. ロギング

  • ロガーのAPIはSLF4Jを使用する。
    • ロガーの実装は、Logbackを利用する。

Tip

Logback1.2.7には、攻撃者が設定ファイルを変更できる場合、JNDIを用いる機能を利用してリモートコード実行が可能な脆弱性(CVE-2021-42550)が存在している。ただし、この脆弱性を利用できる状況は攻撃者が設定ファイルを変更できる状態であり、その状況自体がアプリケーション起因や環境起因の重大な脆弱性となる。

このような重大な脆弱性がアプリケーションや環境にない限り、本脆弱性の影響を受けることはない。(このような環境にある場合、本脆弱性を利用せずとも、RCEが可能である)

この脆弱性に対応するために、Logback1.2.8ではJNDIに関する機能をすべて削除し、以降のバージョンで脆弱性に対応した機能を復活させているが、削除された機能がすべて復活しているわけではない。

バージョンを上げることによりアプリケーションが動かなくなる可能性を考慮しLogbackのバージョンを1.2.7のままにしているため、必要に応じてLogbackのバージョンアップを検討されたい。

2.1.2.8. 共通ライブラリ

Note

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

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

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

Note

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

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

  • Spring Frameworkが提供しているライブラリ
  • Spring Frameworkが依存しているOSSライブラリ
  • Spring Frameworkと相性のよいOSSライブラリ

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

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

Type GroupId ArtifactId Version Spring Boot Remarks
Spring org.springframework spring-aop 5.3.18   *3
Spring org.springframework spring-aspects 5.3.18   *3
Spring org.springframework spring-beans 5.3.18   *3
Spring org.springframework spring-context 5.3.18   *3
Spring org.springframework spring-context-support 5.3.18   *3
Spring org.springframework spring-core 5.3.18   *3
Spring org.springframework spring-expression 5.3.18   *3
Spring org.springframework spring-jdbc 5.3.18   *3
Spring org.springframework spring-orm 5.3.18   *3
Spring org.springframework spring-oxm 5.3.18   *3
Spring org.springframework spring-tx 5.3.18   *3
Spring org.springframework spring-web 5.3.18   *3
Spring org.springframework spring-webmvc 5.3.18   *3
Spring org.springframework spring-jms 5.3.18   *3
Spring org.springframework spring-messaging 5.3.18   *3
Spring org.springframework.data spring-data-commons 2.6.0 *  
Spring org.springframework.security spring-security-acl 5.6.0 *  
Spring org.springframework.security spring-security-config 5.6.0 *  
Spring org.springframework.security spring-security-core 5.6.0 *  
Spring org.springframework.security spring-security-taglibs 5.6.0 *  
Spring org.springframework.security spring-security-web 5.6.0 *  
Spring org.springframework.security spring-security-oauth2-client 5.6.0 *  
Spring org.springframework.security spring-security-oauth2-resource-server 5.6.0 *  
Spring org.springframework.security spring-security-oauth2-jose 5.6.0 *  
MyBatis3 org.mybatis mybatis 3.5.7   *1
MyBatis3 org.mybatis mybatis-spring 2.0.6   *1
DI jakarta.inject jakarta.inject-api 1.0.5    
AOP org.aspectj aspectjrt 1.9.7 *  
AOP org.aspectj aspectjweaver 1.9.7 *  
ログ出力 ch.qos.logback logback-classic 1.2.7 *  
ログ出力 org.slf4j slf4j-api 1.7.32 *  
JSON com.fasterxml.jackson.core jackson-databind 2.13.0 *  
JSON com.fasterxml.jackson.datatype jackson-datatype-joda 2.13.0 *  
JSON com.fasterxml.jackson.datatype jackson-datatype-jsr310 2.13.0 *  
入力チェック org.hibernate.validator hibernate-validator 6.2.0.Final *  
Bean変換 commons-beanutils commons-beanutils 1.9.4    
Bean変換 com.github.dozermapper dozer-core 6.5.2    
Bean変換 com.github.dozermapper dozer-spring4 6.5.2   *2
Bean変換 org.apache.commons commons-lang3 3.12.0 *  
日付操作 joda-time joda-time 2.10.9    
日付操作 joda-time joda-time-jsptags 1.1.1    
コネクションプール org.apache.commons commons-dbcp2 2.9.0 *  
Tiles org.apache.tiles tiles-core 3.0.8    
Tiles org.apache.tiles tiles-jsp 3.0.8    
ファイルアップロード commons-fileupload commons-fileupload 1.3.3    
ファイルダウンロード com.github.librepdf openpdf 1.0.5    
ファイルダウンロード org.apache.poi poi-ooxml 4.1.2    
E-mail送信(SMTP) com.sun.mail jakarta.mail 1.6.7 *  
HTTP通信 org.apache.httpcomponents httpclient 4.5.13 *  
ユーティリティ com.google.guava guava 30.1.1-jre    
ユーティリティ commons-collections commons-collections 3.2.2    
ユーティリティ commons-io commons-io 2.11.0    
サーブレット org.apache.taglibs taglibs-standard-jstlel 1.2.5    
コーディングサポート org.projectlombok lombok 1.18.22 *  
  1. データアクセスに、MyBatis3を使用する場合に依存するライブラリ
  2. Spring Framework 4.xに依存するが、ガイドラインで記述している内容においては、Spring Framework 5.xで動作する事を確認しているライブラリ
  3. Spring Bootで管理されているバージョンから、Macchinetta Server Framework (1.x)で使用するバージョンを変更しているライブラリ

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

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

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

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

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

../_images/FrameworkStackProjectDependencies.png

Note

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

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

Note

version 1.8.1.SP1.RELEASEでは TERASOLUNA Server Framework for Java 5.7.1.SP1.RELEASE の共通ライブラリを使用している。

2.1.4.1. terasoluna-gfw-common

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

分類 部品名 説明
例外ハンドリング 例外クラス 汎用的に使用できる例外クラスを提供する。
  例外ロガー アプリケーション内で発生した例外をログに出力するためのロガークラスを提供する。
  例外コード 例外クラスに対応する例外コード(メッセージID)を解決するための仕組み(クラス)を提供する。
  例外ログ出力インターセプタ ドメイン層で発生した例外をログ出力するためのインターセプタクラス(AOP)を提供する。
システム時刻 システム時刻ファクトリ システム時刻を取得するためのクラスを提供する。
コードリスト コードリスト コードリストを生成するためのクラスを提供する。
データベースアクセス(共通編) クエリエスケープ 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-jodatime

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

分類 部品名 説明
システム時刻 Joda Time用システム時刻ファクトリ Joda TimeのAPIを利用してシステム時刻を取得するためのクラスを提供する。

2.1.4.6. 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.7. 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.8. terasoluna-gfw-security-web

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

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