Java Webアプリケーションに使用するアーキテクチャについて説明してください。[閉まっている]


146

JavaベースのWebアプリケーションアーキテクチャを共有しましょう!

Javaを使用して実装されるWebアプリケーションには、さまざまなアーキテクチャが数多くあります。この質問への回答は、さまざまなWebアプリケーション設計のライブラリとして役立ち、長所と短所があります。答えは主観的なものになると思いますが、できる限り客観的になるようにして、リストする長所と短所に動機を与えましょう。

アーキテクチャの説明に使用する詳細レベルを使用してください。答えが価値のあるものになるためには、少なくとも、あなたが説明するアーキテクチャで使用される主要なテクノロジーとアイデアを説明する必要があります。そして最後に重要なことですが、いつあなたのアーキテクチャを使うべきですか?

始めます...


アーキテクチャの概要

Java EE、Java Persistence API、サーブレット、Javaサーバーページなど、Sunのオープンスタンダードに基づく3層アーキテクチャを使用しています。

  • 持続性
  • ビジネス
  • プレゼンテーション

レイヤー間の可能な通信フローは次のように表されます。

Persistence <-> Business <-> Presentation

たとえば、プレゼンテーション層が永続化操作を呼び出したり実行したりすることはなく、常にビジネス層を通じて実行されます。このアーキテクチャは、高可用性Webアプリケーションの要求を満たすことを目的としています。

持続性

作成、読み取り、更新、削除(CRUD)の永続化操作を実行します。今回のケースでは(Java Persistence API)JPAを使用しており、現在、Hibernateを永続性プロバイダーとして使用し、そのEntityManagerを使用しています。

このレイヤーは複数のクラスに分割され、各クラスは特定のタイプのエンティティ(つまり、ショッピングカートに関連するエンティティが単一の永続クラスによって処理される場合があります)を扱い、1人のマネージャーだけが使用します。

また、この層はまた、格納JPAエンティティのようなものですAccountShoppingCartなど

ビジネス

Webアプリケーション機能に関連付けられているすべてのロジックは、このレイヤーにあります。この機能は、自分のクレジットカードを使用してオンラインで製品の支払いを希望する顧客の送金を開始する場合があります。新しいユーザーを作成したり、ユーザーを削除したり、Webベースのゲームでの戦闘の結果を計算したりすることもできます。

この層は、複数のクラスに分割され、これらのクラスの各々を用いて注釈さ@StatelessになるようにステートレスセッションBean(SLSB)。各SLSBはマネージャーと呼ばれ、たとえば、マネージャーはと呼ばれるように注釈が付けられたクラスである場合がありますAccountManager

AccountManagerCRUD操作を実行する必要がある場合AccountManagerPersistence、永続化レイヤーのクラスであるのインスタンスを適切に呼び出します。の2つの方法の概略AccountManagerは次のようになります。

...
public void makeExpiredAccountsInactive() {
    AccountManagerPersistence amp = new AccountManagerPersistence(...)
    // Calls persistence layer
    List<Account> expiredAccounts = amp.getAllExpiredAccounts();
    for(Account account : expiredAccounts) {
        this.makeAccountInactive(account)
    }
}
public void makeAccountInactive(Account account) {
    AccountManagerPersistence amp = new AccountManagerPersistence(...)
    account.deactivate();
    amp.storeUpdatedAccount(account); // Calls persistence layer
}

コンテナーマネージャートランザクションを使用するため、自分自身のトランザクション境界設定を行う必要はありません。基本的に内部では、SLSBメソッドに入るときにトランザクションを開始し、メソッドを終了する直前にコミット(またはロールバック)します。これは構成に関する規約の例ですが、デフォルトであるRequired以外はまだ必要ありません。

SunのJava EE 5チュートリアルで、Enterprise JavaBeans(EJB)に必要なトランザクション属性について説明しています

クライアントがトランザクション内で実行され、エンタープライズBeanのメソッドを呼び出す場合、メソッドはクライアントのトランザクション内で実行されます。クライアントがトランザクションに関連付けられていない場合、コンテナはメソッドを実行する前に新しいトランザクションを開始します。

必須属性は、コンテナ管理のトランザクション境界で実行されるすべてのエンタープライズBeanメソッドの暗黙的なトランザクション属性です。別のトランザクション属性をオーバーライドする必要がない限り、通常はRequired属性を設定しません。トランザクション属性は宣言型であるため、後で簡単に変更できます。

プレゼンテーション

私たちのプレゼンテーション層は...プレゼンテーションを担当しています!これはユーザーインターフェイスを担当し、HTMLページを作成し、GETおよびPOSTリクエストを通じてユーザー入力を受信することにより、ユーザーに情報を表示します。現在、古いServletと Java Server Pages(JSP)の組み合わせを使用しています。

