令和7年春期試験午後問題 問8

問8 情報システム開発

⇱問題PDF
エラーハンドリングに関する次の記述を読んで,設問に答えよ。
 Q社は,業務システムの受託開発会社である。Q社は,スーパーマーケットの複数の店舗を運営するB社から,CRM(Customer Relationship Management)システムの開発と運用保守業務を受託した。CRMシステムは各店舗で利用され,顧客からの意見やクレーム,店舗での対応の内容が登録・蓄積される。CRMシステムを運用する際の関係者の一覧を表1に示す。
pm08_1.png
 Q社は,システムのリリース後に想定される,店舗からの問合せに対する迅速な対応を可能にするために,想定される問合せのパターンと対応方法を事前に整理し,対応の際に必要な要件をシステムの設計に反映させることにした。

〔CRMシステムの構造〕
 CRMシステムのクラス図(一部)を図1に示す。Abstractcontroller,AbstractService及びAbstractDaoは,それぞれ画面遷移,ビジネスロジック及びデータベースアクセスの共通処理が実装された抽象クラスである。これらのクラスをaしたクラスを作成して,具体的な機能を実装する。ログを出力するにはLoggerクラスを利用する。ログの出力時には"DEBUG","ERROR"などの,ログの種別(以下,ログ種別という)が記録される。図1に示すクラスを使った処理の流れの例として,システムにログインする際のシーケンス図を,図2に示す。
pm08_2.png
pm08_3.png
 利用者がログイン画面で認証に必要な情報を入力しログインを実行すると,LoginControlterのログイン実行メソッドが呼び出される。ログイン実行メソッドは,画面から入力された情報をAuthServiceに引き渡す。AuthServiceは,UserDaoに実装されている,利用者情報の検索を行う機能を用いて,認証の判定に必要な利用者情報をデータベースから取得する。AuthServiceは,取得した利用者情報を用いて口グイン認証の判定を行い,結果を返す。
 プログラムの実行中にエラーが発生した際の,例外処理用のクラスとしてExceptionクラスがある。Exceptionクラスは,エラーの詳細情報として,エラーの発生箇所のソースファイル名,行番号,メソッドの呼出し履歴及び直接的な原因を示すメッセージ文字列をもつ。エラー発生時には,エラーの発生箇所でExceptionクラスのオブジェクトを作成し,呼出し元ではそれを使って例外処理を行う。

〔CRMシステムのエラーの種別の整理とその対応〕
 Q社は,運用中に起き得るエラーの種別(以下,エラー種別という)を整理し,対応方法について検討した。エラー種別と運用担当者の対応を表2に,対応を行うために必要な出力機能及び出力内容と,出力内容を参照する関係者を表3に示す。
pm08_4.png
 表2,表3についてレビューを行ったところ,次の3点が指摘された。
  • 表2のシステム障害及びシステムエラーは,利用者の問合せの前にシステムが自動的に検出して運用担当者が対応を開始できるようにすべきである。
  • 表3の出力内容には,セキュリティの観点における潜在的なリスクがある。
  • 表3について,エラーに関するログだけでは,開発担当者が原因を調査するための情報としては不足するので,追加の情報を出力する必要がある。
 指摘事項の(1)に対応するために,①監視の機能を用意することにした。監視の機能は,監視対象の情報を定期的に取得し,エラー発生時の特徴を検出した場合に電子メールで運用担当者に通知する。指摘事項の(2)については,表3の②出力内容を一部変更することにした。指摘事項の(3)については,アスペクト指向プログラミングを導入して,プログラムの処理の中で,要所ごとにログを出力することにした。

〔アスペクト指向プログラミングの導入〕
 レビューの指摘事項の(3)に関連して,利用者が行った操作内容を一律でログに出力することにし,これを実現するためにアスペクト指向プログラミングを導入することにした。
 アスペクト指向プログラミングでは,特定のルールを定義しておくことによって,そのルールに合致する全ての箇所で同じ処理を実行させる。ルールの定義の条件にはクラス名,メソッド名に含まれる文字列のパターンが利用できる。また,特定の条件に合致する場合には実行の対象から除外するように指定することもできる。
 ここでは,実装上の制約ができるだけ少なくなるようなルールの定義方法で,画面遷移に関するクラスに実装された全てのメソッドについて,クラス名,メソッド名及び全ての引数の内容をログに出力することにした。これを実現するために,eを親クラスにもつクラスのfには必ず特定の文字列のパターンを含み,それ以外のクラスのfには特定の文字列のパターンを含まないように命名規則を定義した。ただし,秘匿情報や個人情報の保護の観点から,認証に関する情報や,③顧客情報を扱う箇所はログに出力しないようにした。
 Q社は,表2,表3に関する検討結果をシステムの設計に反映させ,開発を開始した。

設問1

本文,図1及び図2中のacに入れる適切な字句を答えよ。

解答例・解答の要点

a:継承
b:ID
c:ログイン認証の判定結果

解説

