J2EEのパターン

J2EEのパターン
∼レイヤアーキテクチャと
プレゼンテーションレイヤ∼
山野裕司 <[email protected]>
(株)オージス総研
目的
• J2EEアプリケーション開発で用いる
パターンの種類の紹介
• レイヤアーキテクチャ、プレゼンテー
ションレイヤを設計するためのパターン
の紹介
• 設計のコツ
2
目次
• J2EEのパターンとは
• レイヤアーキテクチャ
• プレゼンテーションレイヤのパターン
3
J2EEのパターンとは
4
J2EEのパターン?
• 一般的にJ2EEパターンと呼ばれている
のはCore J2EEパターン
• しかし、J2EEアプリケーション開発
において、Core J2EEパターン以外の
パターンもたくさん使う
5
J2EEのパターンの種類
• 設計パターン
POSAパターン、GoFデザインパターン、 PofEAA
パターン、Core J2EEパターン、EJBパターンなど
• 実装パターン
Essential Java Style
• テストパターン
Java Testing Patterns
6
汎用的な設計パターン
• GoFデザインパターン
再利用性の高いオブジェクト指向システムのための
デザインパターン
• POSAパターン
LayersやMVCなどのアーキテクチャパターンで有名
• PofEAAパターン
エンタープライズアプリケーションのアーキテクチャ
パターン
7
J2EE固有の設計パターン
• Core J2EEパターン
SunのエンジニアによるJ2EEアプリケーションの
ためのパターン
• EJBパターン
元TSSのエンジニアによるEJBのためのパターン
• J2EEアンチパターン
J2EEのアンチパターン
• EJBアンチパターン
EJBのアンチパターン
8
実装、テストパターン
• Essential Java Style
Javaのイディオム
• Java Testing Patterns
Javaで単体テスト用コードを書くためのパターン
9
その他のパターン
• 作業分野で分類しにくいパターン
Enterprise Integration Patternsなど
• パターン形式でないもの
Effective Javaなどのイディオム
10
パターンの関係
J2EE
Core J2EE
パターン
EJB
パターン
J2EE
EJB
アンチパターン アンチパターン
Essential
Java
Style
Java
Java
Testing
Patterns
PofEAA
パターン
POSA
アーキテクチャ
汎用
パターン
設計
GoF
パターン
実装
11
テスト
本日紹介するパターン
• J2EEアプリケーションアーキテクチャ
設計のためのパターン
• レイヤを使いパターンをクラスタ化
• Core J2EEパターン、PofEAAパターン
を中心に、EJBパターン、POSAアーキ
テクチャパターン、GoFデザインパター
ンからピックアップ
12
レイヤアーキテクチャ
13
レイヤアーキテクチャの課題
• レイヤの分割
• レイヤ間の依存関係
• レイヤ間の通信
14
レイヤアーキテクチャとは
• 抽象度の異なる要素を分割し、階層化
するアーキテクチャ
• 関心を分離することにより複雑さを解消
できる
• 変更による影響を局所化することがで
きる
•
POSAアーキテクチャパターンの中で
Layersパターンとして紹介されている
15
Layers
❖ 名前
Layers
❖ 問題
関心の分離。変更範囲の局所化。システム要素の交
換、再利用。作業範囲の明確化。
❖ 解決策
システムを階層化された複数のレイヤに分割する。
16
Layersの例
ネットワークプロトコルのOSI 参照モデル
アプリケーション
プレゼンテーション
セッション
トランスポート
アプリケーションプログラム間の通信
圧縮やデータフォーマットの変換
セッションの確立
ホスト間の信頼性のある通信
ネットワーク
経路制御
データリンク
物理レイヤにおけるデータ転送の信頼性保証
物理
電気信号の変換
17
Layersの例
クライアント/サーバ
ユーザインターフェースと
アプリケーション
クライアント
サーバ
データベース
18
J2EEの基本3レイヤ
プレゼンテーション
ドメイン
データソース
表示やユーザ入力
システムの中核ロジック
データベースや他システム
とのコミュニケーション
19
J2EEの基本3レイヤ+1
プレゼンテーション
ドメインレイヤにアクセスする
ためのインターフェース。
アプリケ­ション境界。
サービス
ドメイン
データソース
20
Core J2EEパターンのレイヤ
クライアント
Webブラウザ、アプレット
プレゼンテーション
プレゼンテーション
サーブレット、JSP
サービス
ビジネス
EJB、Business Object
ドメイン
インテグレーション
データソース
JDBC、JMS
リソース
データベース、外部システム
21
EJBパターンのレイヤ
プレゼンテーション
JSP、HTML、JavaScript
プレゼンテーション
アプリケーション
サーブレット
サービス
サービス
Session Bean
ドメイン
ドメイン
Entity Bean、POJO
永続化
データソース
Entity Bean、O/R Mapper
22
MVC
• GUIのような対話型システムのための
パターン
• POSAアーキテクチャパターンのひとつ
• システムをシステムの中核となるデータ
管理(Model)、頻繁に変更される表示
(View)、ユーザ入力制御(Controller)に
分割することにより、柔軟性を高める
23
MVCの例
Observer
update
observers
Model
attach
notify
service
View
model
update
model
view
controller
Controller
handleEvent
24
MVC(Model-View-Controller)
❖ 名前
MVC(Model-View-Controller)
❖ 問題
ユーザインターフェースの仕様変更による影響を局所
化する。ひとつのデータを複数の形式で表示、デー
タに対する変更を即時に画面に反映する。
❖ 解決策
システムをModel、View、Controllerに分割。
ModelからViewへの更新伝搬メカニズム。
25
WebアプリケーションのMVC
• Classic MVCは Layers + Observer
• Webアプリケーションでは、HTTPプロ
トコルの性質上、Observerのような構造
を実現できない
• WebアプリケーションにおけるMVCは
単なるLayersといってもよい
• 重要なのはMとVCの分離
• C != ユースケースコントローラ
26
レイヤとしてみたMVC
View
プレゼンテーション
Controller
サービス
Model
ドメイン
データソース
27
BCE
• Ivar JacobsonのOOSEで提唱された、
分析モデルにおけるオブジェクトの分類
• BCE != パターン
• オブジェクトを境界(Boundary)、実体
(Entity)、制御(Control)に分類すること
により、変更頻度の高いインターフェー
スや機能変更によるシステムの変更を局
所化する
28
BCEの例
ショッピングサイトのログイン
ログインページ
アカウントを確認する
ユーザ
アカウント
ユーザトップページ
表示する
29
BCEとレイヤ
• BCE != レイヤ
• MVCのC != BCEのC
• 分析モデルを設計モデルに素直にマッピ
ングするためには、BCEとレイヤの関係
を考慮しておいたほうがよい
• サービスレイヤの役割、分析モデルにお
けるControlの役割は流儀によって異な
る
30
レイヤとしてみたBCE
OOSE
Boundary
プレゼンテーション
サービス
Control
ドメイン
Entity
データソース
31
レイヤとしてみたBCE
ICONIX
Boundary
プレゼンテーション
Control
サービス
ドメイン
Entity
データソース
32
レイヤ間の依存関係
• 隣接するレイヤ以外とは依存関係をもた
ない
• 高位レイヤから低位レイヤへの単方向の
依存関係であること
• ドメインレイヤとデータソースレイヤの
依存関係の向きについてはアーキテク
チャに依存する
33
レイヤ間の依存関係の例
プレゼンテーション
プレゼンテーション
ドメイン
ドメイン
データソース
データソース
34
レイヤ間の依存関係の例
プレゼンテーション
プレゼンテーション
ドメイン
ドメイン
データマッパー
データソース
データソース
35
レイヤ間の通信
• DTO(Data Transfer Object)を使う
例) プレゼンテーションレイヤとサービスレイヤ間の
データのやりとりにDTOを使用する。
• 下位レイヤに属するオブジェクトを使う
例) プレゼンテーションレイヤとドメインレイヤ間の
データのやりとりにドメインレイヤのオブジェクトを
使用する。
36
DTOとは
• コンポーネント間でデータを転送するた
めのオブジェクト
• 元々は頻繁なEJBリモート呼び出しによ
る性能劣化をさけるためのパターン
• Core J2EEパターンの第一版ではValue
Objectと呼ばれていた
第二版ではTransfer Object 、EJBパターン、PofEAAで
はData Transfer Objectという名前で呼ばれている。
37
DTO(Data Transfer Object)
❖ 名前
DTO(Data Transfer Object)
❖ 問題
リモート呼び出しの回数の削減。
❖ 解決策
データ転送専用のオブジェクトを用意する。
38
DTOの例
クライアント
DTO
EJB
DTOを取得
属性を取得
ネットワーク
39
Local DTOの例
ビデオタイトル
タイトル
1..*
ビデオDTO
タイトル
監督
ビデオAssembler
監督
1
スタッフ
名前
40
DTOのバリエーション
• Domain Data Transfer Object
ドメインオブジェクトのコピー。
• Custom Data Transfer Object
ドメインオブジェクトのデータを必要に応じ再構成。
• Data Transfer HashMap
HashMapを使いデータを転送
• Data Transfer RowSet
RowSetを使いデータを転送。
41
いつDTOを使うのか
• DTOの開発コストは無視できない
• レイヤ間の依存関係を最小限にしたい場
合はDTOを使う
• レイヤ間で必要なデータのフォーマット
や構造が大きく異なる場合はDTOを使う
42
レイヤ分割のコツ
• レイヤが少なすぎると、各レイヤの責務
があいまいになる
• レイヤが多すぎると、開発時、実行時の
オーバヘッドが大きい
• サービスを含む基本四レイヤからスター
トし、必要なレイヤを追加する
• ビジネスシステムでは関心の分離と作業
範囲の明確化が重要
43
登場したパターン
• Layers from POSA
• MVC(Model-View-Controller) from POSA
• DTO(Data Transfer Object) from PofEAA
and EJB
• Domain Data Transfer Object from EJB
• Custom Data Transfer Object from EJB
• Data Transfer HashMap from EJB
• Dara Transfer RowSet from EJB
44
パターン間の関係
M、V、Cの三つ
のレイヤを使用
Layers
Model
View
Controller
レイヤ間の通信に使用
Data
Transfer
Object
Observer
ドメインオブジェクトの
コピーをDTOとして使用
ドメインオブジェクトの
一部のデータをDTOとして使用
Domain
Data
Transfer
Object
変更通知メカニズム
として使用
Custom
Data
Transfer
Object
HashMapをDTOとして使用
RowSetをDTOとして使用
Data
Transfer
HashMap
45
Data
Transfer
RowSet
プレゼンテーションレイヤ
のパターン
46
プレゼンテーションレイヤの課題
• フレームワークのアーキテクチャの理解
• フレームワークがカバーしていない範囲
のアーキテクチャの決定
47
プレゼンテーションレイヤとは
•
表示やユーザの入力をお
こなう
•
クライアントがGUIでな
い場合も、システムから
のリクエストを受取り、
レスポンスを返すレイヤ
をプレゼンテーション
レイヤとしてとらえる
プレゼンテーション
サービス
ドメイン
データソース
アーキテクチャの歴史
JSP
Model 1
JSP
Model 2
49
MVC
フレームワーク
JSP Model 1
• JSPページ中心のアーキテクチャ
• JSPページ内でビジネスロジック実行か
ら画面遷移制御までの全ての処理をおこ
なう
• レイヤはほとんど意識されない
• Page Controller(JSP) + Template View
50
Model 1のアーキテクチャ
Webコンテナ
1
JSP
4
ブラウザ
データ
ベース
2
3
Java Bean
51
Page Controller
❖ 名前
Page Controller
❖ 問題
動的にHTMLページを生成するために、シンプルな
コントローラが必要。
❖ 解決策
リクエストを処理するコントローラをページごとに
用意する。
52
Page Controllerの例
JSPページがPage Controllerの場合
貸し出し.jsp
クライアント
返却.jsp
53
ビデオ
タイトル
監督
Template View
❖ 名前
Template View
❖ 問題
HTMLページ中に静的な部分と動的に変更したい部
分が混在している。
❖ 解決策
HTMLページに特別なマークを埋め込み、マーク部
分を動的に置換する。
54
Template Viewの例
JSPページ
VideoTitle
title
getTitle()
setTitle()
<html>
<body>
<jsp:useBean id= videoTitle
scope= session
type= com.example.VideoTitle />
<p>タイトル:
<jsp:getProperty name= videoTitle
property= title />
</body>
</html>
55
JSP Model 2
• サーブレット中心のアーキテクチャ
• サーブレットが制御をおこない、JSPが
表示をおこなう
• MVCフレームワークの原型
• Page Controller(サーブレット) + Template
View
56
Model 2のアーキテクチャ
Webコンテナ
1
サーブレット
(Controller)
2
Java Bean
(Model)
3
ブラウザ
5
JSP
(View)
4
57
データ
ベース
Page Controllerの例
サーブレットがPage Controllerの場合
サーブレット
返却
コントローラ
貸し出し
コントローラ
クライアント
貸し出し.jsp
58
ビデオ
タイトル
監督
MVCフレームワーク
• JSP Model 2アーキテクチャをベースに
したフレームワーク
• Strutsが有名
• Front Controller + Application Controller +
Template View
59
Front Controller
❖ 名前
Front Controller
❖ 問題
複数のリクエストに共通する処理が分散してしまう。
❖ 解決策
全てのリクエストの入り口となるコントローラ。
60
Front Controllerの例
Struts 1.0
クライアント
ActionServlet
Action
リクエスト送信
performs
forwards
貸し出.jsp
貸し出Action
61
返却Action
Application Controller
❖ 名前
Application Controller
❖ 問題
処理の実行や画面遷移制御が複雑なためFront
Controllerが肥大化する。
❖ 解決策
処理実行や画面遷移制御を担当するコントローラ。
62
Application Controllerの例
Struts 1.1
クライアント
ActionServlet
リクエスト送信
RequestProcessor
processes
Action
executes
forwards
貸し出.jsp
63
貸し出Action
返却Action
その他のパターン
• 既存、あるいは独自のフレームワークだ
けで全てのアーキテクチャを表現できる
わけではない。
-
Intercepter Filter
View Helper
64
Intercepter Filter
❖ 名前
Intercepter Filter
❖ 問題
リクエストやレスポンスに対して前処理や後処理が必
要。前処理、後処理を簡単に追加、削除したい。
❖ 解決策
プラガブルなフィルタをチェインできるメカニズム。
65
Intercepter Filterの例
サーブレット2.3のフィルタ
creates
Client
invokes
FilterManager
manages
FilterChain
invokes
1
{ordered}
creates
0..*
Filter
66
Target
View Helper
❖ 名前
View Helper
❖ 問題
JSPのようなテンプレートベースのビューに処理ロ
ジックが混入する。
❖ 解決策
処理ロジックを隠蔽するためのヘルパークラスを導入
する。
67
View Helperの例
貸し出し.jsp
JSPタグ
ライブラリ
68
ビデオ
タイトル
監督
登場したパターン
• Page Controller from PofEAA
• Template View from PofEAA
• Front Controller from Core J2EE and
PofEAA
• Application Controller from Core J2EE and
PofEAA
• Intercepter Filter from Core J2EE
• View Helper from Core J2EE
69
パターン間の関係
Intercepter
Filter
リクエストの前処理、後処理のために使用
Page
Controller
リクエストを集中制御する
必要がある場合に使用
Front
Controller
制御処理の複雑さを軽減
するために処理を委譲
Application
Controller
動的ページを生成する場合に利用
Template
View
70
ビューと処理を分離
するために利用
View
Helper
参考資料
71
•
•
•
•
•
•
•
•
•
•
•
•
Deepak Alur, John Crupi, Dan Malks. Core J2EE Patterns: Best Practices and Design Strategies.
Prentice Hall, 2003.
近棟稔, 吉田悦万, 小森美智子(監修), トップスタジオ(訳), 『J2EEパターン 第2版』, 日経BP社,
2005
Joshua Bloch. Effective Java Programming Language Guide. Addison-Wesley, 2001.
柴田芳樹(訳), 『Effective Java』, ピアソン・エデュケーション, 2001
Frank Busschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal.
Pattern-Oriented Software Architecture: A System of Patterns. John Wiley & Sons, 1996.
金澤典子, 水野貴之, 桜井真理, 関富登志, 千葉寛之(訳), 『ソフトウェアアーキテクチャ』,
トッパン, 1999
Bill Dudney, Stephen Asbury, Joseph Krozak, Kevin Wittkopf. J2EE Anti Patterns. John
Wiley & Sons, 2003.
トップスタジオ(訳), 『J2EEアンチパターン』, 日経BP社, 2004
Martin Fowler. Patterns of Enterprise Architecture. Addison-Wesley, 2002.
長瀬嘉秀(監訳), テクノロジックアート(訳), 『エンタープライズアプリケーションアーキテク
チャパターン』, 翔泳社, 2005
Martin Fowler. Inversion of Control Containers and the Dependency Injection pattern.
http://martinfowler.com/articles/injection.html, 2004.
角谷信太郎(訳), 『Inversion of Control コンテナと Dependency Injection パターン』,
http://kakutani.com/trans/fowler/injection.html, 2004
72
•
•
•
•
•
•
•
•
•
•
•
•
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of
Reusable Object-Oriented Software. Addison-Wesley, 1995.
本位田真一, 吉田和樹(監訳), 『オブジェクト指向における再利用のためのデザインパターン 改
訂版』, ソフトバンクパブリッシング, 1999
Gregor Hohpe, Bobby Woolf. Enterprise Integration Patterns: Designing, Building and Deploying
Message Sokutions. Addison-Wesley, 2003.
Ivar Jacobson, Magnus Christenson, Patrik Jonson, Gunnar Overgaard. Object-Oriented
Software Engineering: A Use Case Driven Approach, Addison-Wesley,1992.
Jeff Langr. Essential Java Style: Patterns for Implementation. Prentice-Hall, 1999.
Floyd Marinescu. EJB Design Patterns: Advanced Patterns, Processes and Idioms. John Wiley &
Sons, 2002.
トップスタジオ(訳), 『EJBデザインパターン』, 日経BP社,
Doug Rosenberg, Kendall Scott. Use Case Driven Object Modeling with UML: A Practical
Approach, Addison-Wesley, 1999.
長瀬嘉秀(監訳), 今野睦(翻訳), テクノロジックアート(訳), 『ユースケース入門 ユーザマニュア
ルからプログラムをつくる』, ピアソン・エデュケーション, 2001
Bluce Tate, Mike Clark, Bob Lee, Patrick Linsley. Bitter EJB. Manning, 2003
トップスタジオ(訳), 『EJBアンチパターン』, 日経BP社, 2004
Jon Thomas, Matthew Young, Kyle Brown, Andrew Glover. Java Testing Patterns. Wiley,
2004.
73