アプリケーションアーキテクチャ設計パターン

B5変形判/528ページ

定価(本体3,500円+税)

ISBN 978-4-7741-9303-8

電子版

→学校・法人一括購入ご検討の皆様へ

書籍の概要

この本の概要

本書は,アプリケーションアーキテクチャの基本設計フェーズにおいて「何を作るか」ではなく「どう作るか」を設計する際のガイドです。心臓部となるサーバサイドを中心に,シングルページアプリケーションの台頭で再び重要性を増してきたクライアントサイド,SQLなどの伝統的な処理方式とビッグデータ技術という新潮流が混在するバッチ処理,システム間連携と,さまざまな分野を網羅します。アーキテクトやエンジニアが習得するべきコアのスキルとして,長きに渡って活用できる一冊です。

こんな方におすすめ

  • アーキテクチャのパターンを俯瞰したいアーキテクトやエンジニア

著者の一言

本書のテーマは,アプリケーションアーキテクチャの設計パターンです。アプリケーションアーキテクチャの世界には,すでに偉大な先人たちによって編み出された優れた設計パターンがあります。本書の狙いは,それらの設計パターンをベースに,私がこれまで携わってきた数々のプロジェクトで積み上げてきた設計ノウハウをミックスし,最新のJava EEプラットフォームやフレームワークの仕様を前提に,パターン体系として再整理することにあります。
本書は,エンタープライズアプリケーションの心臓部であるサーバサイドを中心に,シングルページアプリケーションの台頭で再び重要性を増してきたクライアントサイド,SQLなどの伝統的な処理方式とビッグデータ技術という新潮流が混在するバッチ処理,そして昨今「オープンAPI」で改めて注目が集まっているシステム間連携と,様々な分野を広くカバーしています。本書では,すべての分野に渡って語彙や記述レベルを統一し,使用するサンプルも合わせるように工夫しました。たとえば「第10章 非同期呼び出しと並列処理のための設計パターン」と,「第18章 ビッグデータ技術による分散並列バッチ処理」では,「売上取引データを集約する」という同じ例を用いています。これは,同じ例を使うことで,マルチスレッドによる並列処理とビッグデータ技術(Hadoopなど)という2つの異なるアーキテクチャの間に,「大きなデータセットを如何にして効率的に処理するか」という共通の課題があることに気が付きやすくするためです。このように異なる分野におけるアプリケーションアーキテクチャであっても,実は処理の効率化や拡張性の向上など,設計における本質的な課題は同じであることが多いのです。
本書では,「設計パターンのトレードオフ」を特にクローズアップしています。ある1つの機能要件を充足するための設計パターンには,ほとんどの場合,いくつかの選択肢があります。そしてそれらの設計パターン同士には,コスト,技術的な難易度,パフォーマンスなど,様々な観点でトレードオフがあります。本書を通じてこのようなトレードオフを理解すれば,何を基準にどういったパターンを選択するべきか,プロジェクトの中で適切な判断ができるようになるでしょう。
さて,本書のテーマはあくまでも設計パターンですが,各設計パターンを具現化するためのソースコードを,なるべく多めに掲載しています。ウォーターフォール型の開発では,設計フェーズと実装フェーズは分離されますが,設計と実装は「上流と下流」というよりは,相互依存の関係にあると考えるべきです。つまり,実装は「設計ありき」ですが,設計もまた「実装ありき」なのです。アーキテクト自身が実装までを自ら検証して習熟することができれば理想的ですが,現実的には時間の制約などから難しいことが多いでしょう。ただし,自身で実装まですべてをカバーすることはできなくても,「実装のイメージ」を頭の中で描けるようにさえなっていれば,アプリケーションアーキテクチャを設計する上で支障をきたすことはありません。ぜひ読者の皆様には,最適な設計のために,本書に掲載されたソースコードを読み解くことによって,実装をイメージできる力を養っていただきたいと考えています。
エンタープライズシステムは,これからクラウドへの移行がますます進むものと思いますが,過去の資産も含めると,まだまだオンプレミスの比率が相応に高い状況です。しかし,クラウドであろうとオンプレミスであろうと,アプリケーションアーキテクチャの根幹部分は大きくは変わりません。本書で取り扱っているアプリケーションアーキテクチャの設計は,今後エンタープライズシステムを取り巻く環境が移り変わっても,「ぶれる」ことの少ない普遍性の高いテーマです。アーキテクトが習得するべきコアのスキルとして,長きに渡って活用することができるでしょう。
本書が,読者の皆様が担当するエンタープライズシステムにおいて,アプリケーションアーキテクチャ設計の一助となれば幸いです。
(本書「はじめに」より)