レイヤーは、ビジネスレイヤーのマネージャーのメソッドを呼び出して、ユーザーが要求した操作を実行し、Webページに表示する情報を受け取ります。ビジネス層から受け取った情報は、Stringintegers ほど複雑ではないタイプの場合もあれば、JPAエンティティーの場合もあります。

アーキテクチャの長所と短所

長所

  • この層で永続化を行う特定の方法に関連するすべてのものがあるということは、ビジネス層で何かを書き直す必要なしに、JPAの使用から別のものへの交換ができることだけを意味します。
  • プレゼンテーションレイヤーを別のレイヤーに交換するのは簡単です。より良いものが見つかれば、そうなる可能性があります。
  • EJBコンテナにトランザクション境界を管理させるのは素晴らしいことです。
  • サーブレットの+ JPAの使用は簡単で(そもそも)、テクノロジは広く使用され、多くのサーバーに実装されています。
  • Java EEを使用すると、負荷分散フェイルオーバーを備えた高可用性システムを簡単に作成できるようになります。どちらも必要だと感じています。

短所

  • JPAを使用する@NamedQueryと、JPAエンティティクラスのアノテーションを使用して、よく使用するクエリを名前付きクエリとして保存できます。私たちのアーキテクチャーのように、永続性クラスで永続性に関連するものをできるだけ多く持っている場合、これにより、JPAエンティティーを含めるためのクエリが見つかる可能性のある場所も広がります。永続化操作の概要を把握することが難しくなり、維持することが難しくなります。
  • 永続化レイヤーの一部としてJPAエンティティーがあります。しかしAccount、そしてShoppingCart、彼らは本当にビジネスオブジェクトではありませんか?これらのクラスに触れて、JPAが処理方法を知っているエンティティーに変換する必要があるため、この方法で行われます。
  • ビジネスオブジェクトでもあるJPAエンティティは、値オブジェクト(VO)としても知られるデータ転送オブジェクト(DTO)のように作成されます。ビジネスオブジェクトにはアクセサメソッドを除いて独自のロジックがないため、これは貧血ドメインモデルになります。すべてのロジックは、ビジネスレイヤーのマネージャーによって行われるため、より手続き型のプログラミングスタイルになります。それは良いオブジェクト指向のデザインではありませんが、多分それは問題ではありませんか?(結局のところ、オブジェクト指向は、結果をもたらしたプログラミングパラダイムだけではありません。)
  • EJBとJava EEを使用すると、少し複雑になります。また、純粋にTomcatを使用することはできません(EJBマイクロコンテナーの追加は、純粋に Tomcatではありません)。
  • サーブレットとJPAの使用には多くの問題があります。これらの問題の詳細については、Googleを使用してください。
  • ビジネスレイヤーを終了するとトランザクションが閉じられるためfetch=FetchType.LAZY、プレゼンテーションレイヤー内から(を使用して)必要なときにデータベースからロードするように構成されているJPAエンティティから情報をロードすることはできません。例外が発生します。これらの種類のフィールドを含むエンティティを返す前に、関連するゲッターを呼び出す必要があります。別のオプションは、Java Persistence Query Language(JPQL)を使用して行うことFETCH JOINです。ただし、これらのオプションはどちらも少し面倒です。

1
あなた自身の答えであなたがバーを高く設定し過ぎているようです-他の人を落胆させたかもしれません:)
Jonik

5
また、おそらくあなたの見解は、質問の一部ではなく、通常の答えである必要があります。そうすれば、他の答えと一緒に投票できますか?
ジョニック2009年

この質問はメタで参照されています
D4V1D 2015年

回答:


20

わかりました(短い)1つを行います:

  • フロントエンド:タペストリー(3つは古いプロジェクト、5つは新しいプロジェクト)
  • ビジネス層:春
  • DAO:イバティス
  • データベース:Oracle

Spingトランザクションサポートを使用して、サービスレイヤーに入るとトランザクションを開始し、DAO呼び出しまで伝搬します。サービス層は最もビジネスモデルの知識があり、DAOは比較的単純なCRUD作業を行います。

いくつかのより複雑なクエリは、パフォーマンス上の理由から、バックエンドのより複雑なクエリによって処理されます。

私たちのケースでSpringを使用する利点は、Spring Proxyクラスの背後にある国/言語に依存するインスタンスを持つことができることです。セッションのユーザーに基づいて、電話をかける際に正しい国/言語の実装が使用されます。

トランザクション管理はほぼ透過的であり、実行時例外でロールバックされます。チェックされていない例外を可能な限り使用します。以前はチェック例外を実行していましたが、Springの導入により、非チェック例外の利点がわかり、可能な場合にのみ例外を処理します。それは、多くの定型的な「キャッチ/再スロー」または「スロー」のものを避けます。

申し訳ありませんが、あなたの投稿よりも短くなっています。これが面白いと思いますか...


