SpringBoot3✖️FlyWayでDBのマイグレーションを作成する

SpringBoot3(REST API)✖️Next.jsで作るSNSWebアプリケーション

今パートの目標

前回はデータベース接続の第一弾としてPostgresqlJDBCドライバーとSpringDataJpaをインストールし、SpringBootからデータベース操作ができる環境を整えました。
今回はSpringBoot3✖️FlyWayでPostgresqlDBのマイグレーションを作成し、SpringBootからテーブルデータを取得するところまで実施していきたいと思います。

ユーザーテーブルを定義する

マイグレーションを作成する前に今回作成するユーザーテーブルの定義を考えていきたいと思います。

項目名カラム名データ型制約初期値説明
IDidbigserialPRIMARY KEYユーザーを一位に特定する識別子。連番。
ユーザー名usernamevarchar(50)PRIMARY KEYユーザー名
メールアドレスemailvarchar(255)NOT NULLメールアドレス
パスワードpasswordvarchar(72)NOT NULL パスワード
認証フラグactivatedbooleanNOT NULLfalseメールアドレスが認証済みかどうか
作成日時created_at timestampNOT NULL現在日時レコード作成日時
更新日時updated_at timestampNOT NULL現在日時レコード更新日時

簡単に説明します。

データ型

bigserial

連番を意味する型です。
連番型は正確にはデータ型ではなく、テーブルの列に一意の識別子を作成する簡便な表記法です。
内部的には以下のように整数列を作成し、その列のデフォルト値が連番ジェネレータから割り当てられるように割り当てられます。

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
varchar

文字を意味する型です。
varchar型は上限付き可変長の型で、括弧内で指定した数字を上限文字数として文字列を保持できます。
可変長の意味は固定長のchar型と比較するとわかりやすいです。
例えばvarchar(50)とchar(50)のカラムがあり、10文字のデータを保持したい場合、varchar型の場合は10文字で保持しますが、char型の場合は10文字+40文字の空白文字の50文字として保持します。

boolean

真偽値(true or false)を意味する型です。

timestamp

日付と時刻を意味するデータ型です。

▼参考

第8章 データ型

制約

PRIMARY KEY

非NULLかつユニークなカラムとなる主キーを意味する制約です。
内部的には「NOT NULL」と「UNIQUE」を付与しているのと同じです。

NOT NULL

非NULLを意味する制約です。
カラムがNULLになることは無く、必ず値が入るようにするという意味です。

UNIQUE

一意性を意味する制約です。
テーブル内の全ての行でデータが一意であることを確実にします。

▼参考

5.4. 制約

Flywayでマイグレーションを作成する

DBマイグレーションとは

「マイグレーション (Migration)」とは、「移行」 を意味します。
例えば、SpringBoot2からSpringBoot3へ移行することなどもマイグレーションと言い、Migration-Guideというものも提供されています。

▼参考

Spring Boot 3.0 Migration Guide
Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

DBマイグレーションとはデータベースのスキーマ変更をバージョン管理し、新旧の状態に移行させるプロセスのことを言います。
つまりマイグレーションを作成することによって、対象のバージョンの状態までデータベースの状態を戻したり進めたりすることができます。

Flywayを追加する

build.gradleにFlywayライブラリとプラグインを追加します。を追加します。

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.pandaman'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.flywaydb:flyway-core'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'org.postgresql:postgresql'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

bootRun {
    jvmArgs project.findProperty('debug') ?: ''
}
implementation 'org.flywaydb:flyway-core'

これを追加することでSpringBoot起動時に自動でマイグレーションファイルを実行してくれるようになります。

マイグレーションファイルを作成する

マイグレーションファイルとはデータベースのスキーマ変更を管理するためのスクリプトです。
以下のフォルダ配下に作成していきます。

- src
  └ main
    └ resources
      └ db
        └ migration
      └ V1.1__Create_users_table.sql

ファイル名の命名規則についてはドキュメントを参考にして名付けます

# <Prefix><Version>__<Description>.sql
V1.1__Create_users_table.sql

Flyway が扱うマイグレーションには以下3種類があるのですが、主にVersioned Migrationsを使用していきます。
Versioned Migrationsは prefix に付与したバージョンの番号の順番通りに適用されるようなマイグレーションファイルのことです。

  • Versioned Migrations
  • Undo Migrations
  • Repeatable Migrations

詳細は以下ドキュメントを参照してください。

Migrations - Flyway - Product Documentation

マイグレーションファイルを編集する

マイグレーションファイルには実行したいSQLを記載します。
今回は先ほど定義したユーザーテーブルを作成するSQLを記載していきます。

CREATE TABLE users(
    id bigserial PRIMARY KEY
    ,username varchar(50) NOT NULL UNIQUE
    ,email varchar(255) NOT NULL
    ,password varchar(72) NOT NULL
    ,activated boolean NOT NULL DEFAULT 'false'
    ,created_at timestamp NOT NULL DEFAULT current_timestamp
    ,updated_at timestamp NOT NULL DEFAULT current_timestamp
);

マイグレーションを実行する

それではマイグレーションを実行しましょう。
以下コマンドでSpringBootを起動するだけです。

share-favplace-api % docker-compose up -d

無事起動できたら、usersテーブルが作成されていることを確認しましょう。

http://localhost:8888/login
にアクセスし、pgadmin4へログインします。

データベースを確認すると、2つのテーブルが作成されていることがわかると思います。

flyway_schema_historyというテーブルはflywayがバージョン管理をするために自動で作成するテーブルです。
中身を見るとそれらしきレコードが保存されていると思います。

以上でデータベースのマイグレーションができました。

まとめ

Flywayを使用してマイグレーションを作成することができました。
データベースの移行状態の管理を自動化することで快適に開発ができるようになりました。

ここまででデータベース編の準備が完了したので次回は遂にデータベースからデータを取得して、フロントエンドで表示するところまでやってみたいと思います。

コメント

タイトルとURLをコピーしました