Dalam pengembangan sebuah aplikasi dengan framework-framework modern seperti Laravel, Rails, Spring Boot, dsb, ada satu hal yang benar-benar harus diperhatikan yaitu perubahan struktur (skema) pada database — ini terjadi seiring dengan berkembangya aplikasi yang dibuat. Sebenarnya, untuk menangani perubahan pada struktur (skema) di database bisa saja dilakukan secara manual, namun hal ini tidak disarankan karena sering terjadi human error (lupa), tidak sinkron, dan susah dilacak perubahannya. Untungnya, saat ini sudah banyak tools — baik bawaan dari framework maupun third party — yang bisa mengotomatisasi perubahan ini. Istilah kerennya untuk proses otomatisasi ini adalah Database Migration (koreksi jika saya salah).

Salah satu tool (third party) untuk proses Database Migration adalah Flyway. Tool ini bisa digunakan pada berbagai Framework karena bekerja langsung dengan database, bukan tergantung pada framework tertentu. Namun tulisan ini akan fokus membahas penggunaan Flyway pada Spring Boot.
Integrasi Flyway dengan Spring Boot
Pre requirement:
- Maven
- MySQL Database
1. Buat project Spring Boot
Kunjungi halaman https://start.spring.io/,
Pada layout bagian kiri konfigurasinya adalah sebagai berikut:
- Opsi Project pilih Maven
- Opsi Language pilih Java
- Opsi Spring Boot pilih 3.5.4 (versi terbaru Spring Boot saat ini)
- Project Metadata:
- Group: io.gitlab.dedeirwanto (disesuaikan)
- Artifact: flyway-db-migration (disesuaikan)
- Name: flyway-db-migration (disesuaikan)
- Description: Belajar Flyway Database Migration (disesuaikan)
- Package name: io.gitlab.dedeirwanto.flyway (disesuaikan)
- Packaging: Jar
- Java: 21 (disesuaikan)
Pada layout bagian kanan tambahkan dependency berikut:
- MySQL Driver
- Flyway Migration
- Spring Data JPA
- Spring Web

Klik Generate.
2. Pastikan dependency flyway-core
dan flyway-mysql
Ekstrak file yang sudah digenerate tadi dan buka project dengan text editor (saya menggunakan Intellij IDEA),

Buka file pom.xml
, pastikan dependency flyway-core
dan flyway-mysql
sudah ada,

3. Konfigurasi Database
Buka file aplication.properties
, tambahkan konfigurasi berikut untuk menghubungkan Database dengan Spring Boot,
spring.datasource.driver-class-name= com.mysql.cj.jdbc.Driver
spring.datasource.url= jdbc:mysql://localhost:32770/flyway_db?createDatabaseIfNotExist=true
spring.datasource.username= root
spring.datasource.password= root
📝 Sesuaikan port, nama, username, dan password database dengan konfigurasi kalian.
4. Jalankan Spring Boot
Jalankan Spring Boot dengan perintah,
mvn clean spring-boot:run
Output:

Terlihat bahwa Flyway sudah aktif namun belum ada migrasi skema yang dijalankan. Ini karena kita belum membuat skema untuk Database Migration.
5. Cek tabel flyway_schema_history
Buka database yang sudah dibuat tadi (flyway_db) dengan aplikasi Database Manager seperti DBeaver, phpMyAdmin, atau MySQL Workbrench. Disini saya menggunakan Database Manager bawaan Intellij IDEA.

Pada tabel flyway_schema_history
inilah nantinya semua history Database Migration akan disimpan.
Contoh Kasus
Skenario Awal
Misalnya kita mempunyai skenario sebagai berikut:
Pada tahap awal pengembangan aplikasi kita diminta untuk membuat sebuah tabel dengan nama users
. Tabel ini mempunyai atribut-atribut seperti:
- id
- username
- password
- nama_lengkap
Buat skema untuk tabel users
Buat file baru bernama V1_0__buat_tabel_users.sql
pada folder src/main/resources/db/migration
,

Buat skema tabel users
,
CREATE TABLE users (
id VARCHAR(36) NOT NULL PRIMARY KEY,
username VARCHAR(10) NOT NULL,
password VARCHAR(200) NOT NULL,
nama_lengkap VARCHAR(100) NOT NULL
) ENGINE=InnoDB;
Simpan dan jalankan ulang Spring Boot,
mvn clean spring-boot:run

Terlihat bahwa skema yang kita buat sudah dijalankan.
Cek ulang tabel flyway_schema_history dan tabel users
Untuk memastikan bahwa skema di atas benar-benar dijalankan, periksa ulang tabel flyway_schema_history
dan tabel users
pada database flyway_db
,


Pada gambar di atas terlihat bahwa tabel users
sudah berhasil dibuat dan history dari Database Migration sudah tersimpan pada tabel flyway_schema_history
.
Terjadi Perubahan Skenario
Seiring berkembangnya aplikasi mungkin saja terjadi perubahan pada proses bisnis, Misalnya perubahan pada form registrasi. Awalnya pengguna hanya diminta untuk untuk memasukkan username, password, dan nama lengkap. Setelah aplikasi berkembang, ternyata pengguna juga harus memasukkan nomor handpone, email, dan alamat. Sehingga developer harus menambahkan atribut baru pada tabel users
yang sebelumnya sudah dibuat.
Implementasi penambahan atribut baru pada tabel users
Buat file baru bernama V1_1__tambah_kolom_hp_email_alamat_tabel_users.sql
pada folder src/main/resources/db/migration
,

Tambahkan kode DDL (Data Definition Language) berikut,
ALTER TABLE users
ADD nomor_handphone VARCHAR(15) NOT NULL,
ADD email VARCHAR(50) NOT NULL,
ADD alamat VARCHAR(100) NOT NULL;
Simpan dan jalankan ulang Spring Boot,
mvn clean spring-boot:run
Output:

Skema V1_1__tambah_kolom_hp_email_alamat_tabel_users.sql
berhasil dijalankan.
Periksa tabel flyway_schema_history dan tabel users
Untuk memastikan skema tadi benar-benar dijalankan, periksa ulang tabel flyway_schema_history
dan tabel users
,


Penutup
Secara sederhana, Flyway akan memeriksa file migrasi pada folder db/migration
kemudian membandingkannya dengan history pada tabel flyway_schema_history
. Jika ternyata file migrasi sudah tercatat pada history database, maka file terserbut tidak akan dijalankan lagi. Penamaan versi pada file migrasi — V1_0__xxx, V1_1__xxx, dst.
— akan menentukan urutan file yang dijalankan. Secara otomatis, versi lebih rendah akan dijalankan terlebih dahulu.
Source code contoh kasus di atas sudah saya upload di GitLab repository: https://gitlab.com/dedeirwanto/flyway-db-migration
Sekian, semoga bermanfaat.
CMIIW.