Spring Boot と データベースマイグレーション


Spring Boot と DB Migration ツール Harmonica を使って、 アプリケーションを作る流れをまとめました。 Harmonica は Kotlin でできたデータベースマイグレーションのツールです。

環境

次のツール類を使います。

  • Kotlin 1.3.20
  • Spring Boot 2.1.2
  • Harmonica 1.1.17
  • PostgreSQL
  • IntelliJ IDEA
  • JDK 11 (JDK 8 またはそれ以降のバージョンならOK)

アプリケーションのベースを作る

まず、 アプリケーションのベースを Spring Initializr を使って生成します。

画面上で、次のコンポーネントを選択します。

  • Gradle
  • Kotlin
  • Spring Boot 2.1.2

プロジェクトのメタデータ(Group ID, Artifact ID)はそのままにしておきます。

そして次の依存関係を追加します。

  • Web
  • PostgreSQL
  • JPA
  • Thymeleaf

過去の記事では、 kotlinx.html を使ってビューを作成していましたが、 今回は 使用者が一番多いと思われる Thymeleaf を使います。

“Generate Project” ボタン をクリックして、 ダウンロードされる zipファイル を展開します。 次のようなファイル構造になっているはずです。

PostgreSQL の準備

次のように、データベースの設定をします。

データベース名 demo
ユーザ名 develoepr
パスワード developer
ポート 5432 (デフォルトのポート)

もし PostgreSQL が手元にない場合は、 Docker を使って次のように準備できます。

もしデータベースのポートを変更したければ、 最初の 5432 を別のポート番号に変更してください。

IntelliJ IDEA でプロジェクトを開く

メニュー “File” の “Open” をクリックして、 ファイル “settings.gradle” を選択します。 すると、プロジェクトとして開くかファイルとして開くかを尋ねるダイアログが表示されます。 プロジェクトとして開くため、 “Open as a Project” ボタン をクリックします。

その後、ダイアログが表示されるので必要項目を設定して “OK” ボタン をクリックします。

build.gradle を開いて Kotlin のバージョンを 1.3.20 に変更します。

マイグレーション

モジュールの追加

マイグレーションのためのモジュールを追加します。 IDE 左側 にある プロジェクト ツールウインドウ で、 トップのディレクトリを選択します。 “File” メニュー から、 “New”、”Module” をクリックします。 すると “New Module” ダイアログ が表示されます。 ダイアログの左ペインで “Gradle” を選択し、 右ペインで “Kotlin (Java)” を選択した上で、 “Next” ボタン をクリックします。

そして、次のように設定して “Next” ボタン をクリックし、 モジュールを追加します。

Add as module to demo
GroupId com.example (Inherit)
ArtifactId db
Version 0.0.1-SNAPSHOT (Inherit)

自動的に同期が行われ、次のエラーが表示されます。

そこで db/build.gradle を開き、 Kotlin プラグイン の バージョン を削除し、 ライブラリを追加します。

設定

データベースとディレクトリの設定を行います。

次の式を build.gradle の最下部に記述します。

そして、次のコマンドを実行します。

ファイル db/src/main/kotlin/com/example/demo/db/config/Default.kt を作成して、 次のように記述します。

マイグレーションの追加と実行

マイグレーションを追加します。 次のコマンドを実行します。

すると ファイル db/src/main/kotlin/com/example/demo/db/migration/Mxxxxxxxxxxxxxxxxxx_CreateTask.kt が生成されます。 それを次のように変更します。

マイグレーションを次のように実行します。

次のように出力されます。

データベースの確認

psql を使ってデータベースを確認してみます。

テーブル harmonica_migration には実行されたマイグレーションのバージョンが登録されています。 テーブル task がタスクを格納するテーブルで、 task_id_seq シーケンス は 自動で作られたもので、 task のインデックスを付番するものです。

task テーブル の id カラム は自動的に追加されます。

メインアプリケーションの構築

メインの Spring Boot を使ったアプリケーションを構築します。 下のようにファイルを作成していきます。

設定の追加

application.propertiesDemoApplication クラス を更新します。

データベースの接続設定を application.properties に追加します

タイムスタンプの自動更新を有効にするため、 アノテーション @EnableJpaAuditingDemoApplication クラス に付与します。

エンティティの作成

データベースのレコードに対応するエンティティを作成します。 Task クラス を domain/task/Task.kt として作成します。

@EntityListeners, @CreateDate および @LastModifiedDate はタイムスタンプ自動更新のために追加しています。

リポジトリ作成

Task エンティティ をデータベースから取得する TaskRepository インターフェースを作成します。 ファイル domain/task/TaskRepository.kt に記述します。

ビューテンプレートの作成

ビューテンプレート resources/templates/task/index.html を作成します。

コントローラ作成

コントローラを作成します。 ファイル presentation/task/TaskController.kt を作成し、 TaskController クラス を記述します。

アプリケーションの実行

コマンド ./gradlew bootrun を実行して、 しばらくすると起動が完了します。 その後、 http://localhost:8080/task にブラウザでアクセスすると確認できます。 画面からタスクを追加・削除できます。

図: 2つのタスクを追加したところ

このデモプロジェクトのコードは GitHub にあります。