Migrasi Database Secara Otomatis Dengan Flyway


Sehari menjelang deadline, tim developer berjuang keras menyelesaikan fitur yang diminta klien. Mereka membuat kode program hingga lembur. Project manager tidak ketinggalan sibuk menyiapkan konsumsi (makanan lezat dan minuman bersoda!) bagi developer yang lembur. Semua bekerja sangat keras!! Dan pada akhirnya, sistem berjalan dengan lancar di server pengujian.

Keesokan harinya, saat para developer tertidur nyenyak di pagi hari, tim integrasi berangkat ke lokasi klien dan men-deploy (meng-install) aplikasi di infrastruktur yang disediakan oleh klien.  Ini adalah saat yang menegangkan dimana harga diri dan nama besar sebuah industri software dipertaruhkan.  Tapi tiba-tiba muncul masalah: ada file JAR yang lupa di-copy, ada versi software yang bentrok di infrastruktur klien, atau skema database di lokasi klien perlu di-update secara manual tapi lupa apa saja field yang telah berubah!  Di hari berikutnya, entah mengapa, tim developer yang masuk kerja dan berharap dirinya menjadi pahlawan, akan kecewa, karena pada umumnya mereka selalu menjadi “kambing hitam”.

Pertanyaannya adalah bagaimana menghindari salah satu permasalahan di atas, yaitu bagaimana caranya memindahkan database dari server pengujian ke server produksi secara aman dan otomatis? Database Administrator (DBA) adalah seorang pekerja ahli di bidang database yang bertanggung jawab atas masalah seperti ini. Tapi bagaimana bila tidak ada DBA di tim, misalnya karena keterbatasan dana sehingga tidak sanggup menggaji DBA?  Atau, pada kasus sederhana, seorang mahasiswa mengembangkan skripsinya di laptop, lalu setelah selesai, si mahasiswa ingin proyek-nya bisa langsung dijalankan di server hosting tanpa perlu repot men-setup database di server hosting? Salah satu solusi yang bisa ditempuh adalah dengan memakai Flyway, seperti yang tertulis pada slogan-nya: “The agile database migration framework for Java“.

Flyway secara otomatis akan membuat tabel schema_version di database yang sedang dipakai. Bila aplikasi saya memiliki file SQL dengan versi yang lebih tinggi dari versi yang tercatat di database yang sedang dipakai, maka Flyway secara otomatis akan mengerjakan file SQL tersebut. Dengan demikian, selama setiap perubahan database di-”catat” ke dalam file SQL, maka perubahan ini akan diterapkan secara konsisten pada database apapun yang sedang dipakai oleh aplikasi.

Untuk memakai Flyway di STS, saya akan men-download file flyway-core-2.0.jar di situs resmi Flyway (http://flywaydb.org). Lalu, saya men-copy  file ini ke folder src/main/webapp/WEB-INF/lib. Bila folder lib belum ada, saya perlu membuatnya secara manual, sehingga struktur proyek akan terlihat seperti pada gambar berikut ini:

Menambahkan file JAR Flyway ke proyek web

Menambahkan file JAR Flyway ke proyek web

Berikutnya, saya harus memberitahu STS agar membaca dependency tidak hanya dari Maven, tapi juga dari folder WEB-INF/lib. Saya men-klik kanan nama proyek, kemudian memilih Properties, Java Build Path, lalu men-klik tab Libraries.  Pada tab tersebut, saya men-klik tombol Add Library, kemudian memilih Web App Libaries, kemudian me-klik Next.  Pada halaman berikutnya, saya memilih nama proyek saya di bagian Project, lalu men-klik tombol Finish.  Sekarang, build path tidak hanya berdasarkan Maven Dependencies saja, tapi juga Web App Libraries seperti yang terlihat pada gambar berikut ini:

Build path dengan WEB-INF/lib

Build path dengan WEB-INF/lib

Setelah ini saya perlu membuat file SQL yang berisi definisi struktur tabel dan juga data awal. File SQL ini harus berada di lokasi yang diharapkan oleh Flyway, yaitu di package db.migration (lokasi ini dapat diubah jika perlu). Selain itu, file SQL ini juga harus memiliki nama file sesuai dengan pola yang ditentukan oleh Flyway, misalnya V1_0__Versi_Awal.sql. Peraturan bawaannya adalah:

  • Nama file harus diawali dengan V.
  •  Setelah V adalah angka yang menunjukkan versi seperti 1, 1_0, 1_0_0 dan sebagainya. Underscore dipakai sebagai pemisah dalam versi.
  • Setelah angka versi wajib diikuti oleh dua buah underscore (__).
  • Berikutnya adalah label keterangan.
  • Nama file harus diakhiri dengan sql.

Gambar berikut ini memperlihatkan contoh struktur proyek yang berisi file SQL dengan versi 1.0:

Lokasi file SQL

Lokasi file SQL

File SQL ini nantinya akan dikerjakan bila database yang dipakai baik di laptop maupun di server hosting masih “kosong“. Bila saya ingin tabel user secara otomatis dibuat, kemudian sebuah user administrator akan ditambahkah pada tabel tersebut, maka isi file SQL saya akan terlihat seperti:

CREATE TABLE `user` (
 `email` varchar(100) NOT NULL,
 `nama` varchar(100) NOT NULL,
 `password` varchar(200) NOT NULL,
 PRIMARY KEY (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `user` (`email`,`nama`,`password`) 
VALUES ('admin@snake.com','administrator', 'jocki');

Berikutnya, saya perlu mengubah file konfigurasi Spring.  Sebagai contoh, saya menyimpan konfigurasi database di file jpa-tx-config.xml, sehingga saya perlu menambahkan definisi bean seperti berikut ini:

<!-- Memakai Flyway untuk melakukan migrasi perubahan database secara otomatis -->
<bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate">
 <property name="dataSource" ref="dataSource" />
</bean>

Saya harus memastikan bahwa Flyway dipanggil sebelum JPA Entity Manager dibuat. Oleh sebab itu saya menambahkan depends-on pada definisi Entity Manager Factory seperti pada contoh berikut ini:

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" depends-on="flyway">
 ... [isi tidak berubah!]
</bean>

Sekarang, jika saya memindahkan aplikasi ke komputer lain yang database-nya masih kosong, saya tidak perlu repot mengotak-atik database.  Hal ini karena begitu saya menjalankan aplikasi di server Tomcat, maka Flyway akan bekerja secara otomatis menjalankan file SQL untuk mengisi database yang masih kosong.

About these ads

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Logout / Ubah )

Twitter picture

You are commenting using your Twitter account. Logout / Ubah )

Facebook photo

You are commenting using your Facebook account. Logout / Ubah )

Google+ photo

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

Ikuti

Get every new post delivered to your Inbox.

Bergabunglah dengan 29 pengikut lainnya.

%d bloggers like this: