システム方式設計書の書き方（TIS社の公開資料を引用しながら解説）

## 当記事について
システム方式設計書は、システム開発において非常に重要な役割を果たしますが、経験が無いと作成するのはなかなか難しいはずです。
そこで、本記事では、システム方式設計書の書き方について、TIS社が公開している資料を参考にしながら解説していきたいと思います。


## システム方式設計の記載事項について
システム方式設計は、システム全体の設計を理解すべく、システムのアーキテクチャおよび具体的な処理方式を網羅的に記載することが求められます。
基本的には、全体概要、画面系、バッチ系、API系、、、といったようにそれぞれの処理方式をブレークダウンして説明する構成となります。

```
1. はじめに
2. 全体概要
　2.1. アプリケーション全体図
　2.2. ソフトウェア構成
　2.3. アプリケーション・アーキテクチャ
　2.4. ソフトウェアのバージョン
3. 画面処理方式
　3.1. 同期処理方式
　3.2. 非同期処理方式
4. バッチ処理方式
　4.1. 都度起動バッチ処理方式
　4.2. 常駐バッチ処理方式
5. API処理方式
6. 共通事項
```

上記は大分類で、詳細は以降でブレークダウンしていきます。

それでは1つずつ解説していきましょう。
なお、本記事に掲載している資料はTIS社が公開している資料を抜粋したものになります。
資料全体をダウンロードしたい方は以下からどうぞ。

https://github.com/Fintan-contents/spring-archdoc-sample


## 1. はじめに
「はじめに」の章は、読者に本ドキュメントの意図や役割を正しく伝えるために記載します。
目的を明確にすることで、どの情報を重視すべきかを理解し、効率的に作業を進めることが可能となり、また、他の関連資料との関係を示すことで、ドキュメントの位置付けが明確になり、必要な情報へのアクセスがスムーズになります。これにより、誤解を防ぎ、整合性の取れた開発が実現できるのです。

![本書の目的](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/6da67352-bbec-4709-0063-25a17fef7676.png)

![本書の位置付け](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/f6112458-f1e9-2b24-43b3-d0e451b7472f.png)

<br><br>

## 2. 全体概要
システムのアーキテクチャやソフトウェア構成についての全体感を理解するための章となります。
システム全体の設計や処理方式についての概観を示すことで、開発チームや関係者がシステムの構造とその各部分の役割を理解できるようになります。

### 2.1. アプリケーション全体図
システム全体の概要を示すアーキテクチャ図を記載します。全体図はシステム内の主要な構成要素やその相互関係を視覚的に示し、システム全体の構造を一目で把握できるようにします。

![アプリケーション全体図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/12d48e3b-dc19-a73a-41f2-105ce986b9a7.png)


### 2.2. ソフトウェア構成
システムを構成するOS・ミドルウェア・ソフトウェア（フレームワークも含め）について、それらがどのように組み合わさってシステム全体の動作を実現するのかを記載します。

![ソフトウェア構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/5356dadf-53bf-bcef-265b-434f1dc632d4.png)


### 2.3. アプリケーション・アーキテクチャ
本システムで採用する技術やフレームワークの選定理由と、それぞれの役割について記載します。
TISのサンプルでは、以下のようにまとめており、また各技術の公式ドキュメントへのリンクも記載することで、詳細な仕様確認ができるようにしています。

・アプリケーションフレームワークは、Spring Framework（Spring Boot）を採用し、クラウドネイティブアプリケーション開発に対応する。
・データベースアクセスにはMyBatisを使用し、Springとの統合性や相性の良さを活かす。
・Web処理やAPI処理はSpring Web MVCを基盤にし、バッチ処理はSpring Batchを用いることで、各処理方式に最適なアーキテクチャを選定している。

![アプリケーション・アーキテクチャ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/98b947af-7d5d-f7a2-34ee-436ec50721ee.png)


### 2.4. ソフトウェアのバージョン
本システムで使用するソフトウェアやライブラリのバージョン管理について記載します。
選定されたバージョンの背景や理由を記載することで、選択の妥当性が説明可能となり、後続の運用や保守を容易にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/485b42b1-ae31-921c-9ff1-c291cdd9761f.png)

<br><br>

## 3. 画面処理方式
画面処理における同期処理方式と非同期処理方式について記載します。
同期処理は処理が直列的に進行する特性を活かし、リアルタイム性が求められる場面に適用されます。
非同期処理は処理の並列化による効率化を実現し、待ち時間の短縮や操作性の向上を図ります。
それぞれの特性や適用例を記載することで、最適な設計への指針とすることができます。

### 3.1 同期処理方式

#### 3.1.1, 2 処理方式の概要、およびアプリケーション構成
Webブラウザを介した処理方式の概要とアプリケーション構成（図）について記載します。

![処理方式の概要](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/7547e366-7c56-dada-560e-db3e031cb8fb.png)

#### 3.1.3 画面遷移パターン
画面遷移パターンを方式設計書にて記載しておくことで、設計の統一性と効率性を確保し、システム全体の一貫性を高めることができます。また、標準的な遷移パターンを定義することで再利用性が向上し、開発や保守の効率化につながります。

![画面遷移パターン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/198d6343-5dcf-f79b-c602-775ecc119752.png)

![画面遷移パターン1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/f0382afd-9842-07f7-ac97-98b2157820cf.png)

![画面遷移パターン2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/533b6cec-97c3-4e08-1327-dc50fe08db94.png)


#### 3.1.4 責務配置
本システムのアプリケーション内の主要な構成要素を記載し、それぞれの役割と責務を明確にします。

TISのサンプルでは、3階層（プレゼンテーション層、サービス層、データアクセス層）に分けており、また、Spring Framework・MyBatis・Thymeleafテンプレートを活用した責務の分担やレイヤー間のデータ授受の方針についても触れています。

![責務配置](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/a1307436-7efe-aadf-0852-33c457ff05dd.png)

![責務配置2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/8a2b13ac-175b-787c-fca4-bf1c6c7bf2e1.png)


