1. 概要

このチュートリアルでは、Azure Cosmos DBと、Spring Dataを使用してAzureCosmosDBを操作する方法について学習します。

2. Azure Cosmos DB

Azure Cosmos DB は、Microsoftのグローバルに分散されたデータベースサービスです。

これはNoSQLデータベースであり、スループット、遅延、可用性、および整合性の保証に関する包括的なサービスレベル契約を提供します。 また、読み取りと書き込みの両方で 99.999%の可用性が保証されます。

Azure Cosmos DBは、2つの一貫性の選択肢しか提供しません。 一貫しているか、一貫していないかのどちらかです。 代わりに、 5つの一貫性の選択肢があります。強力な、制限された失効、セッション、一貫性のあるプレフィックス、および最終的なものです。

AzureCosmosDBのスループットとストレージの両方を柔軟にスケーリングできます。

さらに、すべてのAzureリージョンで利用可能であり、ボタンをクリックするだけで任意のAzureリージョンにデータを複製できるため、ターンキーグローバル配布を提供します。 これにより、データをユーザーに近づけて、ユーザーのリクエストをより迅速に処理できるようになります。

スキーマに依存しないスキーマがないため。 さらに、AzureCosmosDbのインデックス管理を行う必要はありません。 データのインデックス作成を自動的に行います。

SQL、MongoDB、Cassandraなどのさまざまな標準APIを使用してAzureCosmosDbを操作できます。

3. Spring Data Azure Cosmos DB

Microsoftは、SpringDataを使用してCosmosDBを操作できるようにするモジュールも提供しています。 次のセクションでは、Spring BootアプリケーションでAzureCosmosDBを使用する方法を説明します。

この例では、製品エンティティをAzure Cosmosデータベースに格納し、その上で基本的なCRUD操作を実行するSpringWebアプリケーションを作成します。 まず、ドキュメントの指示に従って、Azureポータルでアカウントとデータベースを構成する必要があります。

Azureポータルでアカウントを作成したくない場合、AzureはAzureCosmosエミュレーターも提供します。これにはAzureCosmos Serviceのすべての機能が含まれているわけではなく、いくつかの違いがありますが、ローカル開発とテストに使用できます。

ローカル環境でエミュレーターを使用するには、2つの方法があります。マシンにAzure Cosmosエミュレーターをダウンロードするか、DockerforWindowsでエミュレーターを実行します。

Windows用のDockerで実行するオプションを選択します。 次のコマンドを実行して、Dockerイメージをプルしましょう。

docker pull microsoft/azure-cosmosdb-emulator

次に、次のコマンドを実行して、Dockerイメージを実行し、コンテナーを起動できます。

set containerName=azure-cosmosdb-emulator
set hostDirectory=%LOCALAPPDATA%\azure-cosmosdb-emulator.hostd
md %hostDirectory% 2>nul
docker run --name %containerName% --memory 2GB --mount "type=bind,source=%hostDirectory%,destination=C:\CosmosDB.Emulator\bind-mount" -P --interactive --tty microsoft/azure-cosmosdb-emulator

AzureポータルまたはDockerでAzureCosmosDBアカウントとデータベースを構成したら、Spring Bootアプリケーションで引き続き構成できます。

4. SpringでのAzureCosmosDBの使用

4.1. Springを使用したSpringDataAzureCosmosDBの構成

まず、spring-data-cosmosdb依存関係をpom.xmlに追加します。

<dependency> 
    <groupId>com.microsoft.azure</groupId> 
    <artifactId>spring-data-cosmosdb</artifactId> 
    <version>2.3.0</version> 
</dependency>

SpringアプリケーションからAzureCosmosDBにアクセスするには、データベースのURI、アクセスキー、データベース名が必要です。次に、application.propertiesに接続プロパティを追加します。

azure.cosmosdb.uri=cosmodb-uri
azure.cosmosdb.key=cosmodb-primary-key
azure.cosmosdb.secondaryKey=cosmodb-secondary-key
azure.cosmosdb.database=cosmodb-name

上記のプロパティの値は、Azureポータルから見つけることができます。 URI、主キー、および二次キーは、AzureポータルのAzureCosmosDBのキーセクションで利用できます。

