Azure Cosmos DB NoSQL API を使用してデータにアクセスする

この記事では、 Spring Data Azure Cosmos DB 向け Spring Cloud Azure Starter をカスタム アプリケーションに追加する方法を説明します。 このスターターを使用すると、Spring Data と Azure Cosmos DB for NoSQL を使用して、Azure Cosmos DB データベースにデータを格納したり、Azure Cosmos DB データベースからデータを取得したりできます。 この記事では、まず、Azure Portal を使用して Azure Cosmos DB を作成する方法を示します。 次に、この記事では、 Spring Initializr を使用して、Spring Boot Starter で使用できるカスタム Spring Boot アプリケーションを作成する方法を説明します。

Azure Cosmos DB は、開発者が SQL、MongoDB、Graph、Table API などのさまざまな標準 API を使用してデータを操作できるようにするグローバル分散型データベース サービスです。 Microsoft の Spring Boot Starter を使用すると、開発者は、Azure Cosmos DB for NoSQL を使用して Azure Cosmos DB と簡単に統合できる Spring Boot アプリケーションを使用できます。

前提条件

Azure Portal を使用して Azure Cosmos DB を作成する

次の手順を実行して、Azure Cosmos DB インスタンスを作成します。

  1. Azure Portal を参照して、[リソースを作成] を選択します。

  2. [データベース][Azure Cosmos DB]の順に選択します。

  3. [Azure Cosmos DB アカウントの作成] 画面で、 Azure Cosmos DB for NoSQLを選択します。

    [Azure Cosmos DB for NoSQL] オプションが強調表示された [Azure Cosmos DB アカウントの作成] ページを示す Azure portal のスクリーンショット。

  4. [Azure Cosmos DB] ページで、次の情報を入力します。

    • データベースに使用する サブスクリプション を選択します。
    • データベースに対して新しい リソース グループ を作成するか、既存のリソース グループを選択するかを指定します。
    • データベースの URI として使用する一意の アカウント名を入力します。 例: contosoaccounttest
    • データベースの 場所 を指定します。
    • デモンストレーション目的でのみアカウントを作成する場合は、 [Free レベル割引の適用] を選択します。
    • 残りのデフォルトのオプションと設定はそのままにしておきます。
  5. [確認および作成] を選択し、仕様を確認して [作成] を選択します。

    Azure Cosmos DB for NoSQL 設定を使用した Azure Cosmos DB アカウントの作成ページを示す Azure portal のスクリーンショット。

  6. データベースが作成されると、それが Azure ダッシュボードに表示され、 [すべてのリソース] ページと [Azure Cosmos DB] ページにも表示されます。 新しく作成された Azure Cosmos DB のデータベースとコンテナーを作成するには、 「クイック スタート: Azure Portal から Azure Cosmos DB アカウント、データベース、コンテナーおよび項目を作成する」の「データベースとコンテナーを追加する」セクションを参照してください。 これらのいずれかの場所でデータベースを選択すると、キャッシュのプロパティ ページを開くことができます。

  7. データベースの [プロパティ] ページが表示されたら、 [キー] を選択し 、データベースの URI キーとアクセス キーをコピーします。 これらの値は、Spring Boot アプリケーションで使用します。

    [キー] ページが表示された Azure Cosmos DB アカウントを示す Azure portal のスクリーンショット。

重要

新しく作成した Azure Cosmos DB で、現在使用している Azure アカウントに Owner ロールを割り当てます。 詳細については、 Azure ポータルを使用した Azure ロールの割り当て を参照してください。

Spring Initializr で Spring Boot アプリケーションを作成する

次の手順を使用して、Azure サポートで新しい Spring Boot アプリケーション プロジェクトを作成します。 別の方法として、 azure-spring-boot-samples リポジトリの spring-cloud-azure-data-cosmos-sample サンプルを使用することもできます。 その後、そのまま「アプリのビルドとテスト」に進むことができます。

  1. https://start.spring.io/ にアクセスします。

  2. 次のオプションを指定します。

    • JavaMaven プロジェクトを生成します。
    • Spring Boot のバージョンを 2.7.11 に指定します。
    • アプリケーションの グループ (Group)成果物 (Artifact) の名前を指定します。
    • Java のバージョンとして [17] を選びます。
    • Azure サポート を依存関係に追加します。

    Note

    Spring Initializr では、 [グループ][アーティファクト] の名前を使用してパッケージ名を作成します (例: com.example.wingtiptoysdata)。

    Spring Boot のバージョンは、Azure サポートでサポートされているバージョンよりも高い場合があります。 プロジェクトが自動的に生成されたら、Spring Boot のバージョンを、Azure でサポートされている最も高いバージョン (Spring-Versions-Mapping で確認できます) に手動で変更することができます。

  3. 以前に一覧したオプションを指定したら、[生成] を選択します。

  4. メッセージが表示されたら、ローカル コンピューター上のパスにプロジェクトをダウンロードして、ファイルを抽出します。