#### 3.1.5. URL設計
本システムにおけるURL設計の方針について記載します。URL設計は、Webブラウザからのリクエストを適切にControllerやRestControllerに振り分けるルーティングの基盤となる重要な要素です。
TISのサンプルでは、URLの構成要素の整理と設計方針、HTTPメソッドの使い分け、HTTPステータスコードの設計基準について解説しています。

![ルーティング](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/9e5298ef-6ebe-af88-727d-8a9790afa27c.png)

![URL設計方針](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/89e74a8f-19e5-0e7c-9bee-5a1d246881ec.png)

![HTTPメソッド](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/84b91320-5907-b587-8188-8c7582268f0f.png)

![HTTPステータスコード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/822be51f-b2ee-4566-984c-ba107594e989.png)

#### 3.1.6. エラー処理
本システムにおけるエラー処理の方針を定義します。

TISのサンプルでは、業務的なエラー、認証・認可エラー、システムエラーに分類し、それぞれの特性に応じた適切なハンドリング方法を記載しています。

![エラーハンドリング方針](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/c4036cc7-897e-7bf4-e1bc-52a3c57b16c8.png)

続いての、「エラーの種類と遷移先の画面」では、それぞれのエラー発生時の遷移先と表示内容を定義しています。業務エラーはSpring Frameworkの機能を使いつつ個々の機能にて遷移先を決定する方針とし、認証・認可エラーはSpring Securityを活用して制御、システムエラーは共通的なハンドリングを行う方針を記載しています。

![エラーの種類と遷移先の画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/f45ffb0e-c813-4af5-e245-2c882c5de8b2.png)

続いての「エラーの種類とエラー発生時のレスポンス」では、それぞれのエラーのレスポンス方針を記載しています。業務エラーは各エラーに応じたメッセージを含むJSON形式のレスポンスを返却し、認証・認可エラーとシステムエラーは共通の仕組みでハンドリングする方針としています。

![エラーの種類とエラー発生時のレスポンス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/0384c4c6-e01a-ca86-b75a-7ad699b64d72.png)


#### 3.1.7. 入力値精査
本システムの入力値精査（入力チェック）の実現方式を記載します。

TISのサンプルでは、Javaのバリデーションの標準仕様の仕組みを使用する方針とし、「単項目精査」「項目間精査」「FormまたはRequestの属性値のみで完結しない精査」の3種類に分類し、それぞれの実装方法を記載しています。

![入力値精査](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/f5bc5758-3ad4-07dc-bc7f-f63cb817555f.png)


#### 3.1.8. スコープ管理
本システムのアプリケーション内でのデータ保持に関するスコープの種類と用途を記載します。

TISのサンプルでは、リクエストスコープは画面間のデータ引継ぎ、セッションスコープは認証情報や検索条件の保持、アプリケーションスコープは基本的に使用しない方針を示しています。

![スコープ管理1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/2d145299-0703-7fbf-d0ed-cfb796b27869.png)

![スコープ管理2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/adfa4aaf-85ab-d575-ec06-f7c2f4e68d19.png)

#### 3.1.9. セッション管理
本システムのセッションIDの管理、有効期限、セキュリティ対策、保存先方針を記載します。

![セッション管理1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/5be6a692-4c93-5f8a-f437-5175f198117d.png)

負荷分散や障害時による縮退運用の際にセッションのデータが失われる可能性があることから、TISのサンプルでは、外部ストレージ（データベース）に保存するためにSpring SessionとSpring Session JDBCを採用する方針としています。

![セッション管理2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/7a357b65-d7b5-5a1a-a8e3-79b118f64b83.png)



#### 3.1.10. データアクセス
データアクセスでは、「データベースへ効率的な接続方法」「SQLの記載ルール」「IDの採番方法」などを記載します。

TISのサンプルでは、コネクションプールにHikariCPを使用してデータベース接続の効率化を図り、MyBatisと連携することで透過的な接続管理を実現しています。

SQLは保守性向上のため、Mapper XMLファイルに統一。

そして、ID採番にはPostgreSQLのserial型を採用することで、要件を満たしつつ実装や管理コストを最小限に抑えています。

![データアクセス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/24610824-071e-80a6-a597-e214491c98c4.png)


#### 3.1.11. トランザクション管理
トランザクション管理は、処理の一貫性を保証するために重要な要素です。本システムでのトランザクション管理方針を記載します。

TISのサンプルでは、Spring Frameworkの活用しトランザクションを自動的に管理する仕組みを採用しています、これにより、手動でのコミットやロールバックの記述漏れを防ぎます。
また、トランザクションの範囲は特定のクラスやメソッドに限定し、管理の効率性や可読性を向上させる方針となっています。

![トランザクション管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/4a239e26-0cbd-e19d-b4ef-e41724d50d64.png)


#### 3.1.12. 排他制御
本システムのデータ更新時の競合を防ぐための基本方針や適用するロック方式（楽観的ロックや悲観的ロック）を記載します。
また、競合検出の仕組み、ロックの取得単位、オンライン処理とバッチ処理間の競合への対応方法について具体的な方針や考慮事項についても記載します。

TISのサンプルでは、データ更新の競合を防ぐために主に楽観的ロックを採用しており、データ更新時にバージョン番号を比較し、競合があれば処理を中止してユーザに通知する仕組みとしています。

オンライン処理では楽観的ロックを用い、競合時は再操作を促します。一方、バッチ処理では悲観的ロックを用い、競合時のリトライを回避する方針としています。

![排他制御](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/c8756c2d-edd8-76f5-e114-9949b1bd3c1d.png)


#### 3.1.13. 認証・認可
本システムで採用する認証・認可の仕組みを記載します。
具体的には、認証方法（例：ユーザ名・パスワードの管理方法やハッシュ化）、認証時の条件（有効期間やロック機能）、認可の制御方法（URLや画面表示制御とロールの対応関係）を記載し、セキュリティ要件を満たす仕様を定義します。

TISのサンプルでは、ユーザ名とパスワードによるフォーム認証を基本とし、ユーザとロール管理を行います。認証にはパスワードのハッシュ化や有効期限管理、認証失敗時のロック機能を実装。認可は、URLごとのロール割り当てで制御し、画面の一部の表示・非表示の制御も可能としているようです。

![認証・認可](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/287d4840-1d9e-d3f8-f3bd-58587d35bd4b.png)