目次

Part 1 アプリケーションアーキテクチャ概要
第1章 アプリケーションアーキテクチャとは

  • 1.1 アーキテクチャとは
  • 1.2 アプリケーションアーキテクチャ設計の目標
  • 1.3 アプリケーションアーキテクチャ設計が必要な理由
  • 1.4 アプリケーションアーキテクチャ設計のポイント
  • 1.5 アプリケーションアーキテクチャ設計とパターン
  • 1.6 アプリケーションアーキテクチャの開発工程と成果物

第2章 エンタープライズアプリケーションの共通概念と処理形態

  • 2.1 エンタープライズアプリケーションの共通的な概念や方式
    • 2.1.1 同期・非同期
    • 2.1.2 逐次,並列,並行
  • 2.2 エンタープライズアプリケーションの処理形態
    • 2.2.1 オンライン処理
    • 2.2.2 バッチ処理

第3章 エンタープライズアプリケーションの機能配置とレイヤ化

  • 3.1 エンタープライズシステムのレイヤ化と機能配置
    • 3.1.1 エンタープライズシステムにおけるレイヤ化
  • 3.2 エンタープライズシステムの構成とアプリケーションの配置
    • 3.2.1 エンタープライズシステムのシステム構成
    • 3.2.2 サーバサイドにおけるアプリケーション
    • 3.2.3 クライアントサイドにおけるアプリケーション
  • 3.2 サーバサイドアプリケーションのレイヤ化
    • 3.2.1 Webアプリケーションのレイヤ化
    • 3.2.2 サービスアプリケーションとサービスインタフェース層
  • 3.3 Java EEの仕様とアーキテクチャ
    • 3.3.1 Java EEのアーキテクチャ
    • 3.3.2 Java EEの主な仕様とフレームワーク
    • 3.3.3 POJO+アノテーション

Part 2 サーバサイドの設計パターン
第4章 プレゼンテーション層の設計パターン

  • 4.1 サーブレットとJSPの基本
    • 4.1.1 サーブレット
    • 4.1.2 JSP(JavaServer Pages)
    • 4.1.3 スコープ
    • 4.1.4 サーブレット・JSPページの連携
    • 4.1.5 JSPページの様々な機能
    • 4.1.6 JSPページの再利用性向上
  • 4.2 サーブレットとJSPの応用
    • 4.2.1 MVCパターン
    • 4.2.2 フィルタ
    • 4.2.3 コンテンツ呼び出しと画面遷移の方式
    • 4.2.4 Webブラウザを経由した他システムコンテンツとの連携パターン
  • 4.3 セッション管理
    • 4.3.1 セッション管理
    • 4.3.2 セッション管理と負荷分散の設計パターン
    • 4.3.3 セッション管理のその他の機能
  • 4.4 アクションベースのMVCフレームワーク
    • 4.4.1 MVCフレームワークの種類と特徴
    • 4.4.2 アクションベースのMVCフレームワーク
  • 4.5 コンポーネントベースのMVCフレームワーク
    • 4.5.1 JSFによる「人員管理アプリケーション」
    • 4.5.2 機能性・保守性を向上させるJSFのその他の機能
    • 4.5.3 AjaxとJSF
  • 4.6 認証とログイン・ログアウト
    • 4.6.1 認証と認可
    • 4.6.2 HTTPの仕様で規定された認証機能を利用する方式(方式①)
    • 4.6.3 Java EEコンテナ固有の認証機能を利用する方式(方式②)
    • 4.6.4 アプリケーションとして認証を実装する方式(方式③)
    • 4.6.5 SSOサーバで認証する方式(方式④)
    • 4.6.6 権限チェックと人事情報
    • 4.6.7 二重ログインチェック
  • 4.7 ビュー設計パターン
    • 4.7.1 ページレイアウト管理
    • 4.7.2 ページ作成の効率化パターン
    • 4.7.3 ウィンドウ制御
  • 4.8 不正な更新リクエストの発生とその対策
    • 4.8.1 不正な更新リクエストの発生
    • 4.8.2 不正な更新リクエスト対策

