1. 概要

このチュートリアルでは、SprintBootを使用してNoSQLデータベースに接続する方法を学習します。 この記事では、 DataStax Astra DB を使用します。これは、 Apache Cassandra を搭載したDBaaSであり、クラウドネイティブを使用してデータ駆動型アプリケーションを開発およびデプロイできます。サービス。

まず、アプリケーションをAstraDBでセットアップおよび構成する方法を確認することから始めます。 次に、Spring Bootを使用して簡単なアプリケーションを構築する方法を学習します。

2. 依存関係

pom.xmlに依存関係を追加することから始めましょう。 もちろん、spring-boot-starter-data-cassandra依存関係が必要になります。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-cassandra</artifactId>
    <version>2.6.3</version>
</dependency>

次に、spring-boot-starter-web依存関係を追加します。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
     <version>2.6.3</version>
</dependency>

最後に、Datastax astra-spring-boot-starterを使用します。

<dependency>
    <groupId>com.datastax.astra</groupId>
    <artifactId>astra-spring-boot-starter</artifactId>
    <version>0.3.0</version>
</dependency>

必要な依存関係がすべて構成されたので、SpringBootアプリケーションの作成を開始できます。

3. データベースの設定

アプリケーションの定義を開始する前に、DataStaxAstraがApacheCassandraを利用したクラウドベースのデータベース製品であることをすばやく繰り返すことが重要です。 これにより、データの保存に使用できる、完全にホストされ、完全に管理されたCassandraデータベースが提供されます。 ただし、これから説明するように、データベースをセットアップして接続する方法にはいくつかの特殊性があります。

データベースを操作するには、ホストプラットフォームでAstraデータベースをセットアップする必要があります。 次に、 Secure Connect Bundle をダウンロードする必要があります。このバンドルには、SSL証明書の詳細と、この正確なデータベースの接続の詳細が含まれており、安全に接続できます。

このチュートリアルでは、これらのタスクの両方を実行したと想定しています。

4. アプリケーション構成

次に、アプリケーション用に単純なmainクラスを構成します。

@SpringBootApplication
public class AstraDbSpringApplication {

    public static void main(String[] args) {
        SpringApplication.run(AstraDbSpringApplication.class, args);
    }
}

ご覧のとおり、これは一般的なSpringBootアプリケーションです。 それでは、application.propertiesファイルの入力を開始しましょう。

astra.api.application-token=<token>
astra.api.database-id=<your_db_id>
astra.api.database-region=europe-west1

これらはCassandraのクレデンシャルであり、Astraダッシュボードから直接取得できます。

標準のCqlSessionを介してCQLを使用するために、ダウンロードしたセキュア接続バンドルの場所など、別のいくつかのプロパティを追加します。

astra.cql.enabled=true
astra.cql.downloadScb.path=~/.astra/secure-connect-shopping-list.zip

最後に、Cassandraを操作するための標準のSpringDataプロパティをいくつか追加します。

spring.data.cassandra.keyspace=shopping_list
spring.data.cassandra.schema-action=CREATE_IF_NOT_EXISTS

ここでは、データベースのキースペースを指定し、テーブルが存在しない場合はテーブルを作成するようにSpringDataに指示しています。

5. 接続のテスト

これで、データベース接続をテストするためのすべてのパーツが配置されました。 それでは、先に進んで、単純なRESTコントローラーを定義しましょう。

@RestController
public class AstraDbApiController {

    @Autowired
    private AstraClient astraClient;

    @GetMapping("/ping")
    public String ping() {
        return astraClient.apiDevopsOrganizations()
          .organizationId();
    }

}

ご覧のとおり、 AstraClient クラスを使用して、データベースの組織IDを返す単純なpingエンドポイントを作成しました。 これは、さまざまなAstraAPIと対話するために使用できるAstraSDKの一部として提供されるラッパークラスです。

とりわけ、これは接続を確立できることを確認するための単純なテストです。 それでは、先に進んで、Mavenを使用してアプリケーションを実行しましょう。

mvn clean install spring-boot:run

Astraデータベースで確立された接続がコンソールに表示されます。

...
13:08:00.656 [main] INFO  c.d.stargate.sdk.StargateClient - + CqlSession   :[ENABLED]
13:08:00.656 [main] INFO  c.d.stargate.sdk.StargateClient - + API Cql      :[ENABLED]
13:08:00.657 [main] INFO  c.d.stargate.sdk.rest.ApiDataClient - + API Data     :[ENABLED]
13:08:00.657 [main] INFO  c.d.s.sdk.doc.ApiDocumentClient - + API Document :[ENABLED]
13:08:00.658 [main] INFO  c.d.s.sdk.gql.ApiGraphQLClient - + API GraphQL  :[ENABLED]
13:08:00.658 [main] INFO  com.datastax.astra.sdk.AstraClient
  - [AstraClient] has been initialized.
13:08:01.515 [main] INFO  o.b.s.a.AstraDbSpringApplication
  - Started AstraDbSpringApplication in 7.653 seconds (JVM running for 8.097)

同様に、ブラウザでエンドポイントに移動するか、 curl、を使用してエンドポイントにアクセスすると、有効な応答が得られるはずです。

