1. 概要
Google Cloud Datastore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQL ドキュメント データベースです。
学習内容
- Cloud Datastore を使用して Spring Boot で Java オブジェクトを保存および取得する方法
必要なもの
このチュートリアルの利用方法をお選びください。
Google Cloud Platform サービスのご利用経験についてどのように評価されますか?
<ph type="x-smartling-placeholder">2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。
- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_ID
と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell をアクティブにする
- Cloud Console で、[Cloud Shell をアクティブにする] をクリックします。
Cloud Shell を初めて起動する場合は、内容を説明する中間画面が表示されます。中間画面が表示されたら、[続行] をクリックします。
Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。
この仮想マシンには、必要なすべての開発ツールが読み込まれます。5 GB の永続的なホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。この Codelab での作業のほとんどはブラウザを使って行うことができます。
Cloud Shell に接続すると、認証が完了し、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。
- Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list
コマンド出力
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
コマンド出力
[core] project = <PROJECT_ID>
上記のようになっていない場合は、次のコマンドで設定できます。
gcloud config set project <PROJECT_ID>
コマンド出力
Updated property [core/project].
3. Cloud Datastore を初期化する
GCP Console で、メニュー ->Datastore([ストレージ] セクション内)、またはこちらをクリックしてください。
現在のプロジェクトで Datastore を使用したことがない場合は、[Cloud Firestore モードの選択] 画面が表示されます。[Datastore モード] オプションを選択します。
[データの保存場所の選択] 画面が表示されます。us-east1 またはその他のリージョンのロケーションを選択し、[データベースを作成] をクリックします。
4. 新しい Spring Boot Java アプリケーションをブートストラップする
CloudShell 環境から次のコマンドを使用して、新しい Spring Boot アプリケーションを初期化し、ブートストラップします。
$ curl https://start.spring.io/starter.tgz \ -d packaging=war \ -d dependencies=cloud-gcp \ -d type=maven-project \ -d baseDir=datastore-example \ -d bootVersion=3.0.5 | tar -xzvf -
これにより、新しい Maven プロジェクト、Maven の pom.xml
、Maven ラッパー、アプリケーション エントリポイントを含む新しい datastore-example/
ディレクトリが作成されます。
このアプリケーションでは、ユーザーがコマンドを入力して結果を表示するための CLI を提供します。書籍を表すクラスを作成し、Datastore リポジトリを使用して Cloud Datastore に保存します。
また、必要な依存関係をもう 1 つ pom.xml
に追加する必要があります。
Cloud Shell メニューから [エディタを開く] をクリックして、ウェブコードエディタを開きます。
エディタが読み込まれたら、pom.xml
ファイルを変更して、Google Cloud Datastore Starter と Spring Shell Starter の依存関係を追加します。
pom.xml
<project>
...
<dependencies>
...
<!-- Add GCP Datastore Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-data-datastore</artifactId>
</dependency>
<!-- Add Spring Shell Starter -->
<dependency>
<groupId>org.springframework.shell</groupId>
<artifactId>spring-shell-starter</artifactId>
<version>3.0.2</version>
</dependency>
</dependencies>
</project>
5. Book クラスを作成する
エディタを使用して、次の内容の Book
クラスを作成します。
datastore-example/src/main/java/com/example/demo/Book.java
package com.example.demo;
import com.google.cloud.spring.data.datastore.core.mapping.Entity;
import org.springframework.data.annotation.Id;
@Entity(name = "books")
public class Book {
@Id
Long id;
String title;
String author;
int year;
public Book(String title, String author, int year) {
this.title = title;
this.author = author;
this.year = year;
}
public long getId() {
return this.id;
}
@Override
public String toString() {
return "Book{" +
"id=" + this.id +
", title='" + this.title + '\'' +
", author='" + this.author + '\'' +
", year=" + this.year +
'}';
}
}
ご覧のとおり、これはシンプルな POJO です。このクラスには @Entity
アノテーションが付けられ、Datastore に格納可能で、種類名を提供できることを示します(種類は SQL データベースのテーブルのようなものです。詳しくはドキュメントをご覧ください)。種類名は省略可能です。省略すると、クラス名に基づいて種類名が生成されます。
id
プロパティに @Id
アノテーションを付けていることに注意してください。これは、このフィールドを Datastore キーの識別子部分として使用することを示します。すべての Datastore エンティティには識別子が必要です。サポートされている型は String
と Long
です。
オブジェクトの文字列表現を読みやすくするために、toString
メソッドをオーバーライドします。出力する際に便利です。
6. BookRepository インターフェースを作成する
次の内容で BookRepository
クラスを作成します。
datastore-example/src/main/java/com/example/demo/BookRepository.java
package com.example.demo;
import java.util.List;
import com.google.cloud.spring.data.datastore.repository.DatastoreRepository;
public interface BookRepository extends DatastoreRepository<Book, Long> {
List<Book> findByAuthor(String author);
List<Book> findByYearGreaterThan(int year);
List<Book> findByAuthorAndYear(String author, int year);
}
このインターフェースは DatastoreRepository<Book, Long>
を拡張します。ここで、Book
はドメインクラス、Long
は Id
型です。リポジトリでクエリメソッドを 3 つ宣言し、実装がバックグラウンドで自動的に生成されます。
1 件目はfindByAuthor
です。ご想像のとおり、このメソッドを実装すると、作成者フィールドと等しいかどうかの条件フィルタでユーザーが指定した値を使用するクエリが実行されます。
findByYearGreaterThan
メソッドは、ユーザーが指定した値より大きい年のフィールドをフィルタリングするクエリを実行します。
findByAuthorAndYear
は、作成者と年のフィールドがユーザー指定の値と一致するエンティティを検索するクエリを実行します。
7. インタラクティブ CLI アプリケーションを作成する
メイン アプリケーションの DemoApplication
クラスを開き、次のように変更します。
datastore-example/src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
import java.util.List;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;
@ShellComponent
@SpringBootApplication
public class DemoApplication {
@Autowired
BookRepository bookRepository;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@ShellMethod("Saves a book to Cloud Datastore: save-book <title> <author> <year>")
public String saveBook(String title, String author, int year) {
Book savedBook = this.bookRepository.save(new Book(title, author, year));
return savedBook.toString();
}
@ShellMethod("Loads all books")
public String findAllBooks() {
Iterable<Book> books = this.bookRepository.findAll();
return Lists.newArrayList(books).toString();
}
@ShellMethod("Loads books by author: find-by-author <author>")
public String findByAuthor(String author) {
List<Book> books = this.bookRepository.findByAuthor(author);
return books.toString();
}
@ShellMethod("Loads books published after a given year: find-by-year-after <year>")
public String findByYearAfter(int year) {
List<Book> books = this.bookRepository.findByYearGreaterThan(year);
return books.toString();
}
@ShellMethod("Loads books by author and year: find-by-author-year <author> <year>")
public String findByAuthorYear(String author, int year) {
List<Book> books = this.bookRepository.findByAuthorAndYear(author, year);
return books.toString();
}
@ShellMethod("Removes all books")
public void removeAllBooks() {
this.bookRepository.deleteAll();
}
}
@ShellComponent
を使用してクラスにアノテーションを付ける方法に注意してください。これにより、Spring はこのクラスを CLI コマンドのソースとして使用することを通知します。@ShellMethod
アノテーション付きのメソッドは、アプリケーションで CLI コマンドとして公開されます。
ここでは、BookRepository
インターフェースで宣言した findByAuthor
、findByYearGreaterThan
、findByAuthorAndYear
のメソッドを使用します。また、save
、findAll
、deleteAll
の 3 つの組み込みメソッドを使用します。
saveBook
メソッドを見てみましょう。タイトル、著者、年にユーザーが指定した値を使用して、Book
オブジェクトを作成します。ご覧のとおり、id
値は提供されていないため、保存時に自動的に id
フィールドに割り当てられます。save
メソッドは、Book
型のオブジェクトを受け取り、Cloud Datastore に保存します。id
フィールドを含むすべてのフィールドに値が入力された Book
オブジェクトを返します。最後に、このオブジェクトの文字列表現を返します。
残りのメソッドも同じように動作します。適切なリポジトリ メソッドに渡されたパラメータを受け取り、文字列化された結果を返します。
8. アプリケーションを実行する
アプリケーションをビルドして起動するには、まず JAVA_HOME が正しいバージョンに設定されていることを確認します。
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
Cloud Shell で(pom.xml
が配置されているプロジェクト datastore-example/
のルートから)次のコマンドを実行します。
$ ./mvnw spring-boot:run export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
ビルドステージが成功すると、Spring のロゴが表示され、シェル プロンプトが表示されます。
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.0.5) shell:>
ここで、前に定義したコマンドを試してみましょう。コマンドの一覧を表示するには、help コマンドを使用します。
shell:> help ... find-all-books: Loads all books find-by-author: Loads books by author: find-by-author <author> find-by-author-year: Loads books by author and year: find-by-author-year <author> <year> find-by-year-after: Loads books published after a given year: find-by-year-after <year> remove-all-books: Removes all books save-book: Saves a book to Cloud Datastore: save-book <title> <author> <year>
次のようにしてください。
save-book
コマンドを使用して書籍をいくつか作成するfind-all-books
コマンドを使用して検索を実行する- 特定の著者の書籍を検索:
find-by-author <author>
- 特定の年以降に出版された書籍を検索:
find-by-year-after <year>
- 特定の著者と年で書籍を探す:
find-by-author-year <author> <year>
9. Datastore に保存されているものをウェブ インターフェースを使用して確認する
エンティティが Cloud Datastore でどのように保存されているかを確認するには、GCP Console に移動します。「本」と入力必要に応じて kind フィールドに指定します。
10. クリーンアップ
クリーンアップするには、該当する名前の remove-all-books
コマンドを使用して、アプリケーション シェルからすべての書籍を削除します。
shell:> remove-all-books
アプリケーションを終了するには、quit コマンドの後に Ctrl+C
コマンドを実行します。
11. 完了
この Codelab では、Cloud Datastore でオブジェクトの保存と取得ができるインタラクティブな CLI アプリケーションを作成しました。
詳細
- Cloud Datastore: https://cloud.google.com/datastore/
- Spring Shell: https://projects.spring.io/spring-shell/
- Spring on GCP プロジェクト: https://spring.io/projects/spring-cloud-gcp
- GCP の Spring の GitHub リポジトリ: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Google Cloud Platform での Java: https://cloud.google.com/java/
ライセンス
この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。