第5章 インスタンスの生成や構造に関する設計パターン

  • 5.1 インスタンスのライフサイクルに関する設計パターン
    • 5.1.1 インスタンスのライフサイクル
    • 5.1.2 マルチスレッド環境における留意点
    • 5.1.3 アプリケーションによるライスサイクル管理
    • 5.1.4 Java EEにおけるライフサイクル管理とCDI
  • 5.2 依存性解決のための設計パターンとDI
    • 5.2.1 クラスからクラスの呼び出し方
    • 5.2.2 インタフェースによる呼び出し方~ファクトリ利用
    • 5.2.3 インタフェースによる呼び出し方~DIを利用
  • 5.3 AOP(Aspect Oriented Programming)
    • 5.3.1 AOPの概要
    • 5.3.2 AspectJ
  • 5.4 DI×AOPコンテナとCDI
    • 5.4.1 DI×AOPコンテナとしてのCDI
    • 5.4.2 DIによるリソースオブジェクトの取得
    • 5.4.3 CDIによる高度なDIのメカニズム
    • 5.4.4 ProducerによるDI
    • 5.4.5 テスト容易性の向上
    • 5.4.6 カンバセーションスコープ
    • 5.4.7 インターセプタによるAOP(動的ウィービング)
  • 5.5 下位レイヤから上位レイヤの呼び出し
    • 5.5.1 Observerパターン
    • 5.5.2 Plugin Factoryパターン

第6章 ビジネス層の設計パターン

  • 6.1 ビジネス層の設計パターン
    • 6.1.1 ビジネス層の概要
    • 6.1.2 サンプルアプリケーション「ネットショップシステム」の業務要件
  • 6.2 Transaction Scriptパターンによるビジネスロジック構築
    • 6.2.1 Transaction Script パターンの処理フロー
    • 6.2.2 Transaction Script パターンにおけるサンプルアプリケーション構築
    • 6.2.3 Transaction Script パターンの課題
  • 6.3 Domain Modelパターンによるビジネスロジック構築
    • 6.3.1 Domain Modelパターンの概要
    • 6.3.2 Domain Modelパターンにおけるサンプルアプリケーション構築
    • 6.3.3 Domain Modelパターンの利点と課題
  • 6.4 ビジネスロジックの効率的な構築
    • 6.4.1 条件分岐によるロジックの切り替え
    • 6.4.2 エンティティのステート管理
    • 6.4.3 ビジネスルールのチェック

第7章 トランザクション管理とデータ整合性確保のための設計パターン

  • 7.1 トランザクションとは
    • 7.1.1 エンタープライズアプリケーションで発生しうるデータの不整合
    • 7.1.2 トランザクションとは
    • 7.1.3 トランザクションの種類
    • 7.1.4 トランザクションの特性
  • 7.2 Java EEにおけるRDBアクセスとトランザクション管理
    • 7.2.1 Java EEにおけるRDBアクセスの仕組み
    • 7.2.2 Javaアプリケーションにおけるトランザクション管理
    • 7.2.3 CDI におけるトランザクション管理
    • 7.2.4 一括更新の設計パターン
    • 7.2.5 分散トランザクション
  • 7.3 並行性と隔離性
    • 7.3.1 並行性と隔離性
    • 7.3.2 ロックの仕組みを利用した不整合の回避
    • 7.3.3 悲観的ロックとデッドロック
    • 7.3.4 悲観的ロックと主キー値の設計
    • 7.3.5 楽観的ロックとロングトランザクション
    • 7.3.6 楽観的ロックによる「ユーザの意図しない結果」の回避方法
    • 7.3.7 不正な読み込みとアイソレーションレベル
    • 7.3.8 削除に関する競合