#### 3.1.14. 画面テンプレート
本システムの画面レイアウトや共通部品を効率的に実装する方針を記載します。

TISのサンプルでは、Thymeleafを使用し、共通レイアウトやヘッダー・フッターは独立したテンプレートとして管理する方針としています。これにより、再利用性と保守性を向上させています。

加えて、頻繁に利用されるデータや部品描画用の処理はテンプレート内で呼び出せる仕組みを提供し、コントローラーとの結合を減らしているようです。

なお、JavaScriptやCSSなどの外部ライブラリはCDNまたは静的リソースとして利用し、ビルドツールは使用せずHTMLから直接参照する方針としています。

![画面テンプレート](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/cb088614-5cb5-566d-23a7-41f52f344f5a.png)


#### 3.1.15. ページング
本システムの検索結果一覧画面などで複数レコードを表示する際のページング機能の設計方針を記載します。

TISのサンプルでは、複数のレコードを表示する画面は原則ページングを行う方針としており、詳細画面からの戻る制御時の注意点についても合わせて載せています。

![ページング](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/f0fa1302-0556-aeb6-b8d3-b7384c3277c0.png)

#### 3.1.16. プロパティ管理
本システムのプロパティの用途（例: データベース接続情報）や管理方針を記載します。
また、システム運用にて、プロパティ値を変更する際の制約事項（再起動が必要など）があれば記載します。

TISのサンプルでは、アプリケーション設定はプロパティ、メッセージ、コードの3種類があり、環境依存値はプロパティに定義することとしています。（プロパティは、Spring Frameworkのプロパティファイルを使い、application.propertiesと取引単位ごとのファイルで管理）

また、プロパティファイルの値は、開発の値を設定しておき、本番やテスト環境では実行時に環境変数で上書きする方針としているようです。

![プロパティ管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/a84931a7-e415-eac3-ecac-357840b3db6e.png)


#### 3.1.17. ファイルダウンロード
ファイルダウンロードの設計・実装上の方針を記載します。

以下、TISのサンプル。

![ファイルダウンロード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/739ac2b5-a65b-ed40-267d-961b17843640.png)

#### 3.1.18. ファイルアップロード
ファイルアップロードの設計・実装上の方針を記載します。
ファイルの単位の最大サイズや、1リクエスト全体での最大サイズも目安を決めておくことで、ファイル精査ができます。

以下、TISのサンプル。
![ファイルアップロード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/1cb5a75c-59e1-7c05-ee86-645b65a41657.png)

#### 3.1.19. ウィルス対策
本システムにおけるウィルス対策の方針を記載します。
アプリケーション基盤としてのウィルス対策では、主にファイルアップロードにおける不正なデータやマルウェアの混入に対して、ウィルススキャン等によって防ぐ仕組みを記載します。

以下、TISのサンプル。
![ウィルス対策](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/92b03eea-cb45-94ea-2a7a-80bdacc86f18.png)


#### 3.1.20. 帳票出力
本システムにおける帳票の出力方法について記載します。
また、出力した帳票の保管要否や保管する場合はクリーニングの方針についても記載します。

以下、TISのサンプル。
![帳票出力](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/30a17037-a271-5bf2-6cbb-0a7180ed95a6.png)


#### 3.1.21. セキュリティ対策
本システムへのセキュリティ対策を記載します。

TISのサンプルでは、主要な脆弱性への対策を明確に定めています。
クロスサイトスクリプティングはThymeleafのエスケープ機能を活用し、SQLインジェクションはMyBatisを用いたプレースホルダ実装で防止。
また、CSRF対策はSpring Securityを利用し、ディレクトリトラバーサルやOSコマンドインジェクションはそれぞれ攻撃につながる設定・実装を禁止としています。
そして、暗号化とハッシュ化では、外部通信にセキュアなプロトコルを使用し、ユーザーパスワードは広く使われているPBKDF2でハッシュ化する方針としています。

![セキュリティ対策](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/1670a119-4ce4-5011-d4b0-fbe9461b243e.png)


#### 3.1.22. 二重サブミット防止
ユーザが同一の処理を複数回行ってしまい、同じリクエストが処理されることによるデータ登録や更新が重複して行われることを防止する必要があります。この対策を「二重サブミット防止」と呼び、その対策を記載します。

TISのサンプルでは、サーバ側はトークンを用いた対策、クライアント側はJavaScriptで非活性とする対策の方針としています。

![二重サブミット防止](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/d7c59c5e-4f58-66f1-a1c6-da1c4e736c8f.png)


#### 3.1.23. 戻る遷移制御
ユーザーがブラウザの「戻る」操作を行った際に、フォームの再送信や不正な状態遷移が発生する可能性があり、これを防ぐための制御について記載します。

TISのサンプルでは、history.backを制限しない方針としつつ、業務で必要な「戻る機能」は各画面に専用の遷移機能を実装し、画面内容や検索条件の復元が求められる場合はセッションスコープに情報を保持して管理するようにしています。

![戻る遷移制御](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/d62a08b5-7ab1-9825-1453-f2fadad5e8af.png)


#### 3.1.24. ブラウザキャッシュ制御
ブラウザには取得したコンテンツをキャッシュする機能があり、表示の高速化やサーバ負荷の軽減の点で有効ですが、キャッシュ制御に不備があるとセキュリティ上の不具合の原因となってしまうので、その制御方法について記載します。

TISのサンプルでは、レスポンスのブラウザキャッシュ保存を禁止し、常に最新のリソースを取得させる方針としています。（キャッシュ制御用のHTTPヘッダを付与）

![ブラウザキャッシュ制御](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/8870eb90-94f9-748c-4e89-a5ef04dac10a.png)


#### 3.1.25. 非同期通信(Ajax)
ブラウザ上でJavaScriptからサーバに対して非同期にリクエストを行い、サーバから返却されたレスポンスを画面のHTML内に反映することで画面遷移を伴わずに画面更新を行う方式について記載します。

