web-dev-qa-db-ja.com

リポジトリとサービスレイヤーの違い

関連するいくつかの質問を調べましたが、それでもリポジトリとサービスレイヤーの間に大きな違いは見られません。例を挙げれば、このように見えるはずですが、そうでない場合は、理由を教えてください。

public interface ProductRepository extends CrudRepository<Product, Long>{

    public List<Product> findByName(String name);
    public List<Product> findByPrice(Double price);
}

public interface ProductService {

    public List<Product> findAll();
    public Product findById(Long id);
    public Product save(Product product);
    public void delete(Product product);
    public List<Product> findByName(String name);
    public List<Product> findByPrice(Double price);
}

productServiceの実装では、ProductRepositoryを使用してメソッドを実装します。私が理解しているように http://docs.spring.io/spring-data/jpa/docs/1.3.0.RELEASE/reference/html/jpa.repositories.html からのメソッドのクエリリポジトリは自動生成されます。私の例では、リポジトリとサービスでメソッドが繰り返されているので、何を/なぜ変更する必要があるのか​​説明してください。

12
April

すべてのビジネスロジックはサービス層にある必要があります。

データベース(任意のストレージ)へのアクセスは、リポジトリレイヤーに移動する必要があります。

例を見てみましょう。エンティティ(Person)を保存する必要があります。ただし、Personを保存する前に、PersonのFirstNameがまだ存在していないことを確認する必要があります。

したがって、検証部分はビジネス層に移動する必要があります。

サービスレイヤー内

PersonRepository repository; 
public Person save(Person p){
   Person p = findByName(p.getName();
   if (p != null){
          return some customException();
   }
   return repository.save(p); 
}

public Person findByName(String name){
     return repository.findByName(name);
}

そして、リポジトリレイヤーでは、DB操作に集中するだけです。

これは、リポジトリレイヤー自体で行うことができます。これをリポジトリに実装したとすると、保存方法は保存する前に常にチェックします(必要がない場合もあります)。

11
Mani

リポジトリレイヤーは、データアクセスに対する追加レベルの抽象化を提供します。リポジトリレイヤーは、基本的なCRUD操作を公開します。

サービス層は、リポジトリを使用するビジネスロジックを公開します。

あなたはここでより詳細な答えを読むことができます: https://stackoverflow.com/a/5049454/1446006

6
Martin

リポジトリは、データ転送オブジェクトがCRUD操作を管理するリポジトリオブジェクトに渡されるデータアクセスパターンです。このパターンは、データアクセスのメカニズムが大幅に変更される可能性がある状況で役立ちます。ある実装ではOracle、別の実装ではSQL Server、さらにはHADOOPなどのさまざまなデータストアが必要です。

サービスレイヤーは、SaaSアーキテクチャで一般的に使用されるビジネスロジックパターンです。サービスレイヤーを使用すると、1つ以上のプレゼンテーション実装が共通のインターフェイスを介してビジネスロジックにアクセスできます。たとえば、必要に応じてWebサイトにAPIを含めるには、サービスレイヤーを使用して、サイトとAPIの両方が使用する共通のバックエンド機能を実装します。

前者は主にデータアクセスに関係し、後者はビジネスロジックに関係する必要があります。必須ではなく、一方が他方に同行する必要もありません。単純なアプリケーションでは、両方のパターンを同じクラスで実装できます。

3
Jay

私の知る限り、リポジトリはデータベースに直接アクセスするためのものです。これは、ストアドプロシージャまたはデータストレージメカニズムへの直接呼び出しが行われる場所です。

サービスレイヤーは、データへのAPIです。通常、聞こえるロジックレベル、またはサービスとリポジトリの間の別の抽象化レイヤーがあります。

たとえば、Webサイトはサービスのメソッドを呼び出します。サービスはそのデータを取得するためにリポジトリを呼び出し、次にサービスはそれを何らかの方法で変換し(オブジェクトの構築、ビジネスルールに基づいた動的情報の生成など)、それをWebサイトに戻します。

1
JasonWilczak