第8章 データアクセス層の設計パターン

  • 8.1 データアクセス層の設計パターン
    • 8.1.1 オブジェクトモデルとリレーショナルモデル
    • 8.1.2 データアクセス層の設計パターン
    • 8.1.3 本書におけるデータモデル
  • 8.2 Table Data GatewayパターンとMyBatis
    • 8.2.1 Table Data Gatewayパターン
    • 8.2.2 MyBatisの基本的な仕組み
    • 8.2.3 MyBatisによるCRUD 操作
    • 8.2.4 特別な型のバインディング
    • 8.2.5 ロックによるデータ不整合の回避
    • 8.2.6 RDBの連番生成機能の利用
    • 8.2.7 GenericDAOパターン
  • 8.3 Data MapperパターンとJPA
    • 8.3.1 Data Mapperパターン
    • 8.3.2 JPAの基本的な仕組み
    • 8.3.3 エンティティ操作のパターン
    • 8.3.4 特別な型のマッピング
    • 8.3.5 ロックによるデータ不整合の回避
    • 8.3.6 RDBの連番生成機能の利用
  • 8.4 エンティティと関連(MyBatis,JPA 共通)
    • 8.4.1 関連の概念
    • 8.4.2 関連のある複数エンティティの読み込み方式
    • 8.4.3 関連のある複数エンティティの書き込み方式
  • 8.5 MyBatisにおける関連エンティティの操作
    • 8.5.1 フラットなモデルへの読み込み
    • 8.5.2 オブジェクトモデルへの読み込み
  • 8.6 JPAにおける関連エンティティの操作
    • 8.6.1 関連のメタ情報定義
    • 8.6.2 オブジェクトモデルへの読み込み
    • 8.6.3 オブジェクトモデルからの書き込み
  • 8.7 JPAにおけるクエリ
    • 8.7.1 JPAにおけるクエリ
    • 8.7.2 JPQLと関連エンティティ
    • 8.7.3 JPQLのその他の機能
    • 8.7.4 一括の書き込み操作
    • 8.7.5 ネイティブクエリ
    • 8.7.6 レイジーフェッチの問題と解決方法
  • 8.8 動的クエリ(MyBatis,JPA 共通)
    • 8.8.1 動的クエリとは
    • 8.8.2 MyBatisにおける動的クエリ
    • 8.8.3 クライテリア(JPA)と動的クエリ
  • 8.9 JPAの高度な機能
    • 8.9.1 エンティティクラスの継承
    • 8.9.2 エンティティクラスの委譲
    • 8.9.3 複合主キー

第9章 検証と例外のための設計パターン

  • 9.1 検証
    • 9.1.1 検証の種類
    • 9.1.2 検証の戦略
  • 9.2 エラーと例外
    • 9.2.1 想定内エラー
    • 9.2.2 想定外エラー

第10章 非同期呼び出しと並列処理のための設計パターン

  • 10.1 スレッドによる非同期呼び出しと並列処理
    • 10.1.1 スレッドによる非同期呼び出し
    • 10.1.2 Executorフレームワークによる並列処理
  • 10.2 ストリームAPIとラムダ式によるパイプライン処理
    • 10.2.1 ストリームAPI によるパイプライン処理
    • 10.2.2 ラムダ式の利用
  • 10.3 コレクションを並列処理するための設計パターン
    • 10.3.1 コレクションに対する操作
    • 10.3.2 Executorフレームワークを利用するパターン
    • 10.3.3 Fork/Joinフレームワークを利用するパターン
    • 10.3.4 ストリームAPIとラムダ式を利用するパターン
  • 10.4 エンタープライズアプリケーションにおける非同期処理と並列処理
    • 10.4.1 非同期サーブレット
    • 10.4.2 EJB 非同期呼び出し
    • 10.4.3 Concurrency Utilities for Java EE

第11章 その他のアーキテクチャパターン

  • 11.1 静的データの取り扱いに関する設計パターン
    • 11.1.1 列挙型としてソースコードに直接記述する方式
    • 11.1.2 テキストファイルから読み込む方式
    • 11.1.3 テーブル(RDB)から読み込む方式
  • 11.2 その他のプレゼンテーション層の設計パターン
    • 11.2.1 ファイルアップロード・ダウンロード
    • 11.2.2 入出力ストリームを利用した効率的なアップロードとダウンロード
    • 11.2.3 巨大な結果セットの画面出力

Part 3 クライアントサイドの設計パターン
第12章 クライアントサイドのアーキテクチャ概要

  • 12.1 クライアントサイドのアーキテクチャの変遷
  • 12.2 HTML5を中心としたクライアントサイドの新しいアプリケーションアーキテクチャ

