Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

メッセージ管理機能方針の策定 #1526

Merged
merged 58 commits into from
Dec 27, 2024
Merged
Show file tree
Hide file tree
Changes from 49 commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
50d471e
メッセージプロパティを各サブプロジェクトで管理するよう変更する
rnakagawa16 Oct 4, 2024
6213333
使用していないimportの削除
rnakagawa16 Oct 7, 2024
54aec8d
メッセージコードをフロントエンドに合わせて頭文字を小文字にする
rnakagawa16 Oct 8, 2024
ab66a22
Merge branch 'main' into feature/メッセージ管理機能を調査する
rnakagawa16 Oct 22, 2024
9439ff4
Merge branch 'main' into feature/メッセージ管理機能を調査する
rnakagawa16 Oct 28, 2024
acff9bc
Merge branch 'main' into feature/メッセージ管理機能を調査する
rnakagawa16 Oct 30, 2024
6c18817
フロントエンド側のメッセージ管理機能実装
rnakagawa16 Nov 1, 2024
a6e0532
バックエンド側のエラーメッセージ出力を実装
rnakagawa16 Nov 7, 2024
67dd8a3
Merge branch 'main' into feature/メッセージ管理機能を調査する
rnakagawa16 Nov 7, 2024
bcd5f2a
フロントエンド側のメッセージ管理機能の実装
rnakagawa16 Nov 14, 2024
f2e4b5c
起動方法の修正
rnakagawa16 Nov 14, 2024
3d04850
テスト時の警告解除
rnakagawa16 Nov 14, 2024
6a1be16
Merge branch 'main' into feature/メッセージ管理機能の実装
rnakagawa16 Nov 14, 2024
7b01f87
type-checkの警告対応
rnakagawa16 Nov 15, 2024
7938a9c
typecheckの警告回避と日英対応のメッセージ作成
rnakagawa16 Nov 18, 2024
9455d58
Merge branch 'main' into feature/メッセージ管理機能の実装
rnakagawa16 Nov 18, 2024
cd8067d
エラーハンドリング機能の修正
rnakagawa16 Nov 20, 2024
abe1619
if文の修正
rnakagawa16 Nov 21, 2024
b8e0a1b
ドキュメントの追加
rnakagawa16 Nov 25, 2024
a38a72b
Merge branch 'main' into feature/メッセージ管理機能の実装
rnakagawa16 Nov 26, 2024
828bc5d
ドキュメントの追加
rnakagawa16 Nov 28, 2024
1c8ea82
エラーメッセージに関する記載の修正
rnakagawa16 Nov 28, 2024
6d2a717
入力値検証のドキュメント修正
rnakagawa16 Nov 28, 2024
4607051
ブラウザーの言語設定の取得方法修正
rnakagawa16 Nov 29, 2024
8ccc093
ドキュメント指摘事項の修正
rnakagawa16 Nov 29, 2024
952a95c
クリップボード機能の修正
rnakagawa16 Nov 29, 2024
508e565
textlintエラーへの対応
rnakagawa16 Nov 29, 2024
e9eb082
入力値検証に関するドキュメントの修正
rnakagawa16 Nov 29, 2024
b961ee8
ドキュメント指摘事項の修正
rnakagawa16 Dec 2, 2024
daaed4a
ドキュメントのimport文の削除
rnakagawa16 Dec 2, 2024
d389691
起動方法の修正
rnakagawa16 Dec 2, 2024
03b8c60
ドキュメントのアプリ起動方法を記載
rnakagawa16 Dec 2, 2024
64513b3
冗長な文章を修正
rnakagawa16 Dec 2, 2024
3cf9605
ハイライトを修正
rnakagawa16 Dec 2, 2024
f119ff4
指摘事項と軽微なドキュメントの修正
rnakagawa16 Dec 2, 2024
b9ee648
変数名の修正
rnakagawa16 Dec 2, 2024
5370083
Merge branch 'main' into feature/メッセージ管理機能の実装
rnakagawa16 Dec 12, 2024
314d1f8
指摘事項の対応
rnakagawa16 Dec 13, 2024
e8be440
リンクの修正
rnakagawa16 Dec 13, 2024
97bb624
アセットサポートのエラーメッセージをプロパティファイルに設定する
rnakagawa16 Dec 13, 2024
7f868b6
OpenAPI 仕様書について ProblemDetailsを考慮した形に修正
rnakagawa16 Dec 17, 2024
01c10de
ProblemDetailの出力方法を修正
rnakagawa16 Dec 17, 2024
110b7de
プロパティに関するコメントを追加
rnakagawa16 Dec 17, 2024
e3fafbd
指摘事項の修正
rnakagawa16 Dec 19, 2024
2421187
メッセージ管理機能をADB2Cプロジェクトに導入
rnakagawa16 Dec 19, 2024
aa62157
Content-Typeをapplication/problem+jsonに修正
rnakagawa16 Dec 19, 2024
77cfb3d
ADB2CプロジェクトにProblemDetailsの対応を反映
rnakagawa16 Dec 19, 2024
6efb080
カスタムエラーハンドラーの修正
rnakagawa16 Dec 20, 2024
612c71a
responseにexceptionIdが含まれるかどうかで処理を分岐するよう修正
rnakagawa16 Dec 23, 2024
bffb4c6
定数クラスの修正
rnakagawa16 Dec 24, 2024
0589a27
DIによるメッセージ取得に変更
rnakagawa16 Dec 24, 2024
f3c8dd9
ドキュメントの修正とADB2Cサンプルに対する修正
rnakagawa16 Dec 24, 2024
b27aa5f
クラス名の修正
rnakagawa16 Dec 24, 2024
580faa5
textlint 対応
rnakagawa16 Dec 24, 2024
0d969df
Merge branch 'main' into feature/メッセージ管理機能を調査する
rnakagawa16 Dec 26, 2024
def04ff
競合による修正
rnakagawa16 Dec 26, 2024
879d292
競合箇所の修正
rnakagawa16 Dec 26, 2024
5a93412
重複するコメントの削除
rnakagawa16 Dec 27, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Issue や Discussions に対して追加の説明や質問がある場合は、

