某プロジェクトのアーキテクチャ

いったん区切りがついたので、某プロジェクトのアーキテクチャを整理しておきたいと思います。対象ドメインは公表すると問題かもしれないので、ここでは伏せておきます。
まず、本プロジェクトの特徴として、多くの部分が 4GL で書かれた既存のアプリケーションの焼き直しである点、またそのアプリケーション自体、サブシステム分割、レイヤ分割等がある程度適切に行われていたので、多少気に入らない点はあるものの踏襲しています。

プレゼンテーション

  • StrutsS2Struts をベースに機能追加。
  • Action、ActionForm は Struts の基底クラスを継承して作成。
  • 原則1画面、1 Action、1 ActionForm (入出力共通)。
  • 無設定 Struts は未使用。
  • バリデーションは S2Strutsアノテーションで記述。
  • ActionForm は Excel の画面仕様書から自動生成。
    • ツールは POI と Velocity を使って作成。
  • ビューは画面数があまり多くなかったので、JSPStruts のカスタムタグで作成。
    • Struts のカスタムタグを使用したのは失敗だったかも。単純な input タグのリストが書けずに苦労した。
  • カスタムタグを拡張して以下の機能を実装。
    • 権限に応じて部品の enable/disable を切り替え。
    • テーブルの奇数行/偶数行の色を変える。
    • etc.

オンライン処理

バッチ処理

  • 旧システムを踏襲して Command パターン。
  • 画面から、あるいはスケジューラがキューにジョブを登録し、フレームワークが該当する Command を複数サーバ上で並列実行。
  • Command は必要に応じて、ビジネスロジックを呼び出す。
  • Command の実行がトランザクションの単位。

ビジネスロジック

  • POJO で作成。
  • 必要に応じて DAO を呼び出す。
  • コンポーネント管理は Seasar2 で行う。
    • ライフサイクルは singleton にしたかったが、旧システムからの移植部分は、状態を属性で持っているため prototype にすることになりそう。

データ永続化

  • 既存からの移植分は、コネクション管理だけ Seasar2 を利用。
  • 新規作成分は S2Dao を利用。
  • 属性の型が java.util.Date の場合、Timestamp でオブジェクトに格納されるが、java.util.Date に変換した方が良さそう。(修正予定)
  • 新規作成分の Entity、DAO は Excel のテーブル定義書から自動生成。
    • ツールはやはり POI と Velocity を使って作成。

テスト支援

  • S2TestCase をベースに機能を追加。
  • クラス名_SETUP.xls あるいは クラス名_メソッド名_SETUP.xls があればデータを自動ロード。
  • Excel のセルがスペースの場合、null が insert されてしまう問題の対処。
  • データベースのスキーマ、マスタデータの同期をとる仕組みがほしいなぁ...

その他

  • 設定ファイル読み込み。
  • キャッシュ。
  • メッセージ通知。
  • ログ出力 - Log4J を利用。

運用アプリケーション

  • 目下作成中。

ドキュメント類