Spring BootとTiDBによるWebアプリケーションの構築
※このブログは2022年8月25日に公開された英語ブログ「Building a Web Application with Spring Boot and TiDB」の拙訳です。
著者:Qizhi Wang (PingCAPシニアソフトウェアエンジニア)
編集者:Fendy Feng, Tom Dewan, Rick Golba
Webアプリケーションの開発者は、より良いアプリケーションをより速く、より簡単に構築することを常に追求しています。このブログでは、開発プロセスを簡素化し、アプリケーションの目標を容易に実現する2つの優れたツール、Spring BootとTiDBについて紹介します。Spring Bootは、スタンドアロンのプロダクショングレードのWebアプリケーションをより速く、より簡単に構築できる人気のオープンソースツールです。TiDBは、オープンソースのSQLデータベースで、簡素化された分散型アーキテクチャ、伸縮自在のスケーラビリティ、MySQLとの互換性などを備えています。アプリケーションのデータがどんなに大きくても、簡単かつリアルタイムに処理、分析できるようにします。
今回は、Spring Bootを使って、TiDBをデータベースとするサンプルゲームアプリを構築します。このアプリでは、各プレイヤーは一意のIDを持っています。また、プレイヤーはコインとグッズの2つの属性を持ち、互いにトレードすることができます。
では、このゲームアプリの作り方を探っていきましょう。その前に、最終的にどのようなアプリケーションになるのか知りたい方は、GitHubでソースコード全体を見ることができます。
JDKとApache Mavenのインストール
アプリケーションの依存関係を管理するために、Java Development Kit (JDK) とApache Mavenをインストールする必要があります。詳細なガイダンスについては、JDKのインストール方法およびMavenのインストール方法に関するドキュメントを参照してください。
TiDBクラスタの作成と起動
ローカルにTiDBクラスタを作成するか、フルマネージドなDatabase-as-a-Service (DBaaS) であるTiDB Cloudの無料クラスタを作成することができます。
- ローカルのTiDBクラスタを作成するには、ローカルのテストクラスタのデプロイまたはTiUPを使用したTiDBクラスタのデプロイのいずれかを参照してください。
- TiDB Cloudの無料クラスタを作成するには、TiDB CloudでTiDBクラスタを構築するを参照してください。
アプリケーションコードの取得
- サンプルアプリケーションのリポジトリをローカル環境にダウンロードまたはクローンし、spring-jpa-hibernateディレクトリに移動します。
- 同じ依存関係を持つ空のアプリケーションを作成します。Spring Initializrを使用して、サンプルゲームと同じ構造を生成します。以下のようにフィールドを埋めてみましょう。

