Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Azure Cosmos DB Spring Boot Starter を使う

Azure Spring Boot Starter ライブラリの一つに、Cosmos DBへアクセスするライブラリが存在するのですが、今回はこれについて。

Docsの解説記事としては以下の通りです。

docs.microsoft.com

初期設定

Web Application でなくてもいいので、普通にCommandLineRunnerを使って簡易に実装しつつ、挙動を確かめるのがお手軽かと思います。

ライブラリは以下の者を使います。

mvnrepository.com

以下のような依存をつければよいでしょう(執筆時点)

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-cosmosdb-spring-boot-starter</artifactId>
            <version>2.3.5</version>
        </dependency>

CosmosDBの用意

現在、AzureサブスクリプションにはFreeでCosmosDBを1つだけ作れるのでこれを利用すると良いと思います。

azure.microsoft.com

ここで適宜DBとコンテナを作成すると以下の情報が手に入るとおもいます。

  • URL
  • キー
  • DB名
  • コンテナ名

サンプルなので、パーティションキーは /id にしてもらっても問題ないでしょう。

Azure Cosmos DB でのパーティション分割 | Microsoft Docs

構成ファイル

構成は、application.propertiesに設定しますが、yamlでも構いません。先ほど取得した情報のうちURI、キー、DB名を定義します。

azure.cosmosdb.uri=
azure.cosmosdb.key=
azure.cosmosdb.database=

POJOクラスの定義

POJOクラスを定義します。めんどくさいGetter/Setter的なコードはlombokにお任せします。注目すべきは、クラスに指定したDocumentアノテーションです。これにコレクション(コンテナ)を指定します。 あと、PartitionKeyアノテーションはDBを作成したときのパーティションキーに指定します。

package com.example.demo;

import com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document;
import com.microsoft.azure.spring.data.cosmosdb.core.mapping.PartitionKey;

import org.springframework.data.annotation.Id;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
@Document(collection = "Container1")
public class Pet {
    
    @Id
    @PartitionKey
    private String id;
    private String owner ;
    private String name;
    private PetKind kind;
}

リポジトリの定義

リポジトリは同期、非同期に二つが用意されています。該当パッケージのJavadocは以下の通りです。

docs.microsoft.com

同期で利用したいならCosmosRepository<T,ID> 、非同期で利用したいならReactiveCosmosRepository<T,K> を使います。

リポジトリはインタフェースを継承して中身は空、実装クラスも用意しなくて問題ないです。面倒くさいところはライブラリがやってくれます。

@Repository
public interface PetRepository extends CosmosRepository<Pet, String> {
}

CRUD

CRUDはリポジトリ経由で操作できます。DIされるので、それを利用します(実装いらず)。以下は新規作成例です。

    @Autowired
    private PetRepository repository;

    @Override
    public void run(String... args) throws Exception {

        // Crete
        var pet1 = repository.save(new Pet(UUID.randomUUID().toString(), "suzuki-san", "pochi", PetKind.Doc));
        var pet2 = repository.save(new Pet(UUID.randomUUID().toString(), "tanaka-san", "tama", PetKind.Cat));

        System.out.println(pet1);
        System.out.println(pet2);
        
    }

実行後、ポータルを参照するとItemが作られていることが確認できます。

提供されている操作自身は、Spring Bootのリポジトリインタフェースを継承しているので、それらが利用出来ると思います。

f:id:StateMachine:20200930115850p:plain

以上