TISのサンプルでは、以下のような方針としています。
```
・データ形式はJSON
・リクエストは、データ取得時にはURLにパラメータを付加、データ更新時にはリクエストボディにJSONを含める
・レスポンスは必要最低限の情報とする
・検索結果一覧のように複数データを扱う場合はページ情報などの付加できる構造とする
・エラー時の応答形式は別途定義された基準に従う
・セッションや認証状態は通常の画面機能と同様に扱える
```

![非同期通信](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/01e3f500-27e5-79c7-5f9d-87188de143a2.png)

 
#### 3.1.26. Cookie
Cookieの利用方針を記載します。

TISのサンプルでは、業務処理でのCookie利用は禁止する方針としています。

![Cookie](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/56032987-79fd-9359-8cf0-2a31686aa010.png)


#### 3.1.27. ログ出力
本システムのログ出力の方針、ログレベル、ログフォーマット等について方針を記載します。

以下、TISのログ出力の方針や定義です。

![ログ出力1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/7370de54-ffc4-313f-af46-3c57f8c83324.png)

![ログ出力2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/9e792fc9-5ece-f672-21b7-329897535ee3.png)

#### 3.1.28. HTTPクライアント（RESTクライアント）
画面からREST APIを用いた連携を行う場合は、その実現方式やメッセージ形式、エラーハンドリング等の設計方針を明確にします。

以下、TISのサンプル。

![RESTクライアント1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/49571080-6c53-6163-b0bf-aacc32fc24c6.png)

![RESTクライアント2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/8f85eae3-e51c-0e99-e3e9-78e824bf6d9c.png)

![RESTクライアント3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/b3e6d290-247c-4687-78ed-374d657a0523.png)


#### 3.1.29. メール送信要求登録
TISのサンプルのシステムでは、オンライン処理と同時にメール送信を行うのではなく、一旦、メール送信要求をデータベースに格納しておき、メール送信は常駐バッチを使い非同期でメール送信を行う方式としており、その方式について記載をしています。

![メール送信要求登録](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/c8fa1d95-ef74-ab8e-d3cb-ee5c82096570.png)


#### 3.1.30. 開閉局
開閉局とは、Webアプリケーションを業務時間に応じてサービス提供停止(閉局処理)、および、その再開(開局処理)を制御する機能です。
システムメンテナンス時などのシステム運用にて重要な要素となりますので、その方針を記載します。

TISのサンプルでは、サービス提供時間外はロードバランサにて、Sorryページに振り分ける方針としています。

![開閉局](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/055c9bad-9104-b00e-1a65-19b0cac91483.png)



#### 3.1.31. ヘルスチェック
システムが正常に稼働しているかをどのようにチェックするかの方針を記載します。

ロードバランサがWebアプリケーションの稼働状態を確認し、正常なインスタンスにのみリクエストを振り分ける仕組みで、TISのサンプルでは、Spring Bootの機能を活用し、アプリケーションサーバや関連リソースが正常かどうかを確認し、すべてが正常な場合に応答を返す設計としています。

![ヘルスチェック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/02fd6a15-2435-63cc-ea71-fdd834e2916c.png)

#### 3.1.32. コンテナイメージ作成
アプリケーションのコンテナイメージ作成方針について記載します。

以下、TISのサンプル。
![コンテナイメージ作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/714dc545-8deb-cb62-c76e-8cc6a21a975b.png)

#### 3.1.33. 複数ウィンドウ/タブの同時操作時の挙動
複数のウィンドウやタブで画面を開くと、セッション情報が全てのタブで共有されるため、意図しない動作が発生する可能性があります。
このため、複数タブの同時操作時の挙動についてはあらかじめ整理しておく必要があります。

TISのサンプルでは、特別な対応を行わない方針としています。（操作は後勝ちの挙動となる）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/fa9bcf34-ebb3-555f-f819-25a00d02caf2.png)


<br><br>

### 3.2 非同期処理方式
Webアプリケーションでリアルタイムで処理するには重たい場合や、画面からの指示で外部システム連携を行いたい場合に「非同期処理方式」使用します。その方式について記載します。

#### 3.2.1. 処理方式概要
非同期処理方式の実現方法について概要を記載します。

![処理方式概要](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/0efdb9b1-0750-e56f-8dd2-04573d3dce27.png)


#### 3.2.2. 入力値精査
非同期処理方式の入力値精査の方針について記載します。

TISのサンプルでは、単項目精査と項目間精査を行い、OKとなったデータのみが要求テーブルに登録される方針としています。

![入力値精査](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/e0819821-412f-c9ad-14ba-8a9b931bbd3e.png)


#### 3.2.3. 要求の処理状況
非同期処理への要求の処理情報についてユーザーがどのように分かるのか、方針を記載します。

以下、TISのサンプル。
![要求の処理状況](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/a47a699d-f508-76a3-574a-a8fdcdb7cf43.png)

<br><br>

## 4. バッチ処理方式
バッチ処理の「都度起動バッチ」と「常駐バッチ」の方式について記載します。

都度起動バッチは、ジョブスケジューラからの定刻起動などにより、大量データの一括処理などを行う処理方式です。
一方の常駐バッチは、プロセスを常駐させておき、一定間隔で繰り返し実行する処理方式です。
それぞれの特性や適用例を記載することで、最適な設計への指針とすることができます。

### 4.1. 都度起動バッチ処理方式
#### 4.1.1, 2 処理方式概要、およびアプリケーション構成
都度起動バッチ処理方式の概要、アプリケーション構成（図）、および起動方法等の基本的な事項について記載します。

TISのサンプルでは、ジョブスケジューラーがジョブを起動し、ジョブ内でシェルスクリプトがバッチ処理を制御する構成となっています。バッチ処理はシェルスクリプトで事前処理を行い、業務処理はバッチアプリケーションで実装。また、ジョブスケジューラーは依存関係や終了コードに基づき後続処理を制御する仕組みです。

![アプリケーション構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/4f4b4fa4-1523-5667-755f-cd2871967d02.png)

##### ・バッチの起動方法
本システムでのバッチの起動方法を記載します。

![バッチ処理起動方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/f11dfef6-b541-a850-e1f2-5e0d03ef0569.png)

##### ・バッチ処理終了コード
本システムでのバッチ処理の終了コードを定義します。