第13章 Webページの設計パターン

  • 13.1 DHTMLとAjax
  • 13.2 DHTML+AjaxによるWebページの作成
    • 13.2.1 jQueryの利用
    • 13.2.2 テンプレートの利用
    • 13.2.3 WebアプリケーションにDHTML+Ajaxを適用する場合の注意点
  • 13.3 Webページの操作性・利便性を向上させるための設計パターン
    • 13.3.1 検証のパターン
    • 13.3.2 テーブルソートの設計パターン
    • 13.3.3 セレクトボックス連動の設計パターン
    • 13.3.4 入力値を送信するときに確認を行う設計パターン
    • 13.3.5 入力フィールドを動的に追加する設計パターン
    • 13.3.6 ファイルアップロードの設計パターン
    • 13.3.7 複数サブミットを抑止する設計パターン
  • 13.4 サーバプッシュ
    • 13.4.1 ポーリング方式
    • 13.4.2 ロングポーリング方式
    • 13.4.3 WebSocket 方式
  • 13.5 CSSによるWebページのレイアウト設計パターン

第14章 シングルページアプリケーションの設計パターン

  • 14.1 シングルページアプリケーションと従来型Webアプリケーション
  • 14.2 SPAの設計パターン
    • 14.2.1 SPAの機能配置
    • 14.2.2 SPAのコンポーネント設計パターン
  • 14.3 jQueryのみで構築するケース
  • 14.4 MVxパターンのフレームワークを利用するパターン
    • 14.4.1 MVxパターンの特徴
    • 14.4.2 Backbone.jsによるMVxパターン
    • 14.4.3 Backbone.jsによる「人員管理アプリケーション」
  • 14.5 MVVMパターンのフレームワークを利用するパターン
    • 14.5.1 MVVMパターンとKnockout.js
    • 14.5.2 Knockout.jsによる「人員管理アプリケーション」
  • 14.6 SPAのルーティング
    • 14.6.1 ルーティングとは
    • 14.6.2 ハッシュフラグメントを利用するパターン
    • 14.6.3 History APIを利用するパターン
    • 14.6.4 Backbone.jsにおけるルーティング
  • 14.7 SPAの設計パターン総括

Part 4 バッチ処理の設計パターン
第15章 バッチ処理の概要

  • 15.1 バッチ処理の必然性
  • 15.2 バッチ処理における基幹系システム・情報系システム

第16章 オフラインバッチアプリケーションの設計パターン

  • 16.1 オフラインバッチの共通的な設計上の要点
    • 16.1.1 バッチ処理のデータストア
    • 16.1.2 ジョブと順序制御
    • 16.1.3 バッチ処理におけるトランザクション管理
    • 16.1.4 バッチ処理リラン時の制御
    • 16.1.5 入力データの検証とエラーハンドリング
    • 16.1.6 バッチ処理におけるパフォーマンス向上
  • 16.2 バッチ処理(オンラインバッチ)の設計パターン
  • 16.3 SQLでバッチ処理を行うパターン(1)更新系
    • 16.3.1 SQLによるデータ一括更新
    • 16.3.2 SQLによるデータ差分更新
  • 16.4 SQLでバッチ処理を行うパターン(2)分析処理系
    • 16.4.1 SQLによる分析処理の設計パターン
    • 16.4.2 SQLによる条件分岐
  • 16.5 スタンドアローン型アプリケーションでバッチ処理を行うパターン
    • 16.5.1 スタンドアローン型アプリケーションによるバッチ処理の実装例
    • 16.5.2 スタンドアローン型アプリケーションによるバッチ処理のトレードオフ
  • 16.6 バッチフレームワークを利用するパターン
    • 16.6.1 バッチフレームワークとJava Batch
    • 16.6.2 Java Batchによる実装例
    • 16.6.3 Java Batchのトレードオフ
  • 16.7 ETLツールを利用するパターン
    • 16.7.1 ETLツールとは
    • 16.7.2 ETLツールの優位性と考慮点

第17章 オンラインバッチとディレードオンラインの設計パターン

  • 17.1 オンラインバッチ
    • 17.1.1 オンラインバッチとは
    • 17.1.2 オンラインバッチの具体例
  • 17.2 ディレードオンライン処理
    • 17.2.1 ディレードオンライン処理とは
    • 17.2.2 メッセージキューイングによるディレードオンライン処理
    • 17.2.3 RDBによるメッセージキューイング