aについて〕
本文では、AbstractController などの抽象クラスに共通処理を実装し、それらを基に具体的な機能をもつクラスを作成すると説明されています。抽象クラスを基底として子クラスを派生させる手法は、オブジェクト指向における「継承」に該当します。継承は、既存の親クラス(基底クラス)がもつ属性やメソッドを子クラス(派生クラス)が引き継ぎ、そのうえで独自の機能を追加・拡張できるようにするオブジェクト指向の仕組みです。したがって、空欄aには「継承」が入ります。

継承は別名「インヘリタンス」とも言いますが、「インヘリタンスした」という動詞の形では普通使われません。このため、本文中の文脈に妥当するのは「継承」の一語に絞られます。

a=継承

bについて〕
図2のシーケンス図では AuthService が UserDao に対して"検索(b)"のメッセージを送っています。本文中に「AuthServiceは,UserDaoに実装されている,利用者情報の検索を行う機能を用いて,認証の判定に必要な利用者情報をデータベースから取得する」とあることから、このメッセージは UserDao(Dao:Data Access Object)から利用者情報を取得するためのものとわかります。

入力元である LoginController から AuthService へはIDとPasswordが渡されていますが、ログイン認証の判定(パスワードの一致確認)は AuthService が担当します。このため、 Passwordの送信は不要で、 UserDao には利用者を一意に特定するためのIDだけを渡せば足ります。したがって、空欄bには「ID」が入ります。

b=ID

cについて〕
図2では、AuthService がIDとPasswordを受け取り、UserDao から取得した利用者情報を用いてログイン認証の処理を行う様子が示されています。本文中に「AuthServiceは,取得した利用者情報を用いて口グイン認証の判定を行い,結果を返す」とあるため、AuthService から LoginController へ返されるのは、ログイン認証が成功したか失敗したかという判定結果です。したがって、空欄cには「ログイン認証の判定結果」が入ります。

c=ログイン認証の判定結果

設問2

表3中のdについて,どの関係者に向けた表現として出力をすべきか。表1の関係者から全て選び答えよ。

解答例・解答の要点

d:運用担当者,開発担当者

解説

dについて〕
表3より、ログ出力には「エラーの概要,詳細情報及びメソッドの呼出し履歴」が含まれるとわかります。これらの情報は、主に障害発生時の原因分析やトラブルシューティングに使用されます。

本文中にはログに関係する記述として、以下の2点があります。
  • 運用担当者:エラー発生時の前後のログをログファイルから切り出して開発担当者に送付する
  • 開発担当者:運用担当者からログを受け取って原因や回避策の調査を行う
開発担当者は調査のため、運用担当者は調査資料の送付のためログを参照する必要があります。これに対して、利用者にはログの参照権限を与えるべきではありません。ログにはソースファイル名や呼出し履歴など機密性の高い内部情報が含まれること、利用者が詳細ログを閲覧しても内容を理解できず実務上のメリットもないためです。したがって、空欄dには「運用担当者と開発担当者」が入ります。

d=運用担当者,開発担当者

設問3

本文中の下線①について,業務運用中のCRMシステムの何を対象に監視するか。システム障害とシステムエラーのそれぞれについて,最も適切なものを解答群の中から選び,記号で答えよ。
解答群
  • 画面に表示されたエラーメッセージ
  • データベースの接続確認の結果
  • 電子メール送信履歴
  • ログ種別の文字列
  • ログファイルのサイズ

解答例・解答の要点

障害:
エラー:

解説

〔システム障害について〕
システム障害について、表2では「Webサーバやデータベースサーバの停止,プログラムの異常終了,ネットワーク障害などの原因によって,システム全体の稼働が継続不能になる」状態と定義しています。つまり、稼働不能になる主な要因は、アプリケーション、DB、ネットワークのいずれかがダウンすることです。

これらの構成要素を一度に監視する方法として、アプリケーションからDBに対する定期的な疎通確認(死活監視)の実施が有効です。DBに到達できなければネットワーク切断やDBサーバ停止が、SQL 実行に失敗すればアプリケーションの障害が想定され、いずれもシステム障害の原因となります。定期的に疎通確認を行い、異常を検知したときに担当者に通知する仕組みにより、システム障害の自動検出が可能となります。

したがって、監視対象とする情報は「イ:データベースの接続確認の結果」が適切です。

〔システムエラーについて〕
システムエラーについて、表2では「主にプログラムの欠陥によって発生する,想定外のエラー。操作の途中でエラーメッセージが表示され,業務を続行できない」状態と定義しています。

表3「ログ出力」では、プログラムの実行中に想定外のエラーが発生した場合、ログ出力が行われることが明記されています。〔CRMシステムの構造〕には「ログの出力時には"DEBUG","ERROR"などの,ログの種別(以下,ログ種別という)が記録される」とあるため、これをシステムエラーの検知に使用することが可能です。ログを定期的に監視し、ログ種別"ERROR"を検知したときに担当者に通知する仕組みにより、システムエラーの自動検出が可能となります。