これらでは解決できない場合、 Discussions の [Q&A](https://github.com/AlesInfiny/maia/discussions/categories/05-q-a) より質問をお寄せください。
質問を投稿する場合、直面していることについてできる限り多くの情報を提供してください。
可能な限りスピーディーに対応いたします
可能な限り迅速に対応いたします
ただし、質問に対する回答が常に得られることを期待しないでください。

## 本プロジェクトに対するコントリビュート
Expand Down
2 changes: 1 addition & 1 deletion .textlintrc
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,7 @@
"状態",
"ジョッキー",
"ジレンマ",
"迅速",
"スキャナー",
"スキーマ",
"スクエア",
Expand All @@ -377,7 +378,6 @@
"ストーブ",
"ストーリー",
"スパイウェア",
"スピーディー",
"スピード",
"スペイン",
"スポーツ",
Expand Down

Large diffs are not rendered by default.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -155,13 +155,17 @@ Vue.js プロジェクトのフォルダー構成は、ブランクプロジェ
├─ cypress/ ------------------ cypress による E2E テストに関するファイルを格納します。
├─ public/ ------------------- メディアファイルや favicon など静的な資産を格納します。
├─ src/
│ ├─ api-client/ ------------ API クライアントの設定ファイルを格納します。
│ ├─ assets/ ---------------- コードや動的ファイルが必要とするCSSや画像などのアセットを格納します。
│ ├─ components/ ------------ 単体で自己完結している再利用性の高い vue コンポーネントなどを格納します。
│ ├─ config/ ---------------- 設定ファイルを格納します。
│ ├─ generated/ ------------- 自動生成されたファイルを格納します。
│ ├─ locales/ --------------- メッセージ管理に関するファイルを格納します。
│ ├─ router/ ---------------- ルーティング定義を格納します。
│ ├─ services/ -------------- サービスに関するファイルを格納します。
│ ├─ shared/ ---------------- アプリケーション全体で再利用する共通機能のファイルを格納します。
│ ├─ stores/ ---------------- store に関するファイルを格納します。
│ ├─ validation/ ------------ 一元化するバリデーション定義ファイルを格納します。
│ ├─ views/ ----------------- ルーティングで指定される vue ファイルを格納します。またページ固有の挙動などもここに含めます。
│ ├─ App.vue
│ └─ main.ts
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: CSR 編
description: クライアントサイドレンダリングを行う Web アプリケーションの アーキテクチャについて解説します。
---

<!-- cspell:ignore applicationcore rgba -->

# 例外処理方針 {#top}

バックエンドアプリケーションで発生するシステム例外や業務例外は、例外フィルターによって捕捉します。
Expand Down Expand Up @@ -103,3 +105,73 @@ HTTP 通信で発生する例外について、レスポンスやステータス
C->>B: エラー通知
deactivate C
```

### API 通信のエラーレスポンス {#error-response}

API 通信で発生した例外において、バックエンドから返却されるエラーレスポンスには、 [ProblemDetails :material-open-in-new:](https://www.rfc-editor.org/rfc/rfc9457.html){ target=_blank } に基づくレスポンスボディーを含みます。

ProblemDetails は、 HTTP API のエラーレスポンスを標準化するための構造体であり、以下のプロパティで定義されています。

| 項目 | プロパティ名 | 推奨レベル | 内容 |
| ---------------------------- | ------------ | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 簡易メッセージ | title | 必須 | 人間が読める形式で提供されます。 |
| 詳細メッセージ | detail | 本番環境は非推奨 | スタックトレースなどを含めます。開発環境では生産性向上を目的に含めることを推奨しますが、本番環境では使用しません。開発環境と本番環境で構成を変更することが難しい場合には detail を使用しないよう統一することも検討してください。 |
| ステータスコード | status | 任意 | HTTP エラーのステータスコードです。 |
| 詳細 URL | type | 推奨 | エラーを説明する詳細 Web ドキュメントがある場合、ユーザーが参照する URL を追加します。 |
| 問題が発生したリソースの URI | instance | 任意 | 問題の発生場所を示す URI です。リクエスト先と異なるリソースが問題の発生したリソースである場合、実装の詳細やデータなどの内部情報が漏洩する可能性があるため、追加には注意が必要です。 |
| 任意のパラメータ | | 任意 | 拡張メンバーです。必要に応じて ProblemDetails のプロパティを拡張する場合に利用します。 |

ProblemDetails のレスポンスに含める各プロパティは以下のような観点をもとに取捨選択します。

- 環境による判断

- 本番環境の場合には、ユーザーが見て管理者に伝えるための情報のみをプロパティに含めるべきです。
- 開発環境の場合には、開発者がデバッグやテストなどの作業で確認すべき情報を含めるべきです。

- API の用途による判断

- 外部公開 API の場合には、セキュリティやプライバシーを考慮し、必要最低限の情報を提供するようにプロパティを設定します。
- 内部 API の場合には、画面に対応したエラーレスポンスとして含めるべきプロパティを設定します。

また、 AlesInfiny Maia OSS Edition では、フロントエンド側で管理しているメッセージを取得するために以下の拡張メンバーを追加で定義しています。

- exceptionId

例外 ID 。メッセージファイルからエラーメッセージを取得するためのメッセージコードとして利用します。

- exceptionValues

例外値。例外 ID から取得したエラーメッセージ内のパラメーターに代入する値として利用します。

クライアントサイドでポップアップやトースト通知などを用いてエラー通知を実装する場合には、 ProblemDetails の各プロパティの内容を表示します。

#### エラーレスポンスの例 {#example-of-error-response}

説明したエラーレスポンスの例を以下に示します。

```json title="開発環境の場合のエラーレスポンス"
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json; charset=utf-8

{
"type": "https://hoge.com/error/catalogItemIdDoesNotExistInBasket",
"title": "業務エラーが発生しました。",
"status": 400,
"detail": "dressca.applicationcore.baskets.CatalogItemInBasketNotFoundException: 業務エラーが発生しました。 ###以下スタックトレースは省略###",
"exceptionId": "catalogItemIdDoesNotExistInBasket",
"exceptionValues": ["1 ###買い物かごID###", "10 ###商品ID###"]
}
```

```json title="本番環境の場合のエラーレスポンス"
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json; charset=utf-8

{
"type": "https://hoge.com/error/catalogItemIdDoesNotExistInBasket",
"title": "業務エラーが発生しました。",
"status": 400,
"exceptionId": "catalogItemIdDoesNotExistInBasket",
"exceptionValues": ["1 ###買い物かごID###", "10 ###商品ID###"]
}
```
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,136 @@ Java アプリケーションのメッセージ管理方針については、以

- [Java アプリケーションの処理方式 - メッセージ管理方針](../../../app-architecture/overview/java-application-processing-system/message-management-policy.md#message-management-policy)

フロントエンドアプリケーションでは、特別なメッセージ管理しません。
画面内に出力するメッセージやラベルは、各画面やソースコード内に個別に実装したものを使用します。
フロントエンドアプリケーションにおけるメッセージとは、画面や帳票等に表示する固定文言、またはユーザーの画面操作の結果に応じて表示する動的文言を指します。

## メッセージパターン {#message-pattern}

フロントエンドアプリケーションにおけるメッセージパターンとメッセージの表示内容を以下に示します。

| パターン | 表示内容 | 表示例 |
| -------------------- | -------------------- | ------------------------------------------------------------ |
| 処理メッセージ | 処理の確認 | 注文内容を確認して「注文を確定する」ボタンを押してください。 |
| | 正常終了 | 注文が完了しました。 |
| | 業務エラー | カートに追加できませんでした。 |
| | | 商品の削除に失敗しました。 |
| | システムエラー | サーバーエラーが発生しました。 |
| | | ネットワークエラーが発生しました。 |
| 入力値検証メッセージ | 単項目チェックエラー | 値を入力してください |
| | 相関チェックエラー | パスワードと確認用パスワードが一致しません |
| ラベル | 画面のタイトル | Dressca |
| | 画面の項目名 | 合計 / 送料 |
| | UI ラベル | 注文を確定する |

## メッセージの管理単位 {#management-unit}

各メッセージの用途を明確にするため、前述したメッセージパターンごとにメッセージを管理します。
AlesInfiny Maia OSS Edition における、メッセージパターンごとのメッセージ管理方針は以下の通りです。

- 処理メッセージ

処理メッセージ管理用のファイルを定義して一括で管理します。

処理メッセージは変更や追加の要求が多く、一か所で管理することによりメンテナンスが容易になります。

- 入力値検証メッセージ

入力値検証メッセージ管理用のファイルを定義して一括で管理します。

入力値検証メッセージは複数の場所で使用する可能性が高く、ファイルに定義しておくことで再利用が簡単になります。
これにより、コードの重複を避けることにつながります。

- ラベル

画面内に出力するラベルは各画面やソースコード内に個別に実装したものを使用します。

ラベルに対してもアプリケーション全体で用語を統一する場合や後述する多言語を実施する場合には、ファイルによるメッセージの一元管理が必要です。
しかし、用語の統一は初期の実装やメッセージ管理ファイルの維持にかかるコストが高いです。
また、ラベルへの多言語対応は言語設定によって画面のレイアウトが崩れてしまう恐れがあります。
そのため、ラベルに対してファイルによるメッセージ管理を導入することは、慎重な検討が必要です。

## メッセージのファイル管理 {#message-file-management}

フロントエンドアプリケーションでは、処理メッセージや入力値検証メッセージは JSON ファイルを利用して管理します。
JSON ファイルでは、以下のようにメッセージ文字列を識別するメッセージコードとメッセージ文字列本体を key-value で管理します。

``` json title="メッセージの JSON ファイルの定義例"
{
"errorOccurred": "エラーが発生しました。",
...
}
```

### メッセージコードの定義 {#message-codes-definition}

前述した JSON ファイルのように、メッセージコードはそのメッセージの内容を簡潔に表す文字列とします。
このようにすることで、以下のような利点があります。

- 可読性の向上

数字のメッセージコードよりも、意味を持つメッセージコードを定義することで直感的で理解しやすい利点があります。
開発者がメッセージコードを見たときに、すぐにそのメッセージの内容や目的を把握できます。

- エラー追跡の効率化

ログやデバッグ時に、意味を持つコードは問題を迅速に特定することに役立ちます。

- ドキュメント化の簡便さ

メッセージコードがそのメッセージ内容を簡潔に表していれば、メッセージコードの意味を説明するための追加のドキュメントが不要になることがあります。

### エラーメッセージコードの統一 {#unification-of-message-codes}

エラー発生時のメッセージ整形の流れを以下に示します。

![エラーメッセージ整形の流れ](../../../images/app-architecture/client-side-rendering/error-message-delivery-light.png#only-light){ loading=lazy }
tsuna-can-se marked this conversation as resolved.
Show resolved Hide resolved
![エラーメッセージ整形の流れ](../../../images/app-architecture/client-side-rendering/error-message-delivery-dark.png#only-dark){ loading=lazy }
tsuna-can-se marked this conversation as resolved.
Show resolved Hide resolved

この画像の通り、エラー発生時はバックエンドアプリケーションのエラーログの出力とフロントエンドアプリケーションへのエラーの画面出力が順次実施されます。

そのため、同一の業務エラーやシステムエラーのメッセージコードは、バックエンド側とフロントエンド側で統一します。
これにより、以下のような利点があります。

- 一貫性の確保

統一されたメッセージコードを使用することで、エラーの識別が容易になり、システム全体の一貫性が保たれます。

- デバッグの効率化

開発者がエラーを特定しやすくなり、問題解決のスピードが向上します。
バックエンドとフロントエンドで同じコードを使用することで、エラーの原因を迅速に特定できます。

OpenAPI 仕様書などの各 JSON ファイルと命名規則を統一するため、メッセージコードをキャメルケースとします。
それに伴い、フロントエンド側に合わせてバックエンドのプロパティファイルのメッセージコードもキャメルケースで記載します。
バックエンドのプロパティファイルの設定例は、[こちら](../../overview/java-application-processing-system/message-management-policy.md#property-file-management) を確認してください。

### エラーメッセージ内のパラメータ {#parameter-of-error-messages}

以下のように、エラーメッセージの中にはパラメータを含むものがあります。

```json title="パラメータを含むエラーメッセージの例"
{
"assetNotFound": "アセットコード: [0] のアセットが見つかりませんでした。",
}
```

パラメータに代入するべき値は、エラーレスポンスに含まれる ProblemDetails の拡張メンバーである `exceptionValues` から取得します。
ProblemDetails については、[こちら](./exception-handling.md#error-response) を確認してください。

### 多言語対応 {#localization}

メッセージを多言語対応する場合には、それぞれの言語の JSON ファイルを作成し、各言語のメッセージをフォルダーで分割して管理します。
以下に示すように、フォルダー名は [ISO-639 言語コード :material-open-in-new:](https://www.iso.org/iso-639-language-code){ target=_blank } に基づき、その言語を表す言語コードとします。

また、各ファイルの末尾には言語コードを付与します。

```terminal linenums="0"
locales/ ------------------------------------- メッセージ管理を行うコードが配置されるフォルダー
├ en/ ---------------------------------------- 英語メッセージの管理を行うフォルダー
│ ├ messageList_en.json ---------------------- 処理の成功や失敗などの結果メッセージを格納する JSON ファイル(英語)
│ └ validationTextList_en.json --------------- 入力値検証用のメッセージを格納する JSON ファイル(英語)
└ ja/ ---------------------------------------- 日本語メッセージの管理を行うフォルダー
├ messageList_ja.json ---------------------- 処理の成功や失敗などの結果メッセージを格納する JSON ファイル(日本語)
└ validationTextList_ja.json --------------- 入力値検証用のメッセージを格納する JSON ファイル(日本語)
```

メッセージ管理方針に従った機能の実装方法などの詳細については、[こちら](../../../guidebooks/how-to-develop/vue-js/message-management.md) を確認してください。
Loading
Loading