素敵な答え!このスレッドは一部のトラフィックを引き付けているようです。他の人々は自分のアーキテクチャを説明する時間がないと気の毒に思うか、参加しない理由が他にもあります。

19

今日の理想的なJavaベースのWeb開発テクノロジー。

Webレイヤー:

HTML + CSS + Ajax + JQuery

RESTFul Webコントローラー/アクション/リクエスト処理レイヤー:

Playフレームワーク

ビジネスロジック/サービスレイヤー:

可能な限りPure Javaコードを使用してください。ここでWebサービスの融合を行うことができます。

XML / JSonデータ変換レイヤー:

XMLTool(Googleコードで検索)、JSoup、Google GSon、XStream、JOOX(Googleコードで検索)

持続性レイヤー:

CRUD:JPAまたはSienaProjectまたはQueryDSL /複雑なクエリ:JOOQ、QueryDSL


9

これが私の5セントです

プレゼンテーション

Android、Angular.JS WebClient、OAUTHv2

API

REST、ジャージー(JAX-RS)、ジャクソン(JSONデシリアライズ)、DTOオブジェクト(ビジネスロジックモデルとは異なる)

ビジネスの論理

DIおよびイベント処理のための春。モデルオブジェクトのDDD風のアプローチ。実行時間の長いジョブは、worker-modulesのSQSでオフロードされます。

DAO

エンティティを格納するためのSpring JDBCテンプレートを含むリポジトリモデル。順序付きリストを使用したリーダーボード用のRedis(JEDIS)。トークンストア用のMemcache。

データベース

MySQL、Memcached、Redis


これは、私たちのプロジェクトでもフォローしているものと似ています。さらに、JBPM for businessワークフロー。なぜ春がないのかしら?
ininprsr

私は現在のアーチで更新を行う必要があります。現在、データアクセスレイヤーにはSpring DIおよびJDBCテンプレートを使用しています。
ペプスター

6

私たちのプロジェクトでは、次のことを行っています。

フロントエンドテクノロジー

  • AngularJS
  • HTML5
  • css3
  • JavaScript
  • ブートストラップ3

API

  1. 残り
  2. JERSEY(JAX-RS)
  3. 安心してください
  4. スプリングブーツ
  5. ジャクソン
  6. 春の安全

ビジネスの論理

  • 春のデータ

  • SPRINGデータMongoDB

データベース

  • MongoDB

サーバー(キャッシュ用)

  • redis

4

通常のStruts-Spring-Hibernateスタックを引き続き使用しています。

今後のアプリについては、Spring Web Flow + Spring MVC + HibernateまたはSpring + Hibernate + Flexフロントエンド付きWebサービスを検討しています。

私たちのアーキテクチャの明確な特徴はモジュール化です。いくつかのモジュールがあり、一部はデータベース内の3から最大30のテーブルで始まります。ほとんどのモジュールは、ビジネスプロジェクトとWebプロジェクトで構成されています。ビジネスプロジェクトはビジネスと永続化ロジックを保持し、Webはプレゼンテーションロジックを保持します。
論理レベルでは、ビジネス、永続性、プレゼンテーションの3つのレイヤーがあります。
依存関係:
プレゼンテーションはビジネスと持続性に依存します。
持続性はビジネスに依存します。
ビジネスは他のレイヤーに依存していません。

ほとんどのビジネスプロジェクトには3種類のインターフェイスがあります(注:GUIではなく、プログラムによるJavaインターフェイスレイヤーです)。

  1. プレゼンテーションがクライアントとして使用しているインターフェース
  2. 他のモジュールがモジュールのクライアントであるときに使用しているインターフェース。
  3. モジュールの管理目的で使用できるインターフェース。

多くの場合、1は2を拡張します。これにより、モジュールの実装を別の実装に簡単に置き換えることができます。これにより、さまざまなクライアントを採用し、より簡単に統合できます。一部のクライアントは特定のモジュールのみを購入するため、既存の機能を統合する必要があります。インターフェース層と実装層が分離されているため、依存するモジュールに影響を与えることなく、特定のクライアント用のアドホックモジュール実装を簡単に展開できます。また、Spring Frameworkを使用すると、さまざまな実装を簡単に注入できます。

私たちのビジネス層はPOJOに基づいています。私が観察している傾向の1つは、これらのPOJOがDTOに似ていることです。私たちは貧血領域モデルに苦しんでいます。なぜこれが起こっているのかはよくわかりませんが、多くのモジュールの問題ドメインが単純であること、ほとんどの作業がCRUDであること、またはロジックを別の場所に配置することを好む開発者が原因である可能性があります。


3

これが私が取り組んだもう1つのWebアーキテクチャです。

主な要件の1つは、アプリケーションがモバイル/その他のデバイスをサポートすることでした。また、アプリケーションは、テクノロジーの選択の変更に拡張可能または柔軟である必要があります。