第18章 ビッグデータ技術による分散並列バッチ処理

  • 18.1 Hadoopによる分散並列バッチ処理の設計
    • 18.1.1 Apache Hadoopとは
    • 18.1.2 Hadoopのアーキテクチャ
    • 18.1.3 MapReduceフレームワークによる分散並列バッチ処理
  • 18.2 Hiveによる分散並列バッチ処理
    • 18.2.1 Apache Hiveとは
    • 18.2.2 Hiveによる分散並列バッチ処理
  • 18.3 Sparkによる分散並列バッチ処理
    • 18.3.1 Apache Sparkとは
    • 18.3.2 Sparkのアーキテクチャ
    • 18.3.3 Sparkによる分散並列バッチ処理

Part 5 システム間連携の設計パターン
第19章 システム間連携の概要

  • 19.1 システム間連携の概要と設計パターン
  • 19.2 データ共有型パターン
  • 19.3 データ非共有型パターン
    • 19.3.1 データ非共有型パターンの特徴
    • 19.3.2 バッチ型連携~ファイル転送
    • 19.3.3 リアルタイム型連携~アプリケーション連携とメッセージング

第20章 アプリケーション連携の設計パターン

  • 20.1 アプリケーション連携の概要
    • 20.1.1 アプリケーション連携とは
    • 20.1.2 アプリケーション連携の分類
  • 20.2 RESTサービス
    • 20.2.1 RESTサービスとは
    • 20.2.2 RESTfulサービスの設計思想①~HTTPの使い方
    • 20.2.3 RESTfulサービスの設計思想②~統一インタフェース
  • 20.3 JAX-RSによるRESTサービス構築
    • 20.3.1 JAX-RSによるRESTサービスの仕組み
    • 20.3.2 リソースメソッドにおける様々なパラメータの受け取り方
    • 20.3.3 リソースメソッドにおける様々なレスポンスの返し方
    • 20.3.4 RESTfulサービスの設計思想に則ったサービスの構築
    • 20.3.5 フィルタ
    • 20.3.6 エンタープライズにおけるRESTfulサービスの適用方針
  • 20.4 分散オブジェクト技術とEJBリモート呼び出し
    • 20.4.1 分散オブジェクト技術の種類と利点
    • 20.4.2 EJBリモート呼び出し
  • 20.5 SOAP Webサービスと要素技術
    • 20.5.1 SOAP Webサービスとは
    • 20.5.2 SOAPとWSDL
  • 20.6 JAX-WSとSOAP Webサービス
    • 20.6.1 JAX-WSによるSOAP Webサービス構築の概要
    • 20.6.2 プロバイダとリクエスタの具体的な作成
    • 20.6.3 サービスメソッドの呼び出し方式の分類
    • 20.6.4 一方向型・非同期型のサービス構築方法
    • 20.6.5 JAX-WSとSOAPフォールト
    • 20.6.6 MTOMによるストリーム処理
    • 20.6.7 SOAP WebサービスとRESTサービスの使い分け
  • 20.7 アプリケーション連携における整合性の確保
    • 20.7.1 システム全体を先進めする考え方
    • 20.7.2 システム全体を巻き戻す考え方

第21章 メッセージングの設計パターン

  • 21.1 メッセージングの設計パターン概要
  • 21.2 JMSによる基本的なメッセージング
    • 21.2.1 JMSの仕組み
    • 21.2.2 キューを利用したポイント・ツー・ポイント型のメッセージング
    • 21.2.3 トピックを利用したパブリッシュ・サブスクライブ型のメッセージング
  • 21.3 JMSによる高度なメッセージング
    • 21.3.1 メッセージセレクタによるメッセージの絞り込み
    • 21.3.2 返信用のキューと相関IDを利用した非同期型呼び出し
    • 21.3.3 ウェイトセットを利用した同期化
  • 21.4 JMSにおけるメッセージ配信の保証
    • 21.4.1 コンシューマにおけるメッセージの配信完了通知
  • 21.5 JMSにおけるトランザクション管理
    • 21.5.1 JMSにおけるトランザクション管理の基本
    • 21.5.2 メッセージ駆動Beanの利用
    • 21.5.3 JMSと分散トランザクション

Appendix

  • Appendix 1 クラス一覧
  • Appendix 2 参考文献一覧