Spring Boot と Flyway で実現する DB マイグレーション - DB を壊さず開発から運用まで行う方法
Spring Initializr
次のリンクから Spring Initializr を開き、 Spring Boot プロジェクトを作成してください。
DB 接続情報の作成
application.yaml に、データソース定義を追加します。
マイグレーションを体験するためには、 Spring Boot アプリケーションの起動ごとに DB の初期化がされてしまうと困ります。
そのため今回は、 H2 DB を利用し、 ./target/workshopdb.mv.db という名前の DB ファイルを作成し、そこでデータを管理します。
H2 DB は、デフォルトでユーザー名 sa, パスワード無しでログインできるため、そのように設定しています。
起動確認
この時点で正常に起動できるか確認しましょう。
次のコマンドを実行し、 Spring Boot アプリケーションが正常に起動することを確認してください。
H2 コンソールの確認
Spring Boot アプリケーションを起動した状態で https://localhost:8080/h2-console に接続すると、 H2 コンソールを確認できます。
H2 コンソールでは、 H2 が管理している DB の状態が確認できます。 今回は、 DB マイグレーションの結果をこの H2 コンソールを用いて確認していきます。
H2 コンソールのログイン画面が開くので、 application.yaml に記載したものと同じ接続情報を入力し、 Connect ボタンを押してください。
初期スキーマの作成
src/main/resources/db/migration に DDL を格納することで、 Spring Boot アプリケーション起動時に Flyway が走り、マイグレーションを行ってくれます。
(src/main/resources/db/migration は Flyway のデフォルト探索パス)
今回は ACCOUNT テーブルを作ってみましょう。
src/main/resources/db/migration/V20260203.01__add_account_table.sql:
これだけで、マイグレーションの準備は完了です。
今回は、可読性を重視して「日付.連番」形式を採用しています。 命名規則については、「タイムスタンプ」や「セマンティックバージョニング」など 色々ありますので、プロジェクトの特性や運用条件に応じて選ぶようにしましょう。 ※ チーム内でルールを統一することが重要です。
Spring Boot アプリケーションの起動とスキーマ確認
それではもう一度 Spring Boot アプリケーションを実行してみましょう。
起動ログに、次のようにマイグレーションの結果が表示されます。
ログ上では成功しているので、 http://localhost:8080/h2-console にアクセスし、テーブル定義が存在するか確認してみましょう。
テーブル一覧にテーブル ACCOUNT が存在していることを確認してください。
また、テーブル flyway_schema_history が存在していることに気付いた方もいるかもしれません。
このテーブルは、 Flyway が行ったマイグレーションの履歴を管理するためのテーブルです。
消したり手動で変更したりしないようにしましょう。
このように、適用したマイグレーションファイルを Flyway が管理するため、 マイグレーションが完了したら、作成したマイグレーションファイルを編集しないようにしましょう。
間違いや仕様変更でスキーマが変更されたら、新しいマイグレーションファイルを追加して対応していきます。
スキーマの更新ファイル作成
それではさっそく、「仕様変更でテーブル ACCOUNT にカラム ROLE が必要になった」という想定で、
新しいマイグレーションファイルを作成してみましょう。
src/main/resources/db/migration/V20260203.02__add_role_column_to_account_table.sql:
ALTER 文でカラム ROLE を追加するマイグレーションファイルを新規作成しました。
「expand / contract」という考え方の元、 NOT NULL や DEFAULT をつけずにカラム追加のみを行っています。
NOT NULL や DEFAULT は、次以降のステップで実行することとなります。
Spring Boot アプリケーションの起動と更新したスキーマの確認
それではもう一度 Spring Boot アプリケーションを実行し、 H2 コンソールでカラムが追加されているか確認してみましょう。
Spring Boot 起動時に Flyway が自動実行されるため、新しいマイグレーションが適用されます。
カラムが追加されていることが確認できれば OK です。
並行開発に向けたマイグレーション運用例紹介
実装中は draft ディレクトリにマイグレーションファイルを作り、 レビュー後に migration ディレクトリに移動させてマージするという運用が、 スキーマに厳密なプロジェクトでは行われています。
ただし、この運用を行うには次の条件を満たす必要があります。
- Git の高度な機能が使える
- 機能追加毎に DB をリセットできる環境が整っている
ですので、このあたりの運用は、自分のプロジェクトの特性に合わせ、自分で考えフィットさせていくようにしましょう。
まとめ
今回は、 Spring Boot と Flyway を組み合わせて使った場合の基本的な挙動について学びました。
どうやれば自分のプロジェクトに取り入れられるか、皆さんも考えてみてください。