$ curl http://localhost:8080/ping; echo
d23bf54d-1bc2-4ab7-9bd9-2c628aa54e85

すごい! データベース接続が確立され、Spring Bootを使用した簡単なアプリケーションが実装されたので、データを保存および取得する方法を見てみましょう。

6. Springデータの操作

Cassandraデータベースアクセスの基礎として選択できるフレーバーがいくつかあります。 このチュートリアルでは、CassandraサポートするSpringDataを使用することを選択しました。

Spring Dataのリポジトリ抽象化の主な目標は、データアクセス層の実装に必要なボイラープレートコードの量を大幅に削減することです。これにより、例を非常にシンプルに保つことができます。

データモデルでは、単純なショッピングリストを表す1つのエンティティを定義します

@Table
public class ShoppingList {

    @PrimaryKey
    @CassandraType(type = Name.UUID)
    private UUID uid = UUID.randomUUID();

    private String title;
    private boolean completed = false;

    @Column
    private List<String> items = new ArrayList<>();

    // Standard Getters and Setters
}

この例では、Beanでいくつかの標準アノテーションを使用して、エンティティをCassandraデータテーブルにマップし、uidという名前の主キー列を定義しています。

次に、アプリケーションで使用するShoppingListRepositoryを作成しましょう。

@Repository
public interface ShoppingListRepository extends CassandraRepository<ShoppingList, String> {

    ShoppingList findByTitleAllIgnoreCase(String title);

}

これは、標準のSpringDataリポジトリの抽象化に従います。 CassandraRepositoryインターフェースに含まれるfindAll などの継承されたメソッドとは別に、タイトルを使用してショッピングリストを検索するために使用できる追加のメソッドfindByTitleAllIgnoreCaseを追加しました。

実際、Astra Spring Boot Starter を使用する本当の利点の1つは、以前に定義したプロパティを使用してCqlSessionBeanを作成することです。

7. すべてを一緒に入れて

これでデータアクセスリポジトリが配置されました。簡単なサービスとコントローラーを定義しましょう。

@Service
public class ShoppingListService {

    @Autowired
    private ShoppingListRepository shoppingListRepository;

    public List<ShoppingList> findAll() {
        return shoppingListRepository.findAll(CassandraPageRequest.first(10)).toList();
    }

    public ShoppingList findByTitle(String title) {
        return shoppingListRepository.findByTitleAllIgnoreCase(title);
    }
    
    @PostConstruct
    public void insert() {
        ShoppingList groceries = new ShoppingList("Groceries");
        groceries.setItems(Arrays.asList("Bread", "Milk, Apples"));

        ShoppingList pharmacy = new ShoppingList("Pharmacy");
        pharmacy.setCompleted(true);
        pharmacy.setItems(Arrays.asList("Nappies", "Suncream, Aspirin"));

        shoppingListRepository.save(groceries);
        shoppingListRepository.save(pharmacy);
    }
    
}

テストアプリケーションの目的で、 @PostContructアノテーションを追加して、データベースにテストデータを挿入しました。

パズルの最後の部分では、ショッピングリストを取得するための1つのエンドポイントを持つ単純なコントローラーを追加します。

@RestController
@RequestMapping(value = "/shopping")
public class ShoppingListController {

    @Autowired
    private ShoppingListService shoppingListService;

    @GetMapping("/list")
    public List<ShoppingList> findAll() {
        return shoppingListService.findAll();
    }
}

アプリケーションを実行してhttp:// localhost:8080 / Shopping / listにアクセスすると、さまざまなショッピングリストオブジェクトを含むJSON応答が表示されます。

[
  {
    "uid": "363dba2e-17f3-4d01-a44f-a805f74fc43d",
    "title": "Groceries",
    "completed": false,
    "items": [
      "Bread",
      "Milk, Apples"
    ]
  },
  {
    "uid": "9c0f407e-5fc1-41ad-8e46-b3c115de9474",
    "title": "Pharmacy",
    "completed": true,
    "items": [
      "Nappies",
      "Suncream, Aspirin"
    ]
  }
]

これにより、アプリケーションが正しく機能していることが確認されます。 素晴らしい!

8. Cassandraテンプレートの操作

一方、 Cassandra Template 、古典的なSpring CQLアプローチ、そしておそらく今でも最も人気のあるアプローチを直接操作することも可能です。

簡単に言えば、 AstraDbApiController を非常に簡単に拡張して、データセンターを取得できます。

@Autowired
private CassandraTemplate cassandraTemplate;

@GetMapping("/datacenter")
public String datacenter() {
    return cassandraTemplate
        .getCqlOperations()
        .queryForObject("SELECT data_center FROM system.local", String.class);
}

これでも、定義したすべての構成プロパティを活用できます。 ご覧のとおり、2つのアクセス方法の切り替えは完全に透過的です。

9. 結論

この記事では、ホストされているCassandraAstraデータベースをセットアップして接続する方法を学びました。 次に、SpringDataを使用してデータを保存および取得するための簡単なショッピングリストアプリケーションを作成しました。 最後に、低レベルのアクセス方法であるCassandraTemplateを使用する方法についても説明しました。

いつものように、記事の完全なソースコードは、GitHubから入手できます。