付録 A
iBank アプリケーションの仕様
サンプルアプリケーションとして使用するのは「iBank」です。「iBank」は次の機能を持ち、基本的なオンラインバンキングサービスをシミュレートします。
- オンラインバンキングサービスへのログオン
- 詳細な個人情報および支店情報の表示と編集
- 口座およびその決済後残高の一覧表示
- 口座ごとの取引明細の表示
- 口座間で資金のオンライン振替を可能にする振替サービス
- 指定された元金と年利に基づいた複数年の複利予測
アプリケーションは MVC (Model-View-Controller) モデルに基づいて設計されています。
- EJB はアプリケーションのビジネスおよびデータモデルコンポーネント定義に使用
- Java Server Pages はプレゼンテーションロジックを処理し、ビューを表す
- サーブレットはコントローラとして動作し、アプリケーションロジックの処理、ビジネスロジックコンポーネントの呼び出し、EJB 経由のビジネスデータへのアクセス (モデル)、Java Server Pages 表示のための処理データのディスパッチ (ビュー) を行う
アプリケーションコンポーネントのパッケージングと配備には、標準 J2EE メソッド、配備記述子のインクルード定義、およびアーカイブファイル内のアプリケーションコンポーネントのパッケージングが使用されます。
- HTML ページ、画像、サーブレット、JSP、カスタムタグライブラリ、および必要に応じてサーバーサイド Java クラスを含み、Web アプリケーションで使用する WAR アーカイブファイル
- 配備記述子、Bean クラスおよびインタフェース、スタブおよびスケルトンクラス、および必要に応じてその他のヘルパークラスを含み、EJB パッケージングで使用する EJB-JAR アーカイブファイル
- Web アプリケーションモジュールおよびアプリケーションで使用される EJB モジュールを含み、エンタープライズアプリケーションモジュールのパッケージングで使用する EAR アーカイブファイル
標準の J2EE パッケージングメソッドを使用すると、Sun ONE Application Server 6.0/6.5 と Sun ONE Application Server 7 の差異、そしてそれが原因で発生する問題が指摘されるという利点があります。
アプリケーション開発用ツール
Sun ONE Studio Enterprise Edition for Java、リリース 4.0
-
Sun ONE Application Server 7 は EJB 1.0 および EJB 1.1 標準をサポートしています。したがって iBank アプリケーションの他の EJB (2 セッション EJB および BMP エンティティ Bean) は Sun ONE Studio for Java で開発され、提供されている Application Assembly Tool を使用して Sun ONE Application Server 7 にパッケージされ、配備されます。このような方法で開発するため、1.1 EJB 開発用のサードパーティ IDE を Sun ONE Application Server 7 でテストできます。また、Sun ONE Application Server 6.5 用に開発された 1.1 EJB も Sun ONE Application Server 7 に移行し、テストできます。
-
Java 開発環境用の Sun ONE Studio は、iBank アプリケーションの EJB コンポーネントを Sun ONE Application Server に移行する場合にも使用されます。EJB 1.0 標準コードの EJB 1.1 標準向けの調整、CMP エンティティ Beans 用の O/R マッピング、アプリケーションの複数のモジュールの配備プロパティおよびパッケージングの設定などを行います。
Oracle 8i 8.1.6
-
データベースは Oracle 8i バージョン 8.1.6 で開発されており、アクセスに使用される JDBC ドライバは thin Oracle ドライバ (type 4) です。
データベーススキーマ
- iBank データベーススキーマは次のビジネスルールに基づいて決定されます。
- iBank は国内の大都市に支店を持つ
- 支店は各地域のすべての顧客を管理する
- 顧客は自分の居住地域の支店に 1 つ以上の口座を持つ
- 顧客の口座は支店番号と口座番号で一意に識別され、これとは別に顧客はそれぞれ顧客番号を持つ。引落可能な現在の決済残高が口座に記録される
- 口座の種類は当座預金や普通預金などの口座タイプで区別される
- 各口座タイプには、支店や顧客に関わらず、このタイプのすべての口座に適用される金利や当座借越限度額などの細則が保存される
- 顧客の口座に入金があった場合、または口座からの引き落としがあった場合、その取引は取引履歴と呼ばれるすべての取引のログに記録される
- 取引履歴には支店コード、口座番号、記帳 (記録) 日付、取引タイプ識別コード、特定の取引に対する補足説明、および取引金額など、各取引についての詳細な情報が保存される
- 現金預金、クレジットカード支払、口座間の送金など、様々な取引が取引タイプで識別される
これらのビジネスルールを図解したものが次のエンティティ関連図です。
図 1    データベーススキーマ
次に示すのはデータベースモデルから作成された表定義です。主キー列は太字、外部キー列は斜体で示されます。
|
BRANCH
|
|
BRANCH_CODE
|
CHAR(4)
|
NOT NULL
|
支店を識別する 4 桁のコード
|
|
BRANCH_NAME
|
VARCHAR(40)
|
NOT NULL
|
支店名
|
|
BRANCH_ADDRESS1
|
VARCHAR(60)
|
NOT NULL
|
支店の住所、1 行目
|
|
BRANCH_ADDRESS2
|
VARCHAR(60)
|
|
支店の住所、2 行目
|
|
BRANCH_CITY
|
VARCHAR(30)
|
NOT NULL
|
支店の所在都市
|
|
BRANCH_ZIP
|
VARCHAR(10)
|
NOT NULL
|
支店の郵便番号
|
|
BRANCH_STATE
|
CHAR(2)
|
NOT NULL
|
支店の住所、都市名略称
|
|
CUSTOMER
|
|
CUST_NO
|
INT
|
NOT NULL
|
iBank 顧客番号 (グローバル)
|
|
BRANCH_CODE
|
CHAR(4)
|
NOT NULL
|
この顧客が口座を持つ支店
|
|
CUST_USERNAME
|
VARCHAR(16)
|
NOT NULL
|
顧客のログインユーザー名
|
|
CUST_PASSWORD
|
VARCHAR(10)
|
NOT NULL
|
顧客のログインパスワード
|
|
CUST_EMAIL
|
VARCHAR(40)
|
|
顧客の電子メールアドレス
|
|
CUST_TITLE
|
VARCHAR(3)
|
NOT NULL
|
顧客の称号
|
|
CUST_GIVENNAMES
|
VARCHAR(40)
|
NOT NULL
|
顧客の名
|
|
CUST_SURNAME
|
VARCHAR(40)
|
NOT NULL
|
顧客の姓
|
|
CUST_ADDRESS1
|
VARCHAR(60)
|
NOT NULL
|
顧客の住所、1 行目
|
|
CUST_ADDRESS2
|
VARCHAR(60)
|
|
顧客の住所、2 行目
|
|
CUST_CITY
|
VARCHAR(30)
|
NOT NULL
|
顧客の居住都市
|
|
CUST_ZIP
|
VARCHAR(10)
|
NOT NULL
|
顧客の郵便番号
|
|
CUST_STATE
|
CHAR(2)
|
NOT NULL
|
顧客の住所、都市名略称
|
|
ACCOUNT_TYPE
|
|
ACCTYPE_ID
|
CHAR(3)
|
NOT NULL
|
3 桁の口座タイプコード
|
|
ACCTYPE_DESC
|
VARCHAR(30)
|
NOT NULL
|
口座タイプの説明
|
|
ACCTYPE_INTERESTRATE
|
DECIMAL(4,2)
|
DEFAULT 0.0
|
年利
|
|
ACCOUNT
|
|
BRANCH_CODE
|
CHAR(4)
|
NOT NULL
|
支店コード (主キー構成要素 1)
|
|
ACC_NO
|
CHAR(8)
|
NOT NULL
|
口座番号 (主キー構成要素 2)
|
|
CUST_NO
|
INT
|
NOT NULL
|
口座名義人
|
|
ACCTYPE_ID
|
CHAR(3)
|
NOT NULL
|
口座タイプ。ACCOUNT_TYPE を参照
|
|
ACC_BALANCE
|
DECIMAL(10.2)
|
DEFAULT 0.0
|
決済後の利用可能残高
|
|
TRANSACTION_TYPE
|
|
TRANSTYPE_ID
|
CHAR(4)
|
NOT NULL
|
4 桁の取引タイプコード
|
|
TRANSTYPE_DESC
|
VARCHAR(40)
|
NOT NULL
|
取引コードの説明
|
|
TRANSACTION_HISTORY
|
|
TRANS_ID
|
LONGINT
|
NOT NULL
|
全取引のシリアル番号
|
|
BRANCH_CODE
|
CHAR(4)
|
NOT NULL
|
ACCOUNT 参照キー構成要素 1
|
|
ACC_NO
|
CHAR(8)
|
NOT NULL
|
ACCOUNT 参照キー構成要素 2
|
|
TRANSTYPE_ID
|
CHAR(4)
|
NOT NULL
|
TRANSACTION_TYPE を参照する項目
|
|
TRANS_POSTDATE
|
TIMESTAMP
|
NOT NULL
|
取引の記帳日付および時刻
|
|
TRANS_DESC
|
VARCHAR(40)
|
|
取引に関する追記事項
|
|
TRANS_AMOUNT
|
DECIMAL(10.2)
|
NOT NULL
|
取引額
|
アプリケーション間の移動とロジック
   アプリケーション間の移動についての上位レベルビュー
   詳細なアプリケーションロジック
