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).

Ilustrasi: Spring Boot & Flyway.
Ilustrasi: Spring Boot & Flyway.

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
Gambar Spring Initializer.
Gambar Spring Initializer.

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),

Gambar tampilan awal Intellij IDEA.
Gambar tampilan awal Intellij IDEA.

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

Gambar pom.xml.
Gambar pom.xml.

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:

Output perintah mvn clean spring-boot:run
Output perintah mvn clean spring-boot:run

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.

Gambar tabel flyway_schema_history pada database flyway_db
Gambar tabel flyway_schema_history pada database flyway_db

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,

Gambar file V1_0__buat_tabel_users.sql pada Intellij IDEA
Gambar file V1_0__buat_tabel_users.sql pada Intellij IDEA

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
Gambar Skema versi 1.0 - buat tabel user dijalankan
Gambar Skema versi 1.0 - buat tabel user dijalankan

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,

Gambar history Database Migration pada table flyway_schema_history
Gambar history Database Migration pada table flyway_schema_history
Gambar tabel users dan atribut-atributnya.
Gambar tabel users dan atribut-atributnya.

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,

Gambar file V1_1__tambah_kolom_hp_email_alamat_tabel_users.sql pada Intellij IDEA.
Gambar file V1_1__tambah_kolom_hp_email_alamat_tabel_users.sql pada Intellij IDEA.

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:

Output mvn clean spring-boot:run
Output mvn clean spring-boot:run

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,

Gambar history Database Migration pada table flyway_schema_history
Gambar history Database Migration pada table flyway_schema_history
Gambar tabel users dengan atribut yang baru ditambahkan.
Gambar tabel users dengan atribut yang baru ditambahkan.

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.