アプリケーションからAzureCosmosDBに接続するには、クライアントを作成する必要があります。 そのためには、構成クラスでAbstractCosmosConfigurationクラスを拡張し、@EnableCosmosRepositoriesアノテーションを追加する必要があります。

このアノテーションは、指定されたパッケージ内のSpring Dataのリポジトリインターフェイスを拡張するインターフェイスをスキャンします。

また、CosmosDBConfigタイプのBeanを構成する必要があります。

@Configuration
@EnableCosmosRepositories(basePackages = "com.baeldung.spring.data.cosmosdb.repository")
public class AzureCosmosDbConfiguration extends AbstractCosmosConfiguration {

    @Value("${azure.cosmosdb.uri}")
    private String uri;

    @Value("${azure.cosmosdb.key}")
    private String key;

    @Value("${azure.cosmosdb.database}")
    private String dbName;

    private CosmosKeyCredential cosmosKeyCredential;

    @Bean
    public CosmosDBConfig getConfig() {
        this.cosmosKeyCredential = new CosmosKeyCredential(key);
        CosmosDBConfig cosmosdbConfig = CosmosDBConfig.builder(uri, this.cosmosKeyCredential, dbName)
            .build();
        return cosmosdbConfig;
    }
}

4.2. AzureCosmosDBのエンティティの作成

Azure Cosmos DBと対話するために、エンティティを利用します。 それでは、AzureCosmosDBに保存するエンティティを作成しましょう。 Product クラスをエンティティにするには、 @Documentアノテーションを使用します:

@Document(collection = "products")
public class Product {

    @Id
    private String productid;

    private String productName;

    private double price;

    @PartitionKey
    private String productCategory;
}

この例では、コレクション属性を値productsとともに使用して、これがデータベース内のコンテナーの名前になることを示しています。 collection パラメーターに値を指定しない場合、クラス名がデータベースのコンテナー名として使用されます。

ドキュメントのIDも定義しました。 クラスにidという名前のフィールドを作成するか、@Idアノテーションを付けてフィールドにアノテーションを付けることができます。 ここでは、productidフィールドをドキュメントIDとして使用しています。

フィールドに@PartitionKeyアノテーションを付けてパーティションキーを使用することで、コンテナ内のデータを論理的にパーティション化できます。 私たちのクラスでは、 製品カテゴリパーティションキーとしてのフィールド。

既定では、インデックス作成ポリシーはAzureによって定義されていますが、エンティティクラスで@DocumentIndexingPolicyアノテーションを使用してカスタマイズすることもできます。

_etag という名前のフィールドを作成し、 @Version。で注釈を付けることで、エンティティコンテナのオプティミスティックロックを有効にすることもできます。

4.3. リポジトリの定義

次に、CosmosRepositoryを拡張するProductRepositoryインターフェイスを作成しましょう。 このインターフェイスを使用して、AzureCosmosDBでCRUD操作を実行できます。

@Repository
public interface ProductRepository extends CosmosRepository<Product, String> {
    List findByProductName(String productName);

}

ご覧のとおり、これは他のSpringDataモジュールと同様の方法で定義されています。

4.4. 接続のテスト

これで、 ProductRepository を使用して、AzureCosmosDBにProductエンティティを保存するJUnitテストを作成できます。

@SpringBootTest
public class AzureCosmosDbApplicationManualTest {

    @Autowired
    ProductRepository productRepository;

    @Test
    public void givenProductIsCreated_whenCallFindById_thenProductIsFound() {
        Product product = new Product();
        product.setProductid("1001");
        product.setProductCategory("Shirt");
        product.setPrice(110.0);
        product.setProductName("Blue Shirt");

        productRepository.save(product);
        Product retrievedProduct = productRepository.findById("1001", new PartitionKey("Shirt"))
            .orElse(null);
        Assert.notNull(retrievedProduct, "Retrieved Product is Null");
    }

}

このJUnitテストを実行することで、SpringアプリケーションからAzureCosmosDBとの接続をテストできます。

5. 結論

このチュートリアルでは、AzureCosmosDBについて学習しました。 さらに、SpringBootアプリケーションからAzureCosmos DBにアクセスする方法、エンティティを作成し、CosmosRepositoryを拡張してリポジトリと対話することでリポジトリを構成する方法を学びました。

上記の例のコードは、GitHubから入手できます。