アプリケーションコンポーネント
データベーススキーマの各表はエンティティ Bean としてカプセル化されます。
|
エンティティ Bean
|
データベーステーブル
|
|
Account
|
ACCOUNT 表
|
|
AccountType
|
ACCOUNT_TYPE 表
|
|
Branch
|
BRANCH 表
|
|
Customer
|
CUSTOMER 表
|
|
Transaction
|
TRANSACTION_HISTORY 表
|
|
TransactionType
|
TRANSACTION_TYPE 表
|
ほとんどすべてのエンティティ Beans がコンテナ管理による持続性 (CMP) を使用します。ただし Customer は例外で、Bean 管理による持続性 (BMP) を使用します。
現在アプリケーション側では Account、AccountType、Branch、および Customer beans だけを使用しています。
- ビジネスコンポーネント
-
アプリケーションのビジネスコンポーネントはセッション Beans でカプセル化されます。
-
BankTeller Bean はステートフルセッション Bean であり、顧客とシステムとの対話をすべてカプセル化します。BankTeller は特に次の目的で使用されます。
authCheck() メソッドによる顧客の認証
getAccountSummary() メソッドによる顧客の口座リスト取得
transferFunds() メソッドによる 1 人の顧客の口座間の資金振替
InterestCalculator Bean はステートレスセッション Bean であり、資金計算をカプセル化します。projectEarnings() メソッドによる複利計算で使用されます。
- アプリケーションロジックコンポーネント (サーブレット)
|
コンポーネント名
|
目的
|
|
LoginServlet
|
BankTeller セッション Bean (authCheck() メソッド) によるユーザーの認証、HTTP セッションの生成、およびセッションのユーザー情報保存を行う。正常に認証された場合は要求をメインメニューページ (UserMenu.jsp) に転送する
|
|
CustomerProfileServlet
|
顧客および支店に関する詳細情報をそれぞれのエンティティ Beans から取得し、要求を「view/edit details」ページ (CustomerProfile.jsp) に転送する
|
|
UpdateCustomerDetailsServlet
|
CustomerProfile.jsp での顧客の詳細情報の変更が妥当かどうかをチェックし、妥当な場合は顧客のエンティティ Bean を更新して反映する。処理が正常に実行された場合は UpdatedDetails.jsp にリダイレクトし、入力が正しくない場合は DetailsUpdateFailed.jsp にリダイレクトする
|
|
ShowAccountSummaryServlet
|
顧客の口座リストを BankTeller セッション Bean から getAccountSummary() メソッドで取得し、要求を AccountSummary.jsp に転送して表示する
|
|
TransferFundsServlet
|
顧客の口座リストを BankTeller セッション Bean から getAccountSummary() メソッドで取得後、要求を TransferFunds.jsp に転送し、ユーザーによる転送設定を許可する
|
|
CheckTransferServlet
|
ユーザーが振替元および振替先として指定した口座をチェックし、入力した金額の振替ができるかどうかを確認する。BankTeller セッション Bean の transferFunds() メソッドを呼び出し、振替を行う。入力または処理エラーの場合は CheckTransferFailed.jsp にリダイレクトし、処理が正常に実行された場合は TransferSuccess.jsp にリダイレクトする
|
|
ProjectEarningsServlet
|
InterestCalc.jsp でユーザーが定義した利息計算パラメータを取得し、InterestCalculator ステートレスセッション Bean の projectEarnings() メソッドを呼び出して計算を行う。結果を ShowProjectionResults.jsp ページに転送して表示する。入力が無効な場合は BadIntCalcInput.jsp にリダイレクトする
|
- プレゼンテーションロジックコンポーネント (JSP ページ)
|
コンポーネント名
|
目的
|
|
index.jsp
|
ログインページとしても使用されるアプリケーションの索引ページ
|
|
LoginError.jsp
|
入力されたユーザー証明書が無効な場合に表示されるログインエラーのページ。ログインできなかった理由を示すメッセージを表示する
|
|
Header.jsp
|
アプリケーションのすべての HTML ページに動的に追加されるページヘッダ
|
|
CheckSession.jsp
|
このページはアプリケーションのすべてのページに静的に追加され、ユーザーがログインしているかどうか、つまり有効な HTTP セッションを保有しているかどうかを確認する。有効なセッションを保有していない場合は、NotLoggedIn.jsp ページにリダイレクトされる
|
|
NotLoggedIn.jsp
|
最初にログインの手順を実行せずに、アプリケーションのページにアクセスしようとした場合にリダイレクトされるページ
|
|
UserMenu.jsp
|
正常にログインするとリダイレクトされる、メインのアプリケーションメニューページ。実行できるすべての操作に対するリンクを持つ
|
|
CustomerProfile.jsp
|
編集可能な顧客の詳細情報や支店の詳細情報が表示されるページ。このページで住所変更が可能
|
|
UpdatedDetails.jsp
|
詳細情報の正常更新後にリダイレクトされるページ
|
|
DetailsUpdateFailed.jsp
|
入力エラーのため詳細情報を更新できない場合にリダイレクトされるページ
|
|
AccountSummaryPage.jsp
|
ある顧客の持つ複数の口座を一覧表として表示するページ。口座番号、口座のタイプ、現在の残高を表示する。表の口座番号をクリックすると、その口座の詳細な取引履歴が表示される
|
|
ShowTransactionHistory.jsp
|
ある口座の詳細な取引履歴を表示するページ。カスタムタグライブラリを使用して表示を行う
|
|
TransferFunds.jsp
|
ある口座から別の口座への指定された金額の振替を設定するページ
|
|
TransferCheckFailed.jsp
|
選択された資金振替の設定が正しくない場合にリダイレクトされるページ
|
|
TransferSuccess.jsp
|
ユーザーが設定した送金が正常に実行された場合に表示されるページ。確認メッセージが表示される
|
|
InterestCalc.jsp
|
複利計算パラメータ入力用のページ
|
|
BadIntCalcInput.jsp
|
複利計算パラメータが正しくない場合にリダイレクトされるページ
|
|
ShowProjectionResults.jsp
|
利息計算が正常に実行された場合にリダイレクトされるページ。予測結果を表形式で表示する
|
|
Logout.jsp
|
アプリケーションの終了ページ。ユーザーに関連付けられたステートフルセッション Bean を削除し、HTTP セッションを無効化する
|
|
Error.jsp
|
予期しないエラーが発生するとリダイレクトされるページ。発生したエラーの詳細情報を表示する
|
移行時に発生する問題を考慮した最適な設計の選択
アプリケーションの設計については、特に「実際の」コンテキストで議論すべきものが多いのは確かですが、一般的な J2EE アプリケーションの移行で発生する可能性がある問題を、サンプルアプリケーションでできるだけ網羅することも考慮する必要があります。
このセクションでは J2EE アプリケーションの移行時に発生する可能性がある問題を検討し、移行時にこれらの問題をチェックするために iBank に用意されているコンポーネントについて説明します。
選択された移行を処理するための次のテクノロジーに焦点を当てて説明します。
サーブレット
- iBank にはサーブレットがいくつか用意されており、以下についての潜在的な問題を特定できます。
- サーブレット API の一般的な機能の使用
- HTTP セッションおよび HTTP 要求の属性の保存または取得
- サーブレットコンテキスト初期化パラメータの取得
- ページのリダイレクト
Java Server Pages
-
JSP の仕様に関しては次の面を重視しています。
JSP 宣言、スクリプトレット、式、およびコメントの使用
静的なインクルード (<%@ include file="ノ" %>)。特に CheckSession.jsp ファイルの各ページへの追加でテスト
動的なインクルード (<jsp:include page=ノ />)。Header.jsp の各ページへの動的な追加でテスト
カスタムタグライブラリの使用。カスタムタグライブラリを ShowTransactionHistory.jsp で使用
JSP 例外処理のエラーページ。アプリケーションエラーリダイレクト用の Error.jsp ページ
JDBC
-
iBank アプリケーションは接続プールおよびデータソース経由でデータベースにアクセスします。BMP エンティティ Bean、BankTeller セッション Bean、カスタムタグライブラリでアクセスロジックをプログラミングすることもでき、CMP エンティティ Beans でアクセス方法を宣言することもできます。
Enterprise Java Beans (EJB)
-
iBank では様々な Enterprise Java Beans を使用しています。
-
-
エンティティ Beans :
-
Bean 管理による持続性 (Customer Bean) では、次のテストが可能です。
-
-
コンテナ管理による持続性 ("Account" および "Branch" Beans) では、次のテストが可能です。
開発ツールを使用する、配備記述子内のオブジェクトとリレーショナル間の (O/R) マッピング
複合主キーの使用 ("Account")
Account Bean とその findOrderedAccountsForCustomer() メソッドを使用するカスタム CMP 検索の定義。これによって配備記述子のクエリロジック宣言の差異を確認し、オブジェクト集計を返す場合の複雑な例を見ることができる
-
-
セッション Beans :
-
ステートレスセッション Beans。InterestCalculator では次のテストが可能です。
ステートレスセッションBean の使用と配備
計算用ビジネスメソッドの呼び出し
-
-
ステートフルセッション Beans。BankTeller では次のテストが可能です。
JNDI と初期コンテキストを使用する様々なインタフェースの検索
JDBC によるデータベースクエリ
Bean methods の様々なトランザクション属性の使用
コンテナ境界設定トランザクションの使用
呼び出し間の会話型ステートの維持
"getAccountSummary()" メソッドなど、エンティティ Beans のフロントエンドとして動作するビジネスメソッド
アプリケーションのパッケージ化
-
iBank は、次の J2EE 標準プロシージャをそれぞれ指定のファイルを使用してパッケージ化します。
Web アプリケーションモジュールには Web アプリケーションアーカイブファイルを使用し、EJB には EJB-JAR アーカイブを使用
エンタープライズアプリケーションアーカイブファイル (EAR ファイル) は、Web アプリケーションおよび EJB モジュールの最終パッケージ化で使用