Comments
Description
Transcript
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