したがって、監視対象とする情報は「エ:ログ種別の文字列」が適切です。

∴障害=イ:データベースの接続確認の結果
 エラー=エ:ログ種別の文字列

以下はその他の選択肢が不適切な理由です。
ア:画面に表示されたエラーメッセージ
利用者の端末にだけ表示されるため、ログなどに記録しておかないとシステム的な監視はできません。また、エラーメッセージはシステムエラーだけではなく、業務エラーと入力エラーでも表示されるため、対象数が多すぎて管理面から不向きです。
ウ:電子メール送信履歴
監視機能が異常を検知した"結果"として運用担当者へ通知する経路にすぎず、CRMシステム内で起こる事象ではないため不適切です。
オ:ログファイルのサイズ
"DEBUG"などの情報ログが大量に出てもログのサイズは増加します。ファイルサイズはエラーの発生とは直接関連しないため不適切です。

設問4

本文中の下線②について,変更した出力機能を答えよ。また,その変更の内容を20字以内で答えよ。

解答例・解答の要点

出力機能:エラーメッセージ表示
内容:エラーの詳細情報を出力しない (14文字)

解説

指摘事項(2)では「表3の出力内容には,セキュリティの観点における潜在的なリスクがある」ことが問題とされています。表3の出力機能には「ログ出力」と「エラーメッセージ表示」の2つがありますが、ここで問題とされているのは、利用者の画面に表示されるエラーメッセージの内容です。

エラーメッセージには「Exceptionクラスがもつエラーの詳細情報」が含まれます。詳細情報とは、具体的には「エラーの発生箇所のソースファイル名,行番号,メソッドの呼出し履歴及び直接的な原因を示すメッセージ文字列」であると記述されています。これらの技術的詳細は、システムの内部構造や処理の流れを外部から推測する手がかりとなり、サイバー攻撃のリスクを高めるおそれがあります(利用者の中にハッカーがいないとは限りません)。これらの内部情報はそもそも利用者には不要ですから、機密性確保の観点から、一般利用者に対しては表示しないことが一般的です。したがって、変更内容とは「エラーの詳細情報を出力しない」ようにすることです。

∴出力機能=エラーメッセージ表示
 内容=エラーの詳細情報を出力しない

設問5

〔アスペクト指向プログラミングの導入〕について答えよ。
  • 本文中のefに入れる適切な字句を答えよ。
  • 本文中の下線③について,出力しないようにした理由を,20字以内で答えよ。

解答例・解答の要点

  • e:AbstractController
    f:クラス名
  • ログは開発担当者も参照するから (15文字)

解説

アスペクト指向プログラミングは、プログラム全体に共通する処理(ログ出力やエラーハンドリングなど)を一箇所にまとめて記述し、必要な箇所に自動的に適用できるようにする開発手法です。従来のオブジェクト指向では分離が難しかったクラスを横断した共通処理の記述が可能であり、保守性や再利用性の向上に役立ちます。
  • eについて〕
    ログを出力すべき対象は「画面遷移に関するクラスに実装された全てのメソッド」なので、画面遷移クラスの親クラス名が当てはまります。〔CRMシステムの構造〕には、画面遷移を実装するのは Abstractcontroller クラスという説明があり、すべての画面遷移クラスはこれを継承して作成されるため AbstractController を親クラスとして持ちます。したがって、空欄eには「AbstractController」が入ります。

    e=AbstractController

    fについて〕
    本文では「ルールの定義の条件にはクラス名,メソッド名に含まれる文字列のパターンが利用できる」とあるため、クラス名・メソッド名のいずれかが当てはまります。判断のポイントは「実装上の制約ができるだけ少なくなるようなルールの定義方法」という要件です。

    クラス名で定義した場合「○○Controller」という命名規則で、他のクラスに影響を及ぼすことなく容易にすべての画面遷移クラスを対象とできます。一方でメソッド名による定義の場合、①画面遷移クラスのメソッドは必ずその文字列パターンを含める、②その文字列パターンが他のクラスで使用できない、という命名制限が生じます。このため、適切な実装方法は「クラス名」によるルール定義と判断できます。

    f=クラス名

  • 出力されたログは運用担当者と開発担当者が参照します。運用担当者はCRMシステムにアクセスでき、対応に必要な限りで顧客情報を見ることが許容されています。一方で、開発担当者にはCRMシステムの入力情報(顧客の氏名・連絡先等)への参照が許されていません。「顧客情報は,B社の従業員が顧客に連絡するためだけに使用する」とされていること、開発担当者に引き渡す情報は必要最小限とされていることを踏まえると、調査のために不要な顧客情報はログに出力しないように制御する必要があります。これがログに顧客情報を出力しないようにした理由です。したがって「ログは開発担当者も参照するから」「開発担当者に参照されることを防ぐため」などの解答が適切となります。

    ∴ログは開発担当者も参照するから
模範解答

Pagetop