Automatic Data Seeding & Data Migration Aplikasi Go(lang) pada Heroku

Pendahuluan

Sebagai backend developer, tentu saja kita tidak bisa terlepas berurusan dengan database, terutama mendefinisikan/mengubah skema dari database yang ingin kita buat serta mempopulasi data pada database sehingga mempermudah pengujian. Kedua aktivitas tersebut dapat didefinisikan sebagai data migration (proses mendefinisikan/mengubah skema atau rancangan data dari database) dan data seeding(proses mempopulasi database dengan sekumpulan data). Proses data migration ini tentu saja masih bisa dilakukan secara manual apabila skema yang dirancang mempunyai entitas data yang sedikit dengan menggunakan query SQL. Namun bayangkan apabila jenis entitas tersebut banyak. Tentu saja akan memakan banyak waktu & tenaga apabila dilakukan dengan mengeksekusi query SQL satu per satu. Begitupun untuk data seeding. Bayangkan apabila terdapat banyak data yang ingin dipopulasikan sebagai data awal pada aplikasi. Tentu saja akan memakan waktu & tenaga untuk memasukkan data tersebut satu per satu dengan menggunakan query SQL Untungnya, terdapat cara otomatis (untuk data seeding tidak bisa dibilang sepenuhnya otomatis) untuk melakukan proses data migration & seeding. Pada artikel ini Saya akan membahas cara mengotomasi proses data migration & seeding untuk aplikasi web service go yang berjalan di Heroku.

Data Migration

Untuk proses data migration sendiri sebenarnya terdapat dua proses yakni migrate up dan migrate down. Perbedaan keduanya adalah, migrate up akan memperbarui skema database dengan menggunakan skema terbaru sedangkan migrate down akan melakukan rollback atau mengembalikan skema database ke skema sebelumnya. Untuk pembahasan kali ini, saya akan bagaimana proses melakukan migrate up secara otomatis, karena proses migrate up menurut saya paling sering terjadi pada proses deployment sehingga sangat memungkinkan untuk diotomasi. Saya dan backend developer lain (Galang dan Akbar) pada kelompok For Future Use menggunakan library GORM untuk memudahkan proses penulisan kode query database pada Go(lang). Library tersebut sudah menyediakan method bernama AutoMigrate. Method ini akan melakukan proses migration terhadap suatu entitas database. Dengan ini maka idenya adalah kita perlu membuat suatu metode yang mengeksekusi AutoMigrate untuk semua entitas yang akan digunakan pada database ketika kode pertama kali dijalankan. Dengan metode tersebut, maka kita tidak perlu membuat tahap inisialisasi database pada heroku (Mendefinisikan schema yang digunakan dengan mengeksekusi query, Membuat Table, dsb) karena semua hal tersebut sudah ditangani oleh method AutoMigrate. Sebagai contoh, saya akan mengambil contoh implementasi pada proyek PPL kami bagaimana melakukan proses data migration untuk entitas User. Sebagai catatan, entitas User menyimpan data yang berkaitan dengan pengguna website seperti email, password, role, status, dan nama.

Data Seeding

Setelah mengetahui bagaimana cara melakukan proses data migration, maka selanjutnya Saya akan membahas bagaimana cara melakukan data seeding dengan menggunakan kode golang untuk proses seeding. Saya akan mengambil contoh seeding data penetapan hari sidang. Berikut merupakan struktur skema dari entitas penetapan hari sidang.

  1. Setelah terhubung dengan database server, langkah selanjutnya adalah mendefinisikan repository. Repository inilah yang mengeksekusi query database yang berkaitan dengan entitas penetapan hari sidang (Line 62).
  2. Melakukan seeding sebanyak 10000 data penetapan hari sidang (line 66–74). Besar datanya (nilai NData) tentunya perlu disesuaikan dengan kapabilitas dari database server dan juga keinginan.
  3. Mendefinisikan satu entitas data penetapan hari sidang (Line 67). Baris ini akan memanggil getValidPenetapanHariSidang yang mengisi atribut-atribut dari instance entitas penetapan hari sidang dengan data yang valid secara acak (kecuali untuk id pengaju dan dokumen penetapan hari sidang). Pada atribut NamaMajelisHakim, NamaPaniteraPengganti, maka akan digunakan data nama valid yang dihasilkan secara acak. Pada atribut NamaTerdakwa (string array), maka akan digunakan array yang berisikan daftar nama dengan panjang array yang bervariasi. Lalu untuk nomor perkara akan dihasilkan string dengan format nomor surat perkara secara acak. Dan untuk elemen tipe terakhir yakni TanggalPenetapanSidang & TanggalHariSidangPertama(datestring) akan dihasilkan string tanggal dengan format “YYYY(tahun)-MM(bulan)-dd(tanggal)” secara acak.
  4. Setelah diperoleh satu instance penetapan hari sidang yang valid, maka langkah selanjutnya yang dilakukan adalah memasukan instance tersebut ke database dengan memanfaatkan repository. Method create pada repository akan melakukan query “INSERT” instance tersebut ke database postgreSQL yang sudah terhubung. (Line 68).
$ heroku login #login ke heroku
$ heroku run bash -a <nama-aplikasi> #Masuk ke terminal aplikasi heroku
$ cd bin #Masuk ke direktori bin
$ ./penetapan_hari_sidang #Mengeksekusi binary penetapan_hari_sidang

Penutup

Proses data migration & data seeding berguna untuk memudahkan backend developer untuk mengganti skema data dan juga mempopulasi data. Proses populasi data akan memudahkan backend developer untuk menguji performa, skalabilitas aplikasi karena database sudah terisi dengan data. Bagi frontend developer, database aplikasi yang sudah terpopulasi memudahkan pengecekan apakah implementasi integrasi frontend & backend sudah berhasil dilakukan. Kedua hal tersebut ternyata cukup mudah dilakukan pada golang dengan adanya library GORM, build aplikasi golang yang akan menghasilkan binary program yang bisa dieksekusi secara native, serta proses build heroku yang cukup canggih untuk mendeteksi program mana yang perlu dijadikan sebagai binary. Sekian penjelasan dari Saya, mudah-mudahan dapat bermanfaat.

Referensi