Spring Data R2DBC | リファレンスドキュメント

12. 導入

リファレンスドキュメントのこの部分では、Spring Data R2DBCが提供する中核機能を説明する。R2DBCサポートの章ではモジュールの機能セットを紹介し、R2DBC Repositoryの章ではリポジトリサポートを紹介する。

13. R2DBCサポート

R2DBCサポートには、R2DBCドライバインスタンスのJavaベースSpring構成、エンティティ指向操作を行うR2dbcEntityTemplate、Springの変換サービスと統合されたオブジェクトマッピング、アノテーションベースのマッピングメタデータ、カスタムクエリメソッドを含むリポジトリインターフェースの自動実装が含まれる。

多くのアプリケーションでは、R2dbcEntityTemplateまたはリポジトリサポートを使うとよい。どちらも豊富なマッピング機能と、一般的なCRUD操作への便利なアクセスを提供する。

13.1. はじめに

プロジェクトを設定する最も簡単な方法はstart.spring.ioを使うことである。Spring Data R2DBCと、H2などのR2DBCドライバを依存関係に追加する。

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-r2dbc</artifactId>
  <version>1.4.0</version>
</dependency>

<dependency>
  <groupId>io.r2dbc</groupId>
  <artifactId>r2dbc-h2</artifactId>
  <version>Arabba-SR10</version>
</dependency>

デバッグログは次の設定で有効にできる。

logging.level.org.springframework.r2dbc=DEBUG

単純なドメインクラスは、追加のマッピングメタデータなしで永続化できる。

public class Person {
  private final String id;
  private final String name;
  private final int age;
  // constructor and getters
}

テーブルを作成し、R2dbcEntityTemplateで行を挿入、選択する。

ConnectionFactory connectionFactory =
    ConnectionFactories.get("r2dbc:h2:mem:///test?options=DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");

R2dbcEntityTemplate template = new R2dbcEntityTemplate(connectionFactory);

template.insert(Person.class)
  .using(new Person("joe", "Joe", 34))
  .as(StepVerifier::create)
  .expectNextCount(1)
  .verifyComplete();

この例は、Spring Data R2DBCが標準のConnectionFactoryで動作し、通常のPOJOをマッピングし、フィールドアクセスを使い、コンストラクタ引数名とカラム名を照合してオブジェクトを生成できることを示している。

13.2. サンプルリポジトリ

Spring Dataのサンプルは、GitHubのSpring Data examplesリポジトリで公開されている。ダウンロードして、実際の利用場面でライブラリがどのように動作するか確認できる。

13.3. Springでリレーショナルデータベースへ接続する

Springでリレーショナルデータベースを使う場合、最初の作業の一つはIoCコンテナを通じてio.r2dbc.spi.ConnectionFactoryを作成することである。

@Configuration
public class ApplicationConfiguration extends AbstractR2dbcConfiguration {

  @Override
  @Bean
  public ConnectionFactory connectionFactory() {
    return ...
  }
}

AbstractR2dbcConfigurationを使うと、DatabaseClientや、@Repositoryで注釈されたクラス向けの例外変換などのインフラが登録される。

13.3.2. R2DBCドライバ

Spring Data R2DBCはR2DBC SPIを通じてドライバをサポートする。R2DBC仕様を実装する任意のドライバを利用できるが、Spring Data R2DBCがデータベース固有の動作に対応するにはダイアレクトが必要である。

組み込みダイアレクトには、H2、MariaDB、Microsoft SQL Server、MySQL、jasync-sql MySQL、Postgres、Oracleが含まれる。ドライバが認識されない場合は、独自のR2dbcDialectを設定する。ダイアレクトはDialectResolverspring.factoriesを通じて検出することもできる。

13.4. R2dbcEntityOperationsデータアクセスAPI

R2dbcEntityTemplateはSpring Data R2DBCの中心的なエントリポイントである。データの検索、挿入、更新、削除のために、エンティティ指向メソッドとフルーエントAPIを提供する。

insert()select()update()などのエントリポイントは自然な命名規則に従う。APIは、SQLを作成して実行する終端メソッドに到達するまで、文脈に応じたメソッドだけを提供する。Spring Data R2DBCはR2dbcDialectを使い、バインドマーカー、ページングサポート、ネイティブデータ型を決定する。

すべての終端メソッドはPublisherを返す。実際のSQL文は、Publisherが購読された時点でデータベースへ送信される。

14. R2DBC Repository

R2DBCリポジトリは、Spring Dataのリポジトリ抽象化とリアクティブAPIを基盤にする。リポジトリメソッドはMonoFlux、またはサポートされる他のリアクティブラッパー型を返せる。クエリメソッドはメソッド名から派生させることも、明示的に宣言することもできる。

インターフェースベースのデータアクセスと一貫したCRUD動作が有用な場合はリポジトリを使う。アドホック操作やフルーエントなクエリ構築をより直接制御したい場合は、R2dbcEntityTemplateを使う。

まとめ

Spring Data R2DBCは、リレーショナルデータベース向けのリアクティブデータアクセス層を提供する。R2DBCドライバ、Spring構成、マッピングメタデータ、R2dbcEntityTemplate、リポジトリサポートを組み合わせ、馴染みのあるSpring Dataのプログラミングモデルを保ちながらノンブロッキングなデータベースアクセスを実現する。