![バッチ処理終了コード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/42e657d8-f90b-a633-7619-c2319e67ad43.png)

##### ・ジョブ起動方法
本システムでのジョブの起動方法を記載します。

![ジョブ起動方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/879040a1-3bd6-e601-f988-0bddf32b8e97.png)

##### ・ジョブ終了コード
本システムでのジョブの終了コードを定義します。

![ジョブ終了コード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/770d0d3a-b42c-d86a-4dac-466093f71a44.png)


#### 4.1.3. バッチ処理パターン
バッチ処理のパターンを記載します。
バッチ処理パターンを方式設計書にて記載しておくことで、設計の統一性と効率性を確保し、システム全体の一貫性を高めることができます。また、標準的な処理パターンを定義することで再利用性が向上し、開発や保守の効率化につながります。

##### ・バッチ処理パターンの一覧

![バッチ処理パターンの一覧](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/5b51afc6-77f9-b0c8-56e2-a18cc3e51295.png)

##### ・バッチ処理パターン
![バッチ処理パターン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/fb37c7d0-707d-88b1-d98a-ca714aa489d7.png)


#### 4.1.4. 責務配置
本システムのバッチ処理の主要な構成要素を記載し、それぞれの役割と責務を明確にします。

TISのサンプルでは、Spring Batchを使用する方針としています。（資料にはSpring Batchの主要な構成要素も記載されている）

![構成要素](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/20aa5147-a685-f02d-29da-677a07902c4b.png)

##### ・Chunk型の場合の責務配置
バッチ処理の種類に応じて、それぞれの責務配置を記載します。
※Chunk（チャンク）型とは、一定件数ごとに処理を行うバッチモデルで、大量のデータを効率的に処理する必要がある場合や、データの読取・処理・書き込みが明確に分かれている場合に適しています。

![Chunk型1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/9bcd60b9-8d7a-5f24-36d2-13e75cd87962.png)

![Chunk型2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/b6b513d3-7c77-21c6-9735-21ea23910718.png)

##### ・Tasklet型の場合の責務配置
続いて、Tasklet型の説明です。
※Tasklet（タスクレット）型とは、バッチ処理を1つの大きなタスクとするバッチモデルです。単一の処理や特定のステップだけを実行する場合に適しています。

![Tasklet型](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/19bb2110-8a60-4720-9ced-598ce166acb3.png)



#### 4.1.5. ジョブスケジューラー
本システムで使用するジョブスケジューラーについて記載します。
JP1のようなジョブ管理システムが既に設置されている場合は、それを利用する場合が多いと思います。

TISのサンプルでは、cronを使用する方針としています。

![ジョブスケジューラー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/03a67c2b-a217-cac0-d18f-f6713e230e92.png)


#### 4.1.6. 稼働環境
バッチ処理の稼働環境について記載します。

TISのサンプルでは、アプリケーションを動作させる環境（本番、検証、開発、ローカル）ごとに設定を切り替える方針となっています。環境ごとに識別子を付与し、Spring FrameworkのProfile機能を使用して実行時に設定を変更する仕組みです。
環境別設定はシェルスクリプトで管理し、ビルド時に環境に応じた構成をパッケージ化する方式を採用しています。

![稼働環境](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/6c3c70fe-8b03-9e1d-7dda-197e2f023102.png)


#### 4.1.7. データ入出力
バッチ処理におけるデータ入出力を記載します。
基本的には、ファイルとデータベースになると思われます。

![バッチ処理における入出力の種類](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/8180ff7e-8797-e3c2-3ef3-f608e0a86391.png)

##### (1) データディレクトリ使用方針
ジョブ内におけつファイル入出力のディレクトリの使用方針です。

![データディレクトリ使用方針1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/860c944d-f8a4-bf1a-7bc6-48d669f55294.png)

（ディレクトリのクリーニングの方針）

![データディレクトリ使用方針2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/ee5fbda8-785c-a61c-2c73-a5857adc20ab.png)

（ディレクトリのその他の方針）

![データディレクトリ使用方針3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/2e6e1863-e49d-3e31-855f-e2d7bed2f2c1.png)

##### (2) テーブル使用方針
ジョブ内で使用するテーブルの使用方針です。

TISのサンプルでは、外部から連携されるデータは一度、ワークテーブルにロードし、必要な精査処理が完了した後に本テーブルに取り込む方針としているようです。

![テーブル使用方針](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/fff4a1e6-71e3-2ad5-fa38-4fb05b09c046.png)

##### (3) 外部システムとのデータ連携パターン
外部システムとのファイル連携（取得および送信）についてパターンを記載します。

（外部システムからのファイル取得）
前述の通り、一度ワークテーブルに取り込んだ後に、本テーブルに登録する流れです。
![外部システムからのファイル取得](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/63882ed7-b40e-43b5-dc37-285ae740ef9f.png)

（外部システムへのファイル送信）
ファイル作成後、圧縮をした上で送信する流れです。
![外部システムへのファイル送信](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/dc140812-22dc-1316-988b-f3785f360368.png)


#### 4.1.8. エラーハンドリング
バッチ処理内で発生するエラーの種類と、そのハンドリングの方針を記載します。

TISのサンプルでは、バッチ処理内で発生するエラーを「警告終了」と「異常終了」に分類し、それぞれの状態を終了コードに反映する仕組みとしています。（警告終了エラーでは処理を継続し、異常終了エラーでは処理を即座に停止）

![エラーハンドリング](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/8a81da8f-3280-5d79-ff8e-72df926fb685.png)