これで、シンプルな Spring Boot アプリケーションを編集できるようになりました。

Azure Spring Boot Starter を使用するように Spring Boot アプリケーションを構成する

  1. アプリのディレクトリで pom.xml ファイルを探します。次に例を示します。

    C:\SpringBoot\wingtiptoysdata\pom.xml

    または

    /users/example/home/wingtiptoysdata/pom.xml

  2. テキスト エディターで pom.xml ファイルを開き、 <dependencies> 要素に以下を追加します。

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-data-cosmos</artifactId>
    </dependency>
    

    Note

    部品表 (BOM) を使用して Spring Cloud Azure ライブラリのバージョンを管理する方法の詳細については、 「Spring Cloud Azure 開発者ガイド」「概要」 セクションを参照してください。

  3. pom.xml ファイルを保存して閉じます。

Azure Cosmos DB を使用するように Spring Boot アプリケーションを構成する

  1. アプリの resources ディレクトリ内で application.properties ファイルを探します。次に例を示します。

    C:\SpringBoot\wingtiptoysdata\src\main\resources\application.properties

    または

    /users/example/home/wingtiptoysdata/src/main/resources/application.properties

  2. テキスト エディターで application.properties ファイルを開き、そのファイルに次の行を追加し、サンプルの値をデータベースの適切なプロパティに置き換えます。

    # Specify the DNS URI of your Azure Cosmos DB.
    spring.cloud.azure.cosmos.endpoint=https://contosoaccounttest.documents.azure.com:443/
    
    # Specify the name of your database.
    spring.cloud.azure.cosmos.database=contosoaccounttest
    spring.cloud.azure.cosmos.populate-query-metrics=true
    
  3. application.properties ファイルを保存して閉じます。

基本的なデータベース機能を実装するサンプル コードを追加する

このセクションでは、ユーザー データを格納するための 2 つの Java クラスを作成します。 次に、メイン アプリケーション クラスを変更して、 User クラスのインスタンスを作成し、データベースに保存します。

ユーザー データを格納するための基本クラスを定義する

  1. User.java という名前の新しいファイルをメイン アプリケーションの Java ファイルと同じディレクトリに作成します。

  2. テキスト エディターで User.java ファイルを開き、次の行をファイルに追加して、データベースの値を格納および取得する汎用ユーザー クラスを定義します。

    package com.example.wingtiptoysdata;
    
    import com.azure.spring.data.cosmos.core.mapping.Container;
    import com.azure.spring.data.cosmos.core.mapping.PartitionKey;
    import org.springframework.data.annotation.Id;
    
    @Container(containerName = "mycollection")
    public class User {
        @Id
        private String id;
        private String firstName;
        @PartitionKey
        private String lastName;
        private String address;
    
        public User() {
    
        }
    
        public User(String id, String firstName, String lastName, String address) {
            this.id = id;
            this.firstName = firstName;
            this.lastName = lastName;
            this.address = address;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            return String.format("%s %s, %s", firstName, lastName, address);
        }
    }
    
  3. User.java ファイルを保存して閉じます。

データ リポジトリ インターフェイスを定義する

  1. UserRepository.java という名前の新しいファイルをメイン アプリケーションの Java ファイルと同じディレクトリに作成します。

  2. テキスト エディターで UserRepository.java ファイルを開き、次の行をファイルに追加して、既定の ReactiveCosmosRepository インターフェイスを拡張するユーザー リポジトリ インターフェイスを定義します。

    package com.example.wingtiptoysdata;
    
    import com.azure.spring.data.cosmos.repository.ReactiveCosmosRepository;
    import org.springframework.stereotype.Repository;
    import reactor.core.publisher.Flux;
    
    @Repository
    public interface UserRepository extends ReactiveCosmosRepository<User, String> {
        Flux<User> findByFirstName(String firstName);
    }
    

    ReactiveCosmosRepository インターフェイスは、スターターの前のバージョンの DocumentDbRepository インターフェイスに代わるものです。 この新しいインターフェイスには、基本的な保存、削除、検索の各操作用の同期 API とリアクティブ API が用意されています。

  3. UserRepository.java ファイルを保存して閉じます。

