サービスレイヤーとDAO —なぜ両方ですか?


64

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

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

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

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

回答:


60

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

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

もう1つの理由はセキュリティです。DBとは関係のないサービスレイヤーを提供する場合、サービス以外を介してクライアントからDBにアクセスすることはより困難になります。DBがクライアントから直接アクセスできない場合(およびサービスとして動作する些細なDAOモジュールがない場合)、クライアントを引き継いだ攻撃者ができることは、サービスレイヤーをハッキングすることだけです。データへの最も衛生的なアクセス。


1
サービス層とdao層、およびビジネスロジックを含むサービス層の分離に同意します。
ピーターデラニー

1つのサービスが複数のDAOを呼び出す可能性があることは言うまでもありません。たとえば、ユーザーを保存するときにUserDao、UserOrdersDaoなどと話すことができます。または、それぞれに対して1つのサービスを作成する必要がありますか?そして、誰がこれらのサービスをすべて呼び出すことができますか?
フェルミンシルバ

40

私は問題の投稿の作家です。私は、さまざまなテクノロジーとさまざまなアーキテクチャに取り組んでいます。上記に基づいて、サービス層とdao層を持つことは常に良い考えだと安全に言うことができます。DAOは、データベースへの/からのエンティティオブジェクトの追加/更新/挿入/選択のみに制限する必要があります。ロジックに関して特別なことをしたい場合は、サービスレイヤーに追加します。これは、コードをモジュール化し、データベースを(データの一部について)交換するときに簡単に交換できるようにするのに役立ちます。これは、データベースからデータをフェッチした後でも重いロジックを持つレポートを含むアプリケーションに特に適用されます。

また、春には、セキュリティがサービス層で理想的に適用されます。このように変更したくないでしょう。


5
ねえ、私の質問に返信してくれてありがとう。それはあなたのブログへの献身です!素晴らしい例をありがとう、書き続けてください。
ジェフ14

これはしばらくの間私の頭を悩ませていましたが、これらの状況では経験が最も役立つと思います。ありがとうございました。
UtkuÖzdemir14年

サービス層とdao層、およびビジネスロジックを含むサービス層の分離に同意し、Daoメソッドのみを呼び出します。サービスメソッドの1つが別のサービスメソッドを呼び出す必要がある場合はどうでしょうか。複数のサービスメソッドを呼び出すサービスレイヤーの上に別の抽象化が必要ですか?
ピーターデラニー

いいえ。サービス層のクラスは、(必要に応じて)相互の参照を持つことができ、必要なメソッドを呼び出すことができます。
ロケシュ

11

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

http://realworldpatterns.com/

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

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

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


2
これがSpringに当てはまるかどうかはわかりません。モデル用に作成する必要があるカスタムDAO が常にあります。「独自のDAOを記述する必要はほとんどない」という文言は、特にEJBコンテナ/アプリケーションサーバーに当てはまりますか?
ドンチードル

1
独自の(DAO / DAOImpl)を記述する方が良いですが、EntityManagerにのみマップされます-将来、サービス層コードを変更せずに別のDAO実装追加できるためです
ahmednabil88

@YajliMaclo変更点の違いは何ですか?
Alex78191

4

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


2

ほとんどの場合、サービス層が不必要な複雑さを追加することがわかりました。理論的には、ビジネスロジックをdaoレイヤーに配置することを避けることですが、最終的にこれは混乱を招くだけです。http://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

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


3
私はAyendeのブログ投稿を何度も読みましたが、YAGNIの精神に忠実である彼のデザイン(私はある時点で同意していました)は、そもそもレイヤーの抽象化を設定するのにかかる費用よりも中期的です。単一のアプリケーションが複数のSQL、NoSQL、およびAPIデータソースを照会することがより一般的になった今、彼はアプリケーション全体とNHibernateの間の密結合に関する彼の意見を変えたのだろうか。
コチェッセ氏13

@LennyGodberはい、私はそれが欠点より利点を持っているとして、あなたが言っていたとして、複数のデータソースを持っていることは非常に一般的ですので、ので、あなたの気持ちはIMO DAO /リポジトリ層を持っている方が良いです知っている
イエス

-1

IMHOサービス層は、コントローラーとDAO層の間の層と考えることができます。このサービスレイヤーは、ビジネスロジックを追加したり、ビューでレンダリングする必要のあるものに固有の戻りオブジェクトを作成したりできる場所です。

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