#### 4.1.9. 入力値精査
バッチ処理で取り扱うデータの入力値の精査方針について記載します。
主に以下の2種類があり、それぞれについての方針を記載します。
・システム外部(ユーザ、他システム)が提供するデータ(ファイルやAPI等）
・バッチ処理の起動時に指定されるコマンドライン引数

![入力値精査の種類](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/f152c722-fcc6-d658-e38a-b190c919acc3.png)

##### ・外部入力（Item）に対する入力値精査の実現方式

![外部入力（Item）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/e9ea7f6c-6cf7-4e35-95f6-87f6c45ce267.png)

##### ・コマンドライン引数に対する入力値精査の実現方式

![コマンドライン引数](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/77027875-18ac-b912-7f35-c3e3054be9bf.png)


#### 4.1.10. ファイルアクセス
バッチ処理の入出力で扱うファイルフォーマットとそのアクセス方針について記載します。

TISのサンプルでは、CSVとXMLのファイルフォーマットを扱うとし、それぞれSpring Batchが提供する機能を使用して読み書きを行う方針としています。

![ファイルアクセス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/43655c26-3161-04a3-4082-b56e752541bd.png)


#### 4.1.11. データアクセス
データアクセスでは、「データベースへ効率的な接続方法」「SQLの記載ルール」「IDの採番方法」などを記載します。

TISのサンプルでは、基本的に画面と同じ方針となっているようです。

![データアクセス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/9f5f8f8f-20ce-52b4-5e09-0ec7f3bb8c97.png)


#### 4.1.12. トランザクション管理
トランザクション管理は、処理の一貫性を保証するために重要な要素です。本システムでのトランザクション管理方針を記載します。

TISのサンプルでは、Spring Batchの制御に則る方針とし、どのようなトランザクションの境界となるかを補足説明しています。

![トランザクション管理方針](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/78f5256e-7519-5842-9d60-d0532f124b43.png)

![トランザクション境界](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/f984d99f-a043-8b42-eca3-47148b76af98.png)

#### 4.1.13. 排他制御
本システムのデータ更新時の競合を防ぐための基本方針や適用するロック方式（楽観的ロックや悲観的ロック）を記載します。

また、競合検出の仕組み、ロックの取得単位、オンライン処理とバッチ処理間の競合への対応方法について具体的な方針や考慮事項についても記載します。

![排他制御](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/5b3b4bb9-23fd-de68-8d1f-0a615b97901b.png)


#### 4.1.14. 0件データ処理
ファイルやデータベースのテーブルを入力データが0件、もしくは未存在の場合について方針を記載します。

TISのサンプルでは、個々のバッチ処理の設計で定めるものとしています。

![0件データ処理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/533d78b3-5f6d-12f5-f6a2-2eedf0f63d69.png)


#### 4.1.15. バッチ処理実行情報管理
バッチ処理における実行履歴や処理状況の確認方法について記載します。

TISのサンプルでは、バッチ処理方式の実行基盤としてSpring Batchを使用する方針であることから、JobRepositoryにて管理されるので、その概要も含めて記載しています。

![バッチ処理実行情報管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/4b921d54-d0b5-c907-bc2e-64ae6b27bd5c.png)

#### 4.1.16. 多重起動制御
同じジョブやバッチ処理を同時に複数起動した場合の振る舞いについて記載します。

TISのサンプルでは、多重起動を禁止する、としています。

![多重起動制御](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/3c8ac9af-1e5b-8164-f899-eb2589d598d2.png)


#### 4.1.17. リラン
ジョブ内のバッチ処理が異常終了した場合のリラン方針について記載します。

TISのサンプルでは、入力データを最初から処理し直す「単純リラン」とすることを原則しているようです。

![リラン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/90df2682-ca52-aeec-bee0-906c31cfc235.png)


#### 4.1.18. プロパティ管理
本システムのプロパティの用途（例: データベース接続情報）や管理方針を記載します。
また、システム運用にて、プロパティ値を変更する際の制約事項（再起動が必要など）があれば記載します。

TISのサンプルでは、アプリケーション設定はプロパティ、メッセージ、コードの3種類があり、環境依存値はプロパティに定義することとしています。（プロパティは、Spring Frameworkのプロパティファイルを使い、application.propertiesと取引単位ごとのファイルで管理）

また、使用するプロパティファイルは、バッチの起動時にSpring FrameworkのProfileとして指定することで切り替えを行うようです。

![プロパティ管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/0e85933d-9d35-f178-e40a-16c903a6fac3.png)


#### 4.1.19. ログ出力
本システムのログ出力の方針、ログレベル、ログフォーマット等について方針を記載します。

TISのサンプルでは、進捗状況や入出力情報、スキップレコードの詳細を記録するログを出力する方針となっています。共通的なログ出力は基盤部品として実装し、指定のファイルパスに保存されます。また、ログ出力にはSLF4JやLogbackを使用し、ログフォーマットはシェルスクリプトとJava間で統一する仕様です。

![ログ出力1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/4e83107f-5b1e-aa3a-16f3-9a6ab56c50ea.png)

![ログ出力2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/8814440c-442f-5a9a-7f7d-88703daa50ab.png)


#### 4.1.20. HTTPクライアント
システム内部の連携や外部システムとの連携で HTTP を使用した連携を行う場合は、その実現方式やメッセージ形式、エラーハンドリング等の設計方針を明確にします。

![HTTPクライアント1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/45dc18c9-27fd-c766-2391-8faae2977ee6.png)

![HTTPクライアント2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/2631f651-8324-43d5-6e5f-1153bcf1c7b9.png)


#### 4.1.21. SFTPクライアント
システム内部の連携や外部システムとの連携で SFTP を使用した連携を行う場合は、その実現方式やメッセージ形式、エラーハンドリング等の設計方針を明確にします。

![SFTPクライアント1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/b4356ccc-447b-7655-9a51-9dc231e4f8e6.png)

![SFTPクライアント2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/f8541199-80c2-6de6-e419-5d6f0ea7b154.png)


#### 4.1.22. メール送信要求登録
TISのサンプルのシステムでは、オンライン処理と同時にメール送信を行うのではなく、一旦、メール送信要求をデータベースに格納しておき、メール送信は常駐バッチを使い非同期でメール送信を行う方式としており、その方式について記載をしています。

![メール送信要求登録](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/09a3ec6c-3a6c-aac4-265c-29d5764a9ab2.png)


<br><br>

### 4.2. 常駐バッチ処理方式
#### 4.2.1. 処理方式概要
常駐バッチ処理方式の概要について記載します。
（常駐バッチは、プロセスを常駐させておき、一定間隔で繰り返し実行する処理方式です）

![処理方式概要](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/3e5eca1b-824d-bab7-6662-6e0e77342285.png)

#### 4.2.2. アプリケーション構成
常駐バッチ処理方式のアプリケーション構成（図）について記載します。

![アプリケーション構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/2c44b0ca-2b4b-b829-3162-55f766082f22.png)

#### 4.2.3. 処理制御
常駐バッチにおける、処理制御方法について記載します。

![処理制御](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/2d7a40fb-a391-5b2d-82c5-82399864abb0.png)

#### 4.2.4. 責務配置
常駐バッチにおける、アプリケーション内の主要な構成要素を記載します。

![責務配置](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/cde61c62-ed06-0733-4608-0e58a638c3f1.png)

#### 4.2.5. 要求データ
常駐バッチの起動時の要求データの方針について記載します。

TISのサンプルでは、要求テーブルのレイアウト（カラム）の一部を指定しています。

![要求データ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/c0e0d016-c4c8-a144-e6e4-7e4ebbf8ea50.png)

#### 4.2.6. エラーハンドリング
常駐バッチ処理内で発生するエラーの種類と、そのハンドリング方針を記載します。

TISのサンプルでは、エラーの種類と処理方針（リトライ有無）を定義しています。

![エラーハンドリング](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/a96a3c5d-544c-4351-c443-05de8e1855b1.png)


#### 4.2.7. トランザクションの単位
トランザクション管理は、処理の一貫性を保証するために重要な要素です。本システムでのトランザクション管理方針を記載します。

TISのサンプルでは、基本的には都度起動バッチと同様のため、「4.1.12.トランザクション管理」を参照する旨としています。

![トランザクションの単位](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/04148aa3-c40c-3216-2d9d-20b6ff4cb28b.png)


#### 4.2.8. 多重起動制御
同じジョブやバッチ処理を同時に複数起動した場合の振る舞いについて記載します。

TISのサンプルでは、多重起動を禁止する、としています。

![多重起動制御](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/41e8083d-9848-626e-26a3-f8a4da3fb0cd.png)


#### 4.2.9. メール送信
TISのサンプルでは常駐バッチでメールを送信する方針としているため、その実現方式を記載しています。

![メール送信](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/c6ebcf3d-6a22-9e57-6504-d16ab4d6da07.png)


<br><br>


## 5. API処理方式
### 5.1, 2 処理方式概要、およびアプリケーション構成
API処理方式の概要、アプリケーション構成（図）、および起動方法等の基本的な事項について記載します。

![アプリケーション構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/f8136034-7a4c-bfc3-0908-fd74f9db6da8.png)


### 5.3. 責務配置
API処理方式における、アプリケーション内の主要な構成要素を記載します。

TISのサンプルでは、3階層（プレゼンテーション層、サービス層、データアクセス層）に分けており、また、Spring Framework・MyBatisを活用した責務の分担やレイヤー間のデータ授受の方針についても触れています。

![責務配置1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/93285cd7-55f7-52e7-b92a-ebf01c4d6efc.png)

![責務配置2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/9a1a1a27-ede6-9885-5030-9cfa6f590de2.png)


### 5.4. URL設計
API処理方式におけるURL設計について方針を記載します。

TISのサンプルでは、URLの構成要素の整理と設計方針、HTTPメソッドの使い分け、HTTPステータスコードの設計基準について解説しています。

![URL設計1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/2bdcb6c5-b17d-4ff1-0327-57afd3fff14d.png)

![URL設計2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/1241226b-cc1c-86e4-990e-2b5f85ded9fc.png)


### 5.5. エラー処理
API処理内で発生するエラーの種類と、そのハンドリングの方針を記載します。

TISのサンプルでは、業務的なエラー、認証・認可エラー、システムエラーに分類し、それぞれの特性に応じた適切なハンドリング方針とレスポンスの内容を記載しています。

![エラー処理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/050abc0d-877e-3576-0909-0f5c7f0c236c.png)


### 5.6. データフォーマット
API処理におけるデータフォーマットの方針を記載します。

![データフォーマット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/5bd3f2ac-5a25-cf17-7500-7ceedcc75009.png)


### 5.7. 入力値精査
API処理で取り扱うデータの入力値の精査方針について記載します。

TISのサンプルでは、Javaのバリデーションの標準仕様の仕組みを使用する方針とし、「単項目精査」「項目間精査」「Requestの属性値のみで完結しない精査」の3種類に分類し、それぞれの実装方法を記載しています。

![入力値精査](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/1dc5ceeb-b659-a7ff-e1ee-32192adf34db.png)



### 5.8. スコープ管理
本システムのアプリケーション内でのデータ保持に関するスコープの種類と用途を記載します。

TISのサンプルでは、基本的に使用しない方針としています。

![スコープ管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/8fe7baaa-0ce9-3420-a208-6f785de7d7e5.png)


### 5.9. データアクセス
データアクセスでは、「データベースへ効率的な接続方法」「SQLの記載ルール」「IDの採番方法」などを記載します。


TISのサンプルでは、画面と同様の方針となっています。

![データアクセス](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/c1f35d86-5870-479d-3aa0-add7ec5115d2.png)


### 5.10. トランザクション管理
本システムでのトランザクション管理方針を記載します。

TISのサンプルでは、画面と同様の方針となっています。

![トランザクション管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/38f74497-884a-5366-bf22-24207ab55000.png)


### 5.11. 排他制御
本システムのデータ更新時の競合を防ぐための基本方針や適用するロック方式（楽観的ロックや悲観的ロック）を記載します。
また、競合検出の仕組み、ロックの取得単位、オンライン処理とバッチ処理間の競合への対応方法について具体的な方針や考慮事項についても記載します。

TISのサンプルでは、画面と同様の方針となっています。

![排他制御](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/849a953f-d627-4134-ca02-c9dc4af6f7d8.png)


### 5.12. 認証・認可
API処理において、本システムで採用する認証・認可の仕組みを記載します。

TISのサンプルでは、参照系APIは認証を行わず、登録・更新・削除のみ認証を行う方針としています。（APIトークンを利用した認証）
また、APIでの認可は行わない方針としています。

![認証・認可](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/59328989-8764-21b2-e410-932d77cea239.png)


### 5.13. ページング
検索結果取得などで複数レコードを表示する際のページング機能の設計方針を記載します。

![ページング](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/fdc3ea3f-2d53-e2c0-43d6-979da48d6084.png)


### 5.14. プロパティ管理
本システムのプロパティの用途（例: データベース接続情報）や管理方針を記載します。
また、システム運用にて、プロパティ値を変更する際の制約事項（再起動が必要など）があれば記載します。

TISのサンプルでは、画面と同様の方針となっています。

![プロパティ管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/07d70bf8-9497-52a3-762b-abe8cb00c484.png)


### 5.15. セキュリティ対策
本システムへのセキュリティ対策を記載します。

![セキュリティ対策](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/8cfcfe7f-6658-a494-cd61-6cb1e8f7d2a6.png)


### 5.16. キャッシュ制御
API処理のおけるキャッシュ制御について記載します。

TISのサンプルでは、画面と同様の方針となっています。（キャッシュしない）

![キャッシュ制御](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/2499dff3-382b-76e8-66d4-9038d2d779fb.png)


### 5.17. Cookie
API処理でCookieを使用する場合は、その使用方針を記載します。

TISのサンプルでは、API処理でのCookieの使用は禁止しています。


### 5.18. ログ出力
本システムのログ出力の方針、ログレベル、ログフォーマット等について方針を記載します。

以下、TISのサンプルです。
（API処理におけるログ出力の方針や定義）

![ログ出力1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/04318109-f9a5-f279-9aec-7ffdb7adf41d.png)

![ログ出力2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/324e860a-278a-9201-0ee8-ab373554109b.png)



### 5.19. HTTPクライアント（RESTクライアント）
システム内部の連携や外部システムとの連携で HTTP を使用した連携を行う場合は、その実現方式やメッセージ形式、エラーハンドリング等の設計方針を明確にします。

![HTTPクライアント1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/e8edce6d-79df-f12a-fd83-c6c32464813b.png)

![HTTPクライアント2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/4cdbf4a9-0794-64b7-5928-5fd36b9fd2be.png)


### 5.20. メール送信要求登録
TISのサンプルのシステムでは、オンライン処理と同時にメール送信を行うのではなく、一旦、メール送信要求をデータベースに格納しておき、メール送信は常駐バッチを使い非同期でメール送信を行う方式としており、その方式について記載をしています。

![メール送信要求登録](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/ca5a1a07-b2d2-d7dc-283f-c49307adace9.png)

### 5.21. 開閉局
本システムで対応する開閉局制御の対応方針について記載します。

![開閉局](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/ee02c040-91d3-9304-9a88-8df745dc031f.png)


### 5.22. ヘルスチェック
システムが正常に稼働しているかをどのようにチェックするかの方針を記載します。

TISのサンプルでは、画面と同様の方針となっています。

![ヘルスチェック](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/7e70ed1e-ec84-37cb-66dc-6e8c945aa643.png)


### 5.23. コンテナイメージ作成
アプリケーションのコンテナイメージ作成方針について記載します。

TISのサンプルでは、画面と同様の方針となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/1ced2118-6433-3209-5930-5078617adda1.png)

