web-dev-qa-db-ja.com

サービスレイヤーとDAO-なぜ両方なのか?

私はSpringMVC、Hibernate、および一部のデータベースをJava Webアプリケーションの例で使用しています。

これを行うものはいくつかありますが、これは Spring 3と例のあるhibernate統合チュートリアル には、モデルクラス、ビュー(jsp)、およびコントローラーのサービスクラスとdaoクラスがあります。

私の質問は、サービスとDAOクラスの両方が同じことをしないのですか?なぜ両方必要なのですか?

これは私が実際に使用していたチュートリアルでした: http://fruzenshtein.com/spring-mvc-security-mysql-hibernate/

68
Jeff

一般に、DAOは可能な限り軽量であり、DBへの接続を提供するためにのみ存在し、異なるDBバックエンドを使用できるように抽象化されることもあります。

サービス層は、DAOおよびクライアントとの間で送受信されるデータを操作するロジックを提供するために存在します。多くの場合、これらの2つの部分は同じモジュールにバンドルされ、場合によっては同じコードにバンドルされますが、それらは依然として別個の論理エンティティとして表示されます。

もう1つの理由はセキュリティです。DBとは関係のないサービスレイヤーを提供すると、サービスを介さない限り、クライアントからDBにアクセスすることが難しくなります。クライアントからDBに直接アクセスできない場合(そしてサービスとして機能する簡単なDAOモジュールがない場合)、クライアントを乗っ取った攻撃者はすべて、サービスレイヤーをハッキングしようとするだけで、データへの最も無害なアクセス。

61
gbjbaanb

私は問題の投稿のライターです。私は、さまざまなテクノロジーやアーキテクチャに取り組んでいるというかなりのシェアを持っています。以上のことから、サービス層とdao層は常に良い考えであると言えます。 DAOは、Entityオブジェクトをデータベースに追加/データベースから追​​加/更新/挿入/選択するだけに制限する必要があります。それだけです。ロジックに関して追加の処理を行う場合は、それをサービスレイヤーに追加します。これにより、コードがモジュール化され、データベースの置き換え時に(データの一部について)簡単に置き換え可能になります。これは、データベースからデータをフェッチした後でもロジックが重いレポートを含むアプリケーションに特に適用されます。

また、春にはセキュリティが理想的にサービス層に適用されます。この方法を変更したくありません。

42
lokesh

Adam Bienは、本の中でJPA EntityManagerがDAOの優れた普遍的な実装であることを指摘しています。

http://realworldpatterns.com/

Java EEの世界では、JPA実装に含まれているため、独自のDAOを記述する必要はほとんどありません。サービス層を記述するだけで済みます。

独自のDAOレイヤーを実装することは、実際には15年前の非常に貧弱なJ2EEアーキテクチャからの二日酔いですが、多くの人々は依然としてそれを行うよう強いられています。これらのカスタムDAOレイヤーは、EntityManagerの対応するメソッドを呼び出す転送機能以外に何も提供しません。

したがって、質問に答えるには、はい、サービスレイヤーとDAOが必要ですが、サービスレイヤーを作成するだけで済みます。

12
Dean Schulze

私は通常、すべてのdb固有のコード(クエリ)をDAOおよびトランザクション処理とサービスのビジネスロジックに配置します。これにより、サービスメソッドは複数のDAOにわたってメソッドを呼び出し、すべてを同じトランザクション内に保持できます。私の意見では、これにより、DAO全体でのコードの再利用が改善されます。

4
sbrattla

ほとんどの場合、サービスレイヤーによって不要な複雑さが追加されることがわかりました。理論的には、daoレイヤーにビジネスロジックが含まれないようにすることですが、最終的には混乱を招くだけです。一部の人々でさえ、DAOレイヤーを完全に削除することを怠っており、価値がないと感じています。 http://ayende.com/blog/4784/architecting-in-the-pit-of-Doom-the-evils-of-the-repository-abstraction-layer

しかし、もしあなたが複数のビジネスロジックを持っているなら、はいそれは良い考えです。 サービス層を作成することはどれほど重要ですか?

2
Jesus