アプリケーションのメイン クラスを変更する

  1. アプリケーションのパッケージ ディレクトリでメイン アプリケーションの Java ファイルを探します。次に例を示します。

    C:\SpringBoot\wingtiptoysdata\src\main\java\com\example\wingtiptoysdata\WingtiptoysdataApplication.java

    または

    /users/example/home/wingtiptoysdata/src/main/java/com/example/wingtiptoysdata/WingtiptoysdataApplication.java

  2. テキスト エディターでメイン アプリケーションの Java ファイルを開き、ファイルに次の行を追加します。

    package com.example.wingtiptoysdata;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.util.Assert;
    import reactor.core.publisher.Flux;
    import reactor.core.publisher.Mono;
    
    import java.util.Optional;
    
    @SpringBootApplication
    public class WingtiptoysdataApplication implements CommandLineRunner {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(WingtiptoysdataApplication.class);
    
        @Autowired
        private UserRepository repository;
    
        public static void main(String[] args) {
            SpringApplication.run(WingtiptoysdataApplication.class, args);
        }
    
        public void run(String... var1) {
            this.repository.deleteAll().block();
            LOGGER.info("Deleted all data in container.");
    
            final User testUser = new User("testId", "testFirstName", "testLastName", "test address line one");
    
            // Save the User class to Azure Cosmos DB database.
            final Mono<User> saveUserMono = repository.save(testUser);
    
            final Flux<User> firstNameUserFlux = repository.findByFirstName("testFirstName");
    
            //  Nothing happens until we subscribe to these Monos.
            //  findById won't return the user as user isn't present.
            final Mono<User> findByIdMono = repository.findById(testUser.getId());
            final User findByIdUser = findByIdMono.block();
            Assert.isNull(findByIdUser, "User must be null");
    
            final User savedUser = saveUserMono.block();
            Assert.state(savedUser != null, "Saved user must not be null");
            Assert.state(savedUser.getFirstName().equals(testUser.getFirstName()), "Saved user first name doesn't match");
    
            firstNameUserFlux.collectList().block();
    
            final Optional<User> optionalUserResult = repository.findById(testUser.getId()).blockOptional();
            Assert.isTrue(optionalUserResult.isPresent(), "Cannot find user.");
    
            final User result = optionalUserResult.get();
            Assert.state(result.getFirstName().equals(testUser.getFirstName()), "query result firstName doesn't match!");
            Assert.state(result.getLastName().equals(testUser.getLastName()), "query result lastName doesn't match!");
    
            LOGGER.info("findOne in User collection get result: {}", result.toString());
        }
    }
    
  3. メイン アプリケーションの Java ファイルを保存して閉じます。

アプリのビルドとテスト

  1. コマンド プロンプトを開き、 pom.xml ファイルが置かれているフォルダーに移動します。次に例を示します。

    cd C:\SpringBoot\wingtiptoysdata

    または

    cd /users/example/home/wingtiptoysdata

  2. 次のコマンドを使用して、アプリケーションをビルドして実行します。

    ./mvnw clean
    

    このコマンドは、テスト フェーズの一部として、アプリケーションを自動的に実行します。 以下を使用することもできます。

    ./mvnw spring-boot:run
    

    ビルドとテスト出力が完了したら、コンソール ウィンドウに次の例のようなメッセージが表示されます。

    INFO 1365 --- [           main] c.e.w.WingtiptoysdataApplication         : Deleted all data in container.
    
    ... (omitting connection and diagnostics output) ...
    
    INFO 1365 --- [           main] c.e.w.WingtiptoysdataApplication         : findOne in User collection get result: testFirstName testLastName, test address line one
    

    これらの出力メッセージは、Azure Cosmos DB にデータが正常に保存され、もう一度取得されたことを示します。

リソースをクリーンアップする

このアプリケーションの使用を継続しない場合は、前に作成した Azure Cosmos DB を含むリソース グループを必ず削除してください。 Azure Portal でリソース グループを削除できます。

次のステップ

Spring および Azure の詳細については、Azure ドキュメント センターで引き続き Spring に関するドキュメントをご確認ください。

その他のリソース

Azure Cosmos DB と Java の使用について詳しくは、次の記事をご覧ください。

Azure での Spring Boot アプリケーションの使用の詳細については、次の記事を参照してください。

Java での Azure の使用の詳細については、「Java 開発者向けの Azure」および「Azure DevOps と Java の操作」を参照してください。

Spring Framework は Java 開発者のエンタープライズ レベルのアプリケーション作成を支援するオープンソース ソリューションです。 このプラットフォームで構築される特に知られたプロジェクトの 1 つが Spring Boot です。これによって、スタンドアロンの Java アプリケーションの作成方法が簡略化されます。 Spring Boot を使い始めた開発者を支援するために、 https://github.com/spring-guides/では、サンプルの Spring Boot パッケージがいくつか用意されています。 基本的な Spring Boot プロジェクトの一覧から選択するだけでなく、 Spring Initializr は、開発者がカスタム Spring Boot アプリケーションの作成を開始できるように支援します。