<br><br>

## 6. 共通事項
オンライン処理やバッチ処理など、いずれの処理方式でも共通している内容を記載します。

### 6.1. メッセージ管理
本システムで出力するメッセージの管理方式を記載します。

![メッセージ管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/78ab1c31-4298-4618-abc3-2a196924f7b5.png)


### 6.2. コード管理
本システムで使用するコードの管理方式を記載します。

TISのサンプルでは、Nablarchフレームワークの機能にて管理する方針としているようです。

![コード管理](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/8be46647-d065-9a69-97ad-c5de1bca08ea.png)



### 6.3. 日付・時刻処理方式
システムと業務上の日付が違うことがあり、それぞれの定義や日付の取得方法を記載します。

![概念](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/35caef5f-4d78-39a9-e5cd-914204293fd5.png)

![業務日付について](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/c7ec7999-b694-b2ff-17b4-a1af176e549a.png)

![実現方法](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/e6c32cbd-4ec1-516a-6d16-180c73b8f71d.png)



### 6.4. 文字コード
文字コードについては、システム内で扱う文字コードを決めるだけでなく、他システムと連携するメッセージやファイルの文字コード変換をどちらで行うかの方針を決めておく必要があります。

#### (1) 概要・文字コード
![概要・文字コード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/93c619fd-9595-8099-2361-acff637bcf1f.png)

