MongoDBを使用したSpring Data Reactive Repositories
1. 前書き
このチュートリアルでは、MongoDBでSpring Data ReactiveRepositoriesを介してReactiveProgrammingを使用してデータベース操作を構成および実装する方法を説明します。
ReactiveCrudRepository,ReactiveMongoRepository,とReactiveMongoTemplate.の基本的な使用法について説明します
これらの実装ではreactive programmingを使用していますが、それはこのチュートリアルの主な焦点ではありません。
2. 環境
Reactive MongoDBを使用するには、pom.xml.に依存関係を追加する必要があります
また、テスト用に組み込みのMongoDBを追加します。
// ...
org.springframework.boot
spring-boot-starter-data-mongodb-reactive
de.flapdoodle.embed
de.flapdoodle.embed.mongo
test
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. Documentの作成
以下の例では、Accountクラスを作成し、@Documentで注釈を付けて、データベース操作で使用します。
@Document
public class Account {
@Id
private String id;
private String owner;
private Double value;
// getters and setters
}
5. リアクティブリポジトリの使用
repositories programming modelについてはすでによく知っており、CRUDメソッドはすでに定義されており、他の一般的なものもサポートされています。
リアクティブモデルを使用すると、結果とパラメーターをリアクティブな方法で処理することを除いて、同じメソッドと仕様のセットを取得できます。
5.1. ReactiveCrudRepository
このリポジトリは、ブロッキングCrudRepositoryと同じ方法で使用できます。
@Repository
public interface AccountCrudRepository
extends ReactiveCrudRepository {
Flux findAllByValue(String value);
Mono findFirstByOwner(Mono owner);
}
プレーン(String)、ラップ(Optional、Stream)、リアクティブ(Mono、Flux)など、さまざまな種類の引数を渡すことができます。 findFirstByOwner()メソッドを参照してください。
5.2. ReactiveMongoRepository
ReactiveCrudRepositoryから継承し、いくつかの新しいクエリメソッドを追加するReactiveMongoRepositoryインターフェースもあります。
@Repository
public interface AccountReactiveRepository
extends ReactiveMongoRepository { }
ReactiveMongoRepositoryを使用して、次の例でクエリを実行できます。
Flux accountFlux = repository
.findAll(Example.of(new Account(null, "owner", null)));
その結果、渡された例と同じすべてのAccountが取得されます。
リポジトリを作成すると、実装する必要のないいくつかのデータベース操作を実行するためのメソッドがすでに定義されています。
Mono accountMono
= repository.save(new Account(null, "owner", 12.3));
Mono accountMono2 = repository
.findById("123456");
5.3. RxJava2CrudRepository
RxJava2CrudRepository,の場合、ReactiveCrudRepository,と同じ動作になりますが、RxJavaの結果とパラメータタイプがあります。
@Repository
public interface AccountRxJavaRepository
extends RxJava2CrudRepository {
Observable findAllByValue(Double value);
Single findFirstByOwner(Single owner);
}
5.4. 基本操作のテスト
リポジトリメソッドをテストするために、テストサブスクライバーを使用します。
@Test
public void givenValue_whenFindAllByValue_thenFindAccount() {
repository.save(new Account(null, "Bill", 12.3)).block();
Flux 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 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 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 findById(String id) {
return template.findById(id, Account.class);
}
public Flux findAll() {
return template.findAll(Account.class);
}
public Mono save(Mono account) {
return template.save(account);
}
}
ReactiveMongoTemplateには、私たちが持っているドメインに関係のないメソッドもいくつかあります。それらはdocumentationで確認できます。
7. 結論
この簡単なチュートリアルでは、Spring Data ReactiveRepositoriesフレームワークを備えたMongoDBでのリアクティブプログラミングを使用したリポジトリとテンプレートの使用について説明しました。
例の完全なソースコードは、over on GitHubで入手できます。