目次
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ファイル を展開します。 次のようなファイル構造になっているはずです。
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 |
demo/ |- build.gradle |- gradle/ | `- wrapper/ | |- gradle-wrapper.jar | `- gradle-wrapper.properties |- gradlew |- gradlew.bat |- settings.gradle `- src/ |- main/ | |- kotlin/ | | `- com/ | | `- example/ | | `- demo/ | | `- DemoApplication.kt | `- resources/ | |- application.properties | |- static/ | `- templates/ `- test/ `- kotlin/ `- com/ `- example/ `- demo/ `- DemoApplicationTests.kt |
PostgreSQL の準備
次のように、データベースの設定をします。
データベース名 | demo |
---|---|
ユーザ名 | develoepr |
パスワード | developer |
ポート | 5432 (デフォルトのポート) |
もし PostgreSQL が手元にない場合は、 Docker を使って次のように準備できます。
1 |
docker run -d -p 5432:5432 --name demo -e POSTGRES_USER=developer -e POSTGRES_PASSWORD=developer -e POSTGRES_DB=sample postgres:11 |
もしデータベースのポートを変更したければ、 最初の 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) |
自動的に同期が行われ、次のエラーが表示されます。
1 |
org.gradle.api.ProjectConfigurationException: A problem occurred configuring project ':db'. |
そこで db/build.gradle
を開き、 Kotlin プラグイン の バージョン を削除し、 ライブラリを追加します。
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
buildscript { ext { kotlinVersion = '1.3.20' } repositories { jcenter() } dependencies { classpath group: 'org.jetbrains.kotlin', name: 'kotlin-script-util', version: kotlinVersion classpath 'com.improve_future:harmonica:1.1.17' } } plugins { id 'org.jetbrains.kotlin.jvm' } apply plugin: 'jarmonica' group 'com.example' version '0.0.1-SNAPSHOT' repositories { mavenCentral() jcenter() } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" runtimeOnly 'org.postgresql:postgresql:42.2.5' implementation 'com.improve_future:harmonica:1.1.17' implementation group: 'org.reflections', name: 'reflections', version: '0.9.11' } compileKotlin { kotlinOptions.jvmTarget = "1.8" } compileTestKotlin { kotlinOptions.jvmTarget = "1.8" } |
設定
データベースとディレクトリの設定を行います。
次の式を build.gradle
の最下部に記述します。
1 2 |
extensions.extraProperties["migrationPackage"] = [project.group, project.rootProject.name, project.name].join(".") |
そして、次のコマンドを実行します。
1 |
mkdir -p db/src/main/kotlin/com/example/demo/db/config |
ファイル db/src/main/kotlin/com/example/demo/db/config/Default.kt
を作成して、 次のように記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package com.example.demo.db import com.improve_future.harmonica.core.DbConfig import com.improve_future.harmonica.core.Dbms config Default : DbConfig({ dbms = Dbms.PostgreSQL dbName = "demo" host = "127.0.0.1" user = "developer" password = "developer" // Add port configuration if you need // port = 5432 }) |
マイグレーションの追加と実行
マイグレーションを追加します。 次のコマンドを実行します。
1 |
./gradlew jarmonicaCreate -Pname=CreateTask |
すると ファイル db/src/main/kotlin/com/example/demo/db/migration/Mxxxxxxxxxxxxxxxxxx_CreateTask.kt
が生成されます。 それを次のように変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.example.demo.db.migration import com.improve_future.harmonica.core.AbstractMigration /** * CreateTask */ class M20190209141813199_CreateTask : AbstractMigration() { override fun up() { createTable("task") { varchar("name", size = 200, nullable = false) dateTime("created_at", nullable = false) dateTime("updated_at", nullable = false) } } override fun down() { dropTable("task") } } |
マイグレーションを次のように実行します。
1 |
./gradlew jarmonicaUp |
次のように出力されます。
1 2 3 4 5 |
> Task :db:jarmonicaUp jdbc:postgresql://127.0.0.1:5432/demo?autoReconnect=true == [Start] Migrate up 20190209141813199 == Create Table: task == [End] Migrate up 20190209141813199 == |
データベースの確認
psql
を使ってデータベースを確認してみます。
1 2 3 4 5 6 7 8 |
demo=# d List of relations Schema | Name | Type | Owner --------+---------------------+----------+----------- public | harmonica_migration | table | developer public | task | table | developer public | task_id_seq | sequence | developer (3 rows) |
テーブル harmonica_migration
には実行されたマイグレーションのバージョンが登録されています。 テーブル task
がタスクを格納するテーブルで、 task_id_seq
シーケンス は 自動で作られたもので、 task
のインデックスを付番するものです。
1 2 3 4 5 6 7 8 9 |
demo=# d task Table "public.task" Column | Type | Collation | Nullable | Default ------------+-----------------------------+-----------+----------+---------------------------------- id | integer | | not null | nextval('task_id_seq'::regclass) name | character varying(200) | | not null | created_at | timestamp without time zone | | not null | Indexes: "task_pkey" PRIMARY KEY, btree (id) |
task
テーブル の id
カラム は自動的に追加されます。
Spring Boot と データベースマイグレーション (1/2) に続きます。 そちらでは、 メインアプリケーションの構築(設定の追加, エンティティの作成, リポジトリ作成, ビューテンプレートの作成, コントローラ作成), アプリケーションの実行について説明します。