設定を終えると、アプリケーションは実行できますが、MySQL dialectを使用する場合のみです。これは、Hibernateがバージョン6.0.0.Beta2以降でTiDB dialectをサポートしているためです。しかし、Spring Data Java™ Persistence API (JPA) のHibernateへのデフォルトの依存関係は5.6.4.Finalです。そのため、pom.xmlを以下のように変更することをお勧めします。
- 以下の依存関係ファイルのように、Spring Data JPAで導入されたjakartaパッケージを除外してください。以下のように依存関係ファイルを変更します:
From:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
To:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.hibernate</groupId> <artifactId>hibernate-core-jakarta</artifactId> </exclusion> </exclusions> </dependency>
- この依存関係ファイルに示されているように、6.0.0.Beta2以降のHibernate依存関係を導入します:
<dependency> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-core</artifactId> <version>6.0.0.CR2</version> </dependency>
これらの変更を行うと、ゲームアプリケーションと同じ依存関係を持つ空のSpring Bootアプリケーションができあがります。
アプリケーションを実行する
先ほど作成した空のアプリケーションでは、Hibernateがテストデータベース内にplayer_jpa テーブルを作成します。アプリケーションのRESTful APIを使用してリクエストを行うと、これらのリクエストはTiDBクラスタ上でデータベーストランザクションを実行します。
TiDB Cloudクラスタを使用する場合は、src/main/resourcesディレクトリに移動し、application.ymlファイルで、spring.datasource.url、spring.datasource.username、spring.datasource.passwordを設定してください。
spring: datasource: url: jdbc:mysql://localhost:4000/test username: root # password: xxx driver-class-name: com.mysql.cj.jdbc.Driver jpa: show-sql: true database-platform: org.hibernate.dialect.TiDBDialect hibernate: ddl-auto: create-drop
パスワードを123456にした場合、TiDB Cloudで取得できる接続文字列は次のようになります:
mysql --connect-timeout 15 -u root -h xxx.tidbcloud.com -P 4000 -p
もちろん、実際にプロジェクトを作成する際には、より安全性の高いパスワードを使用することをお勧めします。
次に、以下のようにパラメータを設定します;
spring: datasource: url: jdbc:mysql://xxx.tidbcloud.com:4000/test username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver jpa: show-sql: true database-platform: org.hibernate.dialect.TiDBDialect hibernate: ddl-auto: create-drop
これらの変更を行った後、アプリケーションを実行することができます。
以下のように、ターミナルセッションを開きディレクトリに移動します:
cd <path>/tidb-example-java/spring-jpa-hibernate
Makeでアプリケーションをビルドして実行します。
make
HTTPリクエスト
サービスが起動したら、バックエンドアプリケーションにHTTPリクエストを送ることができます。http://localhost:8080は、サービスを提供するベースURLです。このアプリケーションを使用するには、PostmanやcURLなど、さまざまなHTTPリクエストを使用できます。このチュートリアルでは、Postmanリクエストを使用して、このアプリケーションの使用方法を説明します。
Postmanのリクエストを利用する

プレイヤー作成
「Create (作成)」タブと「Send (送信)」ボタンをクリックして、http://localhost:8080/player/ にPOSTリクエストを送信します。戻り値は、追加されたプレーヤーの数で、1であることが期待されます。

IDでプレイヤー情報を取得する
「GetByID」タブと「Send」ボタンをクリックして、http://localhost:8080/player/1にGETリクエストを送信します。戻り値はIDが1のプレーヤーの情報です。

プレイヤー情報を制限数で一括取得
「GetByLimit」タブと「Send」ボタンをクリックすると、http://localhost:8080/player/limit/3にGETリクエストが送信されます。戻り値は、最大3人のプレイヤーの情報リストです。

プレーヤー情報をページ単位で取得
「GetByPage」タブと「Send」ボタンをクリックして、http://localhost:8080/player/page?index=0&size=2にGETリクエストを送信してください。戻り値は、インデックス0のページで、1ページあたり2人のプレーヤーが表示されます。戻り値には、オフセット、totalPages、ソート順などのページング情報も含まれています。

プレイヤー数
「Count」タブをクリックし、「Send」ボタンをクリックすると、http://localhost:8080/player/countにGETリクエストが送信されます。戻り値はプレイヤーの数です。

プレーヤー取引
「Trade (取引)」タブをクリックし、「Send」ボタンをクリックして、http://localhost:8080/player/tradeにPUTリクエストを送信します。リクエストのパラメータは、売り手のID (sellID)、買い手のID (buyID)、購入した商品の金額、購入金額に対して消費したコインの枚数です。
戻り値は取引が成功したかどうかを示す。売り手が十分な商品を持っていないとき、買い手が十分なコインを持っていないとき、またはデータベースエラーがあるとき、データベーストランザクションは取引が成功しないことを保証し、プレイヤーのコインや商品が失われることはありません。

まとめ
このブログでは、Spring BootとTiDBを使用してゲームアプリケーションを構築する方法を学び、いかに素早く簡単にそれができるかを見てきました。このゲームに関する実装の詳細を知りたい方は、ドキュメントの実装の詳細ページをご覧ください。
TiDBを体験するには、コミュニティエディションまたはTiDB Cloud無料トライアルをお試しください。日本語ドキュメントのTiDBクイックスタートガイド、またはTiDB Cloudワークショップガイドのご利用をお勧めします。ご不明な点などございましたら、お問い合わせフォームよりご連絡ください。 また、GitHubにて問題を報告することもできます。
その他の参考資料:
RetoolとTiDB Cloudを使って30分でリアルタイムカンバンを作る