#### (2) 入力時の文字の取り扱い
![入力時の文字の取り扱い](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/7676c7d1-9d83-69af-cf2b-76a0bec52872.png)

#### (3) 出力時の文字の取り扱い
![出力時の文字の取り扱い](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739239/54c6f8e0-c725-4655-b195-11101732c92d.png)


<br><br>


## 資料へのリンク
今回紹介した資料のリンクを以下に記載します。

[アプリケーション方式設計書サンプル](https://github.com/Fintan-contents/spring-archdoc-sample)

## おわりに
今回は、システム方式設計の書き方について、TIS社の公開資料を引用しながら解説をしてきました。
画面、バッチ、APIとかなりのボリュームになってしまいましたが、実務で使える資料だと思うので、ぜひ活用してみてください。


## 関連記事
[TISの「システム方式設計サンプル」が参考になるので紹介しておく](https://qiita.com/otomaru97/items/bb7cfe110781e36b2bf8)

[TISの資料が「WBSのタスク」洗い出しに役立ちそうなので紹介しておく](https://qiita.com/otomaru97/items/74e7eb11a70e4a31a206)

[TISのレビュー記録表テンプレ＆サンプルが役立ちそうなので紹介しておく](https://qiita.com/otomaru97/items/a5beb2a11f04e40ecb42)

[TISの画面設計書テンプレ＆サンプルが役立ちそうなので紹介しておく](https://qiita.com/otomaru97/items/0dd2b788c18d8c764d9c)

[TISの単体テスト仕様書テンプレ＆サンプルが役立ちそうなので共有しておく](https://qiita.com/otomaru97/items/d1676bddfa32edb95e40)

[TISのテスト種別＆テスト観点カタログが有用すぎるので紹介しておく](https://qiita.com/otomaru97/items/b991bb99b5c07105e2ea)