プレゼンテーション層:

  • JSP / JQuery(クライアント側MVC)
  • ネイティブAndroid
  • ネイティブiPhone
  • モバイルWeb(HTML5 / CSS3 /レスポンシブデザイン)

  • Spring RESTコントローラー(JAX-RSに変更可能)

ビジネスサービス層:

Spring @Service(ステートレスEJBに変更可能)

データアクセス層:

Spring @Repository(ステートレスEJBに変更可能)

リソース層:

Hibernate(JPA)エンティティ(任意のORMに変更できます)

このアーキテクチャに従う本の詳細については、こちらをご覧ください


2

私見、私たちのほとんどは共通点があります。少なくともバックエンドには、何らかの形のIOC / DIコンテナーと永続化フレームワークがあります。個人的には、GuiceとMybatisを使用しています。違いは、ビュー/ UI /プレゼンテーションレイヤーの実装方法にあります。ここには2つの主要なオプションがあります(それ以上かもしれません)..アクションベース(コントローラにマップされたURL)とコンポーネントベース。現在、コンポーネントベースのプレゼンテーションレイヤーを使用しています(改札を使用)。これは、URLやコントローラーではなく、コンポーネントやイベントを使用するデスクトップ環境を完全に模倣しています。現在、このURLコントローラーの種類のアーキテクチャに移行する必要がある理由を探しています(このようにして、このページに到達しました)。RESTfulアーキテクチャとステートレスアーキテクチャについての誇大宣伝の理由。

つまり、Guice IOCコンテナーの上にコンポーネント指向のフレームワークを使用してステートフルWebアプリケーションを記述し、Mybatisを使用してリレーショナルデータベースにデータを配置します。


1

少し異なりますが、ここではモジュール化されたJavaアーキテクチャを主張します。我々は持っています:

  1. Spring WS / Rest / JSPフロントエンド
  2. プレゼンテーションレイヤーロジックとSpringトランザクションを含むSpring MVC for businessサービスロジック
  3. コンポーネントサービス通信インターフェース。EJBを通じてビジネスサービスによってルックアップされます。EJBは、Springトランザクションに参加できる独自のトランザクション境界を設定します。
  4. コンポーネントサービスの実装、やはりSpringコンポーネント
  5. 統合レイヤー、データベース統合用のMyBatis、Webサービス統合用のSpring WS、他のサービス用の他の統合テクノロジー
  6. メインフレーム、データベース、他のサーバーの他のサービス...

上記に加えて、すべてのサービスに共通の機能プロバイダーである共有ライブラリモジュールがあります。

異なるレイヤーを使用することで、完全な分離と必要なモジュール性を実現できます。また、Springだけでなく、Java EEの機能も十分に活用できます。たとえば、必要に応じて、フロントエンドにJSFを使用することを妨げるものはありません。

OPによるアーキテクチャーの例と比較すると、これはひねりを加えていますが、3つではなく4つのメインレイヤーがあると表現できると思います。


0

私はその厳格なマネージャーパターンを使用するプロジェクトに取り組んできました。歴史的に、私はすべてがきちんとしたボックスに収まる厳密な階層の巨大な支持者でした。自分のキャリアが進むにつれ、多くの場合それが強制されることがわかります。アプリケーション設計に対してより機敏な考え方を採用することが、より良い製品につながると私は信じています。これは、目の前の問題を解決する一連のクラスを作成することによって意味します。「これとあれのためのマネージャーを作りましたか?」と言うのではなく、

現在取り組んでいるプロジェクトは、Spring MVCとRestEasyのJSON / Ajax呼び出しを組み合わせたWebアプリです。コントローラーに埋め込まれたサーバー側には、データベースへの直接アクセス、一部のEJBアクセス、および一部のSOAPベースのWebサービス呼び出しのためのJPA / Hibernateを備えた、ファサードベースの賢明なデータ層があります。これらすべてを結び付けるのは、JSONとしてシリアル化してクライアントに返すものを決定するカスタムJavaコントローラーコードです。

私たちはほとんど時間を費やして、Unix Design Philosophyの「Worse is Better」という考え方を採用する代わりに、いくつかの統一されたパターンを作成しようとしています。厳格な設計要件に準拠したものを構築するよりも、線の外を着色して賢明なものを構築する方がはるかに優れています。


0

Webアプリケーションアーキテクチャのコンポーネント次のとおりです。

1:ブラウザ:クライアントの相互作用

        HTML
        JavaScript
        Stylesheet

2:インターネット

3:Webサーバー

        CSS
        Image
        Pages(Java render )

4:アプリケーションサーバー

        App Webapp (Java interaction)
        Others WebApps

5:データベースサーバー

        Oracle, SQL, MySQL

6:データ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.