1. 序章

このチュートリアルでは、MongoDBでSpring Dataリアクティブリポジトリを介してリアクティブプログラミングを使用してデータベース操作を構成および実装する方法を説明します。

ReactionCrud リポジトリ、 ReactiveMongoRepository 、およびReactiveMongoTemplateの基本的な使用法について説明します。

これらの実装はリアクティブプログラミングを使用していますが、それはこのチュートリアルの主な焦点ではありません。

2. 環境

Reactive MongoDBを使用するには、pom.xml。に依存関係を追加する必要があります。

また、テスト用に組み込みのMongoDBを追加します。

<dependencies>
    // ...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
    </dependency>
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

3. 構成

リアクティブサポートをアクティブ化するには、@EnableReactiveMongoRepositoriesをいくつかのインフラストラクチャセットアップと一緒に使用する必要があります。

@EnableReactiveMongoRepositories
public class MongoReactiveApplication
  extends AbstractReactiveMongoConfiguration {

    @Bean
    public MongoClient mongoClient() {
        return MongoClients.create();
    }

    @Override
    protected String getDatabaseName() {
        return "reactive";
    }
}

スタンドアロンのMongoDBインストールを使用している場合は、上記が必要になることに注意してください。 ただし、この例ではMongoDBが埋め込まれたSpring Bootを使用しているため、上記の構成は必要ありません。

4. ドキュメントの作成

以下の例では、 Account クラスを作成し、 @Document で注釈を付けて、データベース操作で使用します。

@Document
public class Account {
 
    @Id
    private String id;
    private String owner;
    private Double value;
 
    // getters and setters
}

5. リアクティブリポジトリの使用

リポジトリプログラミングモデルについてはすでによく知っており、CRUDメソッドはすでに定義されており、他の一般的なものもサポートされています。

これでリアクティブモデルを使用して、結果とパラメーターをリアクティブな方法で処理することを除いて、同じメソッドと仕様のセットを取得します。

5.1. ReactiveCrudRepository

このリポジトリは、ブロッキングCrudRepositoryと同じように使用できます。

@Repository
public interface AccountCrudRepository 
  extends ReactiveCrudRepository<Account, String> {
 
    Flux<Account> findAllByValue(String value);
    Mono<Account> findFirstByOwner(Mono<String> owner);
}

プレーン( String )、ラップ(オプションストリーム)、リアクティブ( Mono 、[ findFirstByOwner()メソッドでわかるように、X145X] Flux )。

5.2. ReactiveMongoRepository

ReactionMongoRepository インターフェースもあります。これは、 ReactionCrudRepository を継承し、いくつかの新しいクエリメソッドを追加します。

@Repository
public interface AccountReactiveRepository 
  extends ReactiveMongoRepository<Account, String> { }

ReactiveMongoRepository を使用して、次の例でクエリを実行できます。

Flux<Account> accountFlux = repository
  .findAll(Example.of(new Account(null, "owner", null)));

その結果、渡された例と同じすべてのアカウントを取得します。

リポジトリを作成すると、実装する必要のないいくつかのデータベース操作を実行するためのメソッドがすでに定義されています。

Mono<Account> accountMono 
  = repository.save(new Account(null, "owner", 12.3));
Mono<Account> accountMono2 = repository
  .findById("123456");

5.3. RxJava2CrudRepository

RxJava2CrudRepository、を使用すると、 ReactiveCrudRepository、と同じ動作になりますが、RxJavaの結果とパラメータータイプが使用されます。

@Repository
public interface AccountRxJavaRepository 
  extends RxJava2CrudRepository<Account, String> {
 
    Observable<Account> findAllByValue(Double value);
    Single<Account> findFirstByOwner(Single<String> owner);
}

5.4. 基本操作のテスト

リポジトリメソッドをテストするために、テストサブスクライバーを使用します。

@Test
public void givenValue_whenFindAllByValue_thenFindAccount() {
    repository.save(new Account(null, "Bill", 12.3)).block();
    Flux<Account> accountFlux = repository.findAllByValue(12.3);

    StepVerifier
      .create(accountFlux)
      .assertNext(account -> {
          assertEquals("Bill", account.getOwner());
          assertEquals(Double.valueOf(12.3) , account.getValue());
          assertNotNull(account.getId());
      })
      .expectComplete()
      .verify();
}

@Test
public void givenOwner_whenFindFirstByOwner_thenFindAccount() {
    repository.save(new Account(null, "Bill", 12.3)).block();
    Mono<Account> accountMono = repository
      .findFirstByOwner(Mono.just("Bill"));

    StepVerifier
      .create(accountMono)
      .assertNext(account -> {
          assertEquals("Bill", account.getOwner());
          assertEquals(Double.valueOf(12.3) , account.getValue());
          assertNotNull(account.getId());
      })
      .expectComplete()
      .verify();
}

@Test
public void givenAccount_whenSave_thenSaveAccount() {
    Mono<Account> accountMono = repository.save(new Account(null, "Bill", 12.3));

    StepVerifier
      .create(accountMono)
      .assertNext(account -> assertNotNull(account.getId()))
      .expectComplete()
      .verify();
}

6. ReactiveMongoTemplate

リポジトリアプローチに加えて、ReactiveMongoTemplateがあります。

まず、ReactiveMongoTemplateをBeanとして登録する必要があります。

@Configuration
public class ReactiveMongoConfig {
 
    @Autowired
    MongoClient mongoClient;

    @Bean
    public ReactiveMongoTemplate reactiveMongoTemplate() {
        return new ReactiveMongoTemplate(mongoClient, "test");
    }
}

次に、このBeanをサービスに注入して、データベース操作を実行できます。

@Service
public class AccountTemplateOperations {
 
    @Autowired
    ReactiveMongoTemplate template;

    public Mono<Account> findById(String id) {
        return template.findById(id, Account.class);
    }
 
    public Flux<Account> findAll() {
        return template.findAll(Account.class);
    } 
    public Mono<Account> save(Mono<Account> account) {
        return template.save(account);
    }
}

ReactiveMongoTemplate には、私たちが持っているドメインに関係のないいくつかのメソッドもあります。ドキュメントでそれらをチェックできます。

7. 結論

この簡単なチュートリアルでは、Spring DataReactiveRepositoriesフレームワークを使用したMongoDBでのリアクティブプログラミングを使用したリポジトリとテンプレートの使用について説明しました。

例の完全なソースコードは、GitHubから入手できます。