[スプリング動作]12はんのうデータりょう


  • 本章学習内容
    スプリングデータのアクティブレプリカ
    KasandraとMongoDBのアクティブなレポートの作成
    アクティビティの使用に適応するために非アクティブな返信を調整
  • データモデリング
    以前、SpringWebFluxを使用して、ブロックなし、応答なしのコントローラを作成する方法について説明しました.
    しかし、他の一緒に動作する素子もブロックされていなければ、本当のブロックレスコントローラになることはできません.
    ブロックされたコールバックに依存するSpringWebFlux応答コントローラを記述すると、コントローラはブロックされ、コールバックのデータ生成を待つ.
    したがって、コントローラからデータベースに至るまで、データストリーム全体がアクティブであり、ブロックされないことが重要です.
    12.1スプリングデータの活動概念を理解する
    SpringデータはKayリリースTrainからReactView Repositoryのサポートを開始します.
    Reactvie RepositoryはKasandra、モンゴルDB、Couchbase、Redisなどをサポートしています.
    ただし、標準的な非同期APIを提供しないため、RDBまたはJPAはサポートされていません.
    そこで,今後はカサンドラとモンゴDBを用いてspringデータ反応を利用する.
    スプリングデータ反応の概要
    Reactview Repositoryは、ドメインタイプまたはセットではなく、MonoまたはFluxをパラメータとして受信または返す方法を使用します.
    非アクティブタイプとアクティブタイプの間で変換
    既存のRDBを使用する場合でも、アクティブなプログラミングをアプリケーションに適用できます.
    RDBがブロックされていないアクティブクエリをサポートしない場合でも.
    まず、データをブロックしてインポートし、できるだけ早くアクティブなタイプに変換して、親構成部品にアクティブな利点を利用させることができます.
    例えば、RDBおよびSpringデータJPAが用いられる.この場合、Order Repositoryでは、次のフラグメソッドを使用できます.
    List<Order> findByUser(User user);
    このfindByUser()はブロックされて動作します.
    リストはアクティブなタイプではないため、アクティブな操作は実行できません.
    また、コントローラがfindByUser()を呼び出すと、結果は使用できなくなり、拡張性が向上しません.
    この場合、リストをReactiveではなくFluxにできるだけ早く変換して結果を処理します.
    List<Order> orders = repo.findByUser(someUser);
    Flux<Order> orderFlux = Flux.fromIterable(orders);
    Monoを使用する場合、以下のように書くことができます.
    Order order = repo.findById(id);
    Mono<Order> orderFlux = Mono.just(order);
    Monoのjust()またはFluxのfromIterable()、fromArray()およびfromStream()を使用します.
    再アクティブ化ではなく、リポジトリ内のブロックコードを分離し、アプリケーション内の任意の場所で再アクティブ化タイプを使用できます.
    今回は保存の様子を見てみます.
    MonoとFluxには、発行されたデータをドメインタイプまたはIterableタイプとして抽出する製品があります.
    Taco taco = tacoMono.block();
    tacoRepo.save(taco);
    Iterable<Taco> tacos = tacoFlux.toIterable();
    tacoRepo.saveAll(tacos);
    Monoのblock()またはFluxのtoIterable()は、抽出操作時にブロックされます.
    そのため,このモードを用いたMonoとFluxをできるだけ減らすべきである.
    ブロックされたタイプをより積極的に抽出することもできる.
    MonoまたはFluxを購読することで、発行された各要素に対して必要な操作を実行します.
    tacoFlux.subscribe(
            taco -> {
                tacoRepo.save(taco);
            }
    );
    tacorepoのsaveは依然としてブロック動作である.
    しかし、Reactive Subscribe()を使用してFluxまたはMonoが発行したデータを消費および処理する.
    ブロック方式の一括処理よりも望ましい.
    12.3 Active MongoDB Reportの作成
    NosqlのモンゴルDBは文書型DBです.
    Mongo DBはBSON形式でデータを格納します.
    他のデータベースからのクエリーデータと同様に、ドキュメントをクエリーまたは検索できます.
    モンゴルDBをspringデータとして使用する方法とJPAをspringデータとして使用する方法には大きな違いはありません.
    つまり、ドメインタイプをドキュメント構造にマッピングするプレゼンテーションをドメインクラスに指定します.
    そして、JPAと同じプログラミングモデルのRepositoryインタフェースを作成すればよい.
    SpringdataモンゴルDBをアクティブ化し、アクティブspringdataモンゴルDB起動プログラムへの依存性を追加します.
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
    </dependency>
    コンストラクションに依存性を追加すると、SpringデータアクティブモンゴルDBサポートを有効にするように自動的に構成されます.
    (Repositoryインタフェースの自動実装)
    Springdata mongodyは基本的に27017ポートをリスニングします.
    しかし、テストや開発を容易にするために、メモリ内蔵モンゴルDBを使用することもできます.
    次のように、Flapdoodle依存性を構築に追加します.
    <dependency>
       <groupId>de.flapdoodle.embed</groupId>
       <artifactId>de.flapdoodle.embed.mongo</artifactId>
    </dependency>
    ドメインタイプをドキュメントspring data mongodyにマッピングすることは、mongodyに格納されているドキュメント構造マッピングドメインタイプに役立つツールです.
    このうち、以下の3つが最もよく使われています.

  • @Id:ドキュメントIDとして属性を指定します.任意のシーケンス化タイプのプロパティを指定できます.

  • @Document:指定したドメインタイプをモンゴルDBに格納されているドキュメントとして宣言します.

  • @Field:属性をモンゴメリーDBのドキュメントに格納するフィールド名(および選択的順序)を指定します.
  • @Fieldが指定されていないドメインタイプの属性は、フィールド名と属性名が同じとみなされます.
    これらのコメントを使用してIngredientクラスを作成します.
    package tacos;
    
    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;
    
    import lombok.AccessLevel;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    import lombok.RequiredArgsConstructor;
    
    @Data
    @RequiredArgsConstructor
    @NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
    @Document
    public class Ingredient {
      
      @Id
      private final String id;
      private final String name;
      private final Type type;
      
      public static enum Type {
        WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
      }
    
    }
    TacoのモンゴルDBマッピングについて解説します.
    package tacos;
    
    import java.util.Date;
    import java.util.List;
    
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    
    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;
    import org.springframework.data.rest.core.annotation.RestResource;
    
    import lombok.Data;
    
    @Data
    @RestResource(rel = "tacos", path = "tacos")
    @Document
    public class Taco {
    
      @Id
      private String id;
      
      @NotNull
      @Size(min = 5, message = "Name must be at least 5 characters long")
      private String name;
      
      private Date createdAt = new Date();
      
      @Size(min=1, message="You must choose at least 1 ingredient")
      private List<Ingredient> ingredients;
    
    }
    Stringタイプの属性をIDとして使用すると、その属性値がDBに格納されると、モンゴルDBは自動的にID値を指定します.(空の場合のみ)
    次に、Repositoryインタフェースを作成します.
    Active MongoDB Replicatorインタフェースspring data MongoDBの作成
    Spring Data JPAと同様の自動レポートサポートを提供します.
    モンゴメリーデータベースのReactview Repositoryを作成する場合は、ReactiveCrudRepositoryまたはReactiveMongoRepositoryを選択できます.
    ReactiveCrudRepositoryは、新しいドキュメントまたは既存のドキュメントのsave()メソッドに依存します.
    ReactiveMongoRepositoryは、新しいドキュメントを格納するために最適化された少数の特殊な挿入()方法を提供します.
    まず、Ingredentオブジェクトをドキュメントとして保存するRepositoryを定義します.
    保存した食材のドキュメントは、初期に食材データをDBに追加したときに生成されたもので、それ以外はほとんど追加されていません.
    したがって、新しいドキュメントのストレージ最適化のReactiveMongoRepositoryと比較して、ReactiveCrudRepositoryを拡張する必要があります.
    package tacos.data;
    
    import org.springframework.data.repository.reactive.ReactiveCrudRepository;
    import org.springframework.web.bind.annotation.CrossOrigin;
    
    import tacos.Ingredient;
    
    @CrossOrigin(origins="*")
    public interface IngredientRepository extends ReactiveCrudRepository<Ingredient, String> {
    
    }
    IngredentRepositoryはReactiveRepositoryです.
    このメソッドでは、ドメインタイプまたはコレクションではなくFluxまたはMonoタイプを使用してドメインオブジェクトを処理します.
    たとえば、findAll()メソッドは、IterableではなくFluxを返します.
    次にfindById()メソッドはOptionalではなくMonoを返します.
    したがって、このアクティビティレポートは、エンドツーエンドのアクティビティフローの一部である可能性があります.
    次に、TacoオブジェクトをMongoDBとして保存するRepositoryを定義します.
    カラードキュメントとは異なり、タワードキュメントは常に生成されます.
    したがって,ReactiveMongoRepositoryの最適化挿入()メソッドを用いる必要がある.
    package tacos.data;
    
    import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
    import reactor.core.publisher.Flux;
    import tacos.Taco;
    
    
    public interface TacoRepository extends ReactiveMongoRepository<Taco, String> {
        Flux<Taco> findByOrderByCreatedAtDesc();
    }
    ReactiveCrudRepositoryと比較して、ReactiveMongoRepositoryを使用する唯一の欠点は、モンゴルDBに特化していることです.
    他のDBでは使用できません.そのため、この欠点を考慮して使用すべきである.
    TacoRepositoryには新しい方法があります.
    このメソッドは、最近生成されたタワーのリストをクエリーして返します.
    findByOrderByCreatedAtDesc()はFluxを返します.
    したがって、take()操作を適用してFluxが発行した上位12のTacoオブジェクトを返すしかありません.
    たとえば、最近生成されたタワーを表示するコントローラは、次のコードを記述できます.
    Flux<Taco> recents = repo.findByOrderByCreatedAtDesc().take(12);
    サマリ

  • SpringデータはKasandra、MongoDB、Couchbase、Redisデータベースの反応データベースをサポートします.

  • スプリングデータのアクティブ逆止弁は、アクティブ逆止弁ではなく、逆止弁と同じプログラミングモデルに従う.
    しかし、FluxやMonoのような反応型を用いる.

  • JPA Repergyのような非アクティブなrepergyは、MonoまたはFluxを使用するように調整することができる.
    しかし、データのインポートまたは格納時にブロックが発生します.

  • 非リレーショナル・データベースを使用するには、データベースにデータを格納する方法と一致するようにデータをモデリングする方法を理解する必要があります.