Spring Boot + Azure App Engine +Cosmos DBでAPIを無料で爆速開発する - その2

目次

  1. 作るもの
  2. CosmosDBに接続する
  3. Spring bootの設定
    1. pom.xmlの編集
    2. application.properties
  4. 実装
    1. Entity
    2. Repository作る
    3. Cotroller作る
    4. ローカルでのテスト
  5. デプロイ
  6. 最後に
  7. 参考
  8. 【PR】おすすめ技術本

この記事はこちらの記事の続きです。
Spring Boot + Azure App Engine +Cosmos DBでAPIを無料で爆速開発する - その1

こんにちは。karintomania(twitter)です。
前回はSpring bootで作ったプロジェクトをazureにデプロイするところまで行いました。

今回はCosmosDBに接続してAPIを完成させます。
しかし、ロゴがダさい…

作るもの

改めて、成果物の確認です。

プログラマに刺さるような名言を教えてくれるAPIを作成します。
イメージはこんな感じです。

CosmosDBに接続する

まずはcosmos DBをazureポータルから作ります。
ホーム>新規作成>CosmosDBで作成してください。

APIはCore(SQL)を選んでください。
他は適当で大丈夫です。

次にDBとコンテナを作ります。
データエクスプローラー画面から作れると思います。
コンテナというのはRDBでいうテーブルです。
コンテナの作成画面はこんな感じです。

コンテナidをquoteとしました。

パーティションキーというのが必須項目ですね。
これは普通にPrimaryキーとして使うidとは、また別みたいです。

本来DBをリージョンごとで割りたいとか、
高度なことができるらしいのですが、今回は良く分からないので(爆)、
とりあえずquoteIdとしてidと同じ値を入れておくようにします。

余談ですが、この辺の高度な感じがCosmosDBを名乗る由来で、
宇宙レベルのアプリが作成できるとかなんとか。

これでCosmos側の設定は完了です。

Spring bootの設定

それではSpring boot側での設定をしていきます。

pom.xmlの編集

pomにdependencyを追加します。

pom.xml
1
2
3
4
<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-cosmosdb-spring-boot-starter</artifactId>
</dependency>

application.properties

application.propertiesを編集して、
CosmosDBの情報を設定します。

これらの情報はAzureポータルでDBのページから見ることができます。
設定>キーってところです。
このキーはプライマリーキーを使ってください。

pom.xml
1
2
3
4
5
6
7
8
# Specify the DNS URI of your Azure Cosmos DB.
azure.cosmosdb.uri=URI

# Specify the access key for your database.
azure.cosmosdb.key=キー

# Specify the name of your database.
azure.cosmosdb.database=DB名

実装

それでは、DBに名言を追加・取得するような実装をしていきます。
と言っても大した事はする必要がなく、
SpringのCRUD Repositoryを継承したRepositoryを作ると、
基本的なメソッドは実装する必要なく呼び出せてしまいます。

大変便利ですね。

Entity

名言を格納するクラス、Quoteを作成します。
ここで大事なのはDocumentアノテーションでCollection名を指定する事ですね。
@Document(collection = "quote")
また、PartitionKeyにもアノテーションをつけています。

Getter ,Setterとかがめんどくさいので、Lombokの@Dataアノテーションを使用しています。

Quote.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import com.microsoft.azure.spring.data.cosmosdb.core.mapping.Document;
import com.microsoft.azure.spring.data.cosmosdb.core.mapping.PartitionKey;

@Data
@Document(collection = "quote")
public class Quote {

@Id
private String id;

@PartitionKey
private String quoteId;

private String author;
private String content;
}

Repository作る

RepositoryにはCosmosRepositoryを継承したinterfaceを作ります。

QuoteRepository.java
1
2
3
4
@Repository
public interface QuoteRepository extends CosmosRepository<Quote, String>{

}

Cotroller作る

PostでRepositoryのsave()メソッド、
GetでfindById()メソッドを使用しています。
(Getで3をベタうちしているのは見逃してください…)

QuoteController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@RestController
public class QuoteController {

Random rnd = new Random();

@Autowired
QuoteRepository qr;

@GetMapping("/")
public Quote get(){
final int r = rnd.nextInt(3) + 1;
final String id = Integer.toString(r);
final Optional<Quote> q = qr.findById(id);
return q.get();

}

@PostMapping("/")
public Quote post(@RequestBody Quote q){

qr.save(q);
return q;

}

}

ローカルでのテスト

それでは以下のコマンドでまずはローカルから動作確認します。
mvn spring-boot:run

まずはPOSTです
JSONにQuoteの内容を入れてPOSTします。登録された場合、そのQuoteがそのまま返ってきます。

無事に登録されたようです。
登録されたデータはazure上のデータエクスプローラから確認できます。

あと2件はWEBポータル上でGUIから登録てみます。
JSONを貼り付けてSaveを押すだけで登録されます。

_ridなどのアンダーバーから始まるカラムは自動で生成されます。

簡単ですね。
今回はこの3つを登録してみました。

心に刺さる名言達.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
    "id": "1",
    "quoteId": "1",
"author": "Edward V Berard",
    "content": "Walking on water and developing software from a specification are easy if both are frozen."
}
{
    "id": "2",
    "quoteId": "1",
    "author": "pixadel",
    "content": "Fine, Java MIGHT be a good example of what a programming language should be like. But Java applications are good examples of what applications SHOULDN’T be like."
}
{
    "id": "3",
    "quoteId": "1",
    "author": "Larry Wall",
    "content": "Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris."
}

それではGETで名言を取得してみましょう。
こんな感じでランダムに一つQuoteが返ってきます。

デプロイ

それではこのAPIをデプロイしてみましょう。
デプロイはmvn clean package && mvn azure-webapp:deployです。

GETを飛ばしてみます
返ってきました。

これでいつでもどこでも先人の名言に触れることができます。
全く意味がないですが、嬉しかったので、GIFにしてみました。

最後に

いかがだったでしょうか。
このように簡単にAPIが作れるので個人開発が捗りそうですね。
これを参考にSpring boot界隈が盛り上がったら良いなと思っています。

参考

この記事を書くにあたって、以下を参考にしました。
Azure公式のSpring Boot関連記事
https://docs.microsoft.com/ja-jp/azure/developer/java/spring-framework/deploy-spring-boot-java-app-with-maven-plugin

Azure公式のCosmos DB記事
https://docs.microsoft.com/en-us/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-cosmos-db

それでは今日はこの辺で。

【PR】おすすめ技術本

Spring Bootの勉強にはこちらがおすすめです。