Light My Fire: Kesan pertama berkenalan dengan Firebase untuk pengembangan web tingkat pemula
Tags: firebase, indonesian
Published: 2020-04-30 07:16:34

Entah dari mana asalnya, tiba-tiba aku mendapat ilham untuk membuat sebuah produk dalam format web app. Bukan produknya yang akan dibahas di sini (karena memang belum dibuat), melainkan salah satu bagian dari stack yang kupilih, yaitu **Firebase**.

Kendala utama yang menghalangiku mewujudkan ide tersebut adalah backend dan devops. Jujur, kemampuanku di dua bidang itu sangat kurang. Aku bisa bekerja dengan API yang sudah ada, paham dasar-dasar model data dan relasinya, tapi kalau harus membuat sendiri database untuk web app yang (inginnya) digunakan banyak user, belum lagi harus mengatur hosting dan deployment… nyerah. 😬

Akhirnya aku memberanikan diri untuk bertanya di DEV.to.

{% link ekafyi/the-most-simple-stack-to-create-a-web-app-for-public-use-4fij %}

Nggak disangka, banyak yang memberi masukan, lengkap dengan alasan dan referensi 👍🏽. Dari berbagai jawaban, pilihanku jatuh pada Firebase. 

Mumpung akhir pekan, aku berusaha mempelajari Firebase dan mencoba mengintegrasikan ke stack frontend pilihanku, yaitu Svelte + Sapper. Sebelum masuk ke sisi yang lebih teknis di post-post selanjutnya (kalau ingat nulis), di post ini aku akan menceritakan empat hal yang menarik untukku  saat _ngulik_ Firebase untuk pembuatan aplikasi web. Semoga berguna untuk teman-teman yang punya kebutuhan serupa.


### 1) Firebase adalah _suite_ yang berisi macam-macam produk

Sebetulnya cukup jelas, sih. Halaman _landing_ Firebase pun mencantumkan daftar produk/layanan yang mereka sediakan. Seperti halnya _Google productivity suite_ yang terdiri dari Gmail, Drive, Sheets, Slides dan sebagainya, dengan satu akun, kita bisa menggunakan salah satu atau beberapa produk sesuai kebutuhan masing-masing.

![Screenshot halaman landing firebase.google.com di bagian daftar produk Firebase](https://dev-to-uploads.s3.amazonaws.com/i/vwfvk6khcqyt6bo5gybm.jpg)

Tapiiii, kalau belum hafal benar dengan nama-nama produknya, apalagi kalau melakukan pencarian dengan frasa generik seperti _“svelte firebase tutorial”_, hasilnya bisa jadi kurang sesuai kebutuhanmu. Ini yang sempat membuatku bingung waktu pertama kali cari tutorial dan contoh kode. Yang dicari layanan database, yang dibuka tutorial Firebase functions untuk hosting. 🤦🏽‍♀️

Biar nggak _“zonk”_ seperti aku, ini dia ringkasan produk-produk Firebase yang umum dipakai dalam pembuatan web app:
- [Cloud Firestore](https://firebase.google.com/docs/firestore) dan [Realtime Database](https://firebase.google.com/docs/database) (database) (iya, ada 2 produk database)
- [Authentication](https://firebase.google.com/docs/auth) (sistem login user melalui Google, Facebook, Twitter, GitHub, SMS; bisa dikombinasikan dengan produk database)
- [Cloud Functions](https://firebase.google.com/docs/functions) (host/server yang menjalankan fungsi untuk berinteraksi dengan database)
- [Cloud Storage](https://firebase.google.com/docs/storage) (CDN untuk file-file aset seperti image, audio, video yang diunggah user)
- [Hosting](https://firebase.google.com/docs/hosting) (yha… hosting)

Masih banyak produk-produk lain untuk monitoring, analytics, push notification, dan sebagainya. Selengkapnya bisa dibaca sendiri di halaman [Firebase Products](https://firebase.google.com/products). 

Selain itu, saat melihat contoh kode di repository Github, kamu bisa cek isi file-file ini untuk mendapat gambaran produk Firebase apa saja yang digunakan:
- `package.json`
- `firebase.json`
- `functions/package.json` (jika ada)

Misalnya, kita bisa bandingkan repo-repo berikut ini:

- Repo 1: https://github.com/mightyjol/sapper-firebase-template
	- `package.json` berisi dependency:
		- `firebase-admin` (untuk mengamankan Firestore)
		- `firebase-auth` (Authentication)
	- `firebase.json` berisi setting untuk:
		- Cloud Functions
		- Firestore
		- Hosting
		- Storage
	- `functions/package.json` berisi dependency:
		- `firebase-admin`
		- `firebase-functions`
- Repo 2: https://github.com/mortscode/sapper-firebase
	- `firebase.json` berisi setting untuk:
		- Hosting
	- `functions/package.json` berisi dependency:
		- `firebase-admin`
		- `firebase-functions`

Kalau kamu mencari contoh kode untuk berinteraksi dengan database Firestore, gunakanlah repo pertama sebagai referensi.


### 2) Plan gratisan yang (lebih dari) lumayan

_“Biar miskin asal sombong,”_ begitu kata Elvy Sukaesih di [lagu keren ini](https://www.youtube.com/watch?v=BMgW4ww8eqs). Semangat yang sama berlaku untuk penggunaan Firebase. Dengan plan __Spark__ yang gratis, kamu bisa mengakses semua layanan! Satu-satunya yang nggak ada di plan gratisan cuma authentication SMS. Jika kebutuhanmu melebihi kuota gratisan, tersedia plan __Blaze__ dengan biaya sesuai penggunaan. Detailnya bisa dilihat di halaman [Pricing](https://firebase.google.com/pricing).

Menurutku, secara umum plan Spark ini sih sudah sangat cukup untuk project pribadi atau produk di tahap prototyping/MVP/beta. 

- Untuk **Hosting**, penyimpanan maksimal 1GB dengan batas transfer 10GB per bulan. Sudah dapat SSL dan custom domain kalau kamu ingin menggunakan domain sendiri (misal `ekakeren.com`) alih-alih subdomain default  `ekakeren.web.app` dan `ekakeren.firebaseapp.com`.

- Untuk **Storage**, total penyimpanan maksimal 5GB, download 1GB per hari, sedangkan operasi upload 20ribu per hari dan download 50ribu per hari.

- Untuk **Database**… nah, ini dia. Kalau kamu berencana menggunakan layanan database, simak poin berikutnya biar nggak boncos akibat salah pilih database.


### 3) Realtime Database atau Cloud Firestore? Pilih mana?

Firebase menawarkan dua macam database, [Realtime Database](https://firebase.google.com/docs/database) dan [Firestore](https://firebase.google.com/products/firestore). __Realtime Database__ adalah [produk pertama Firebase](https://en.wikipedia.org/wiki/Firebase#History) yang diluncurkan tahun 2012 sebelum diakuisisi oleh Google. Sedangkan __Firestore__ produk yang lebih baru (2017), dengan kapabilitas dan fitur-fitur sesuai perkembangan kebutuhan app modern.

Tampilan record __Realtime Database__ di konsol Firebase berbentuk _tree data structure_ seperti ini. Mau modifikasi data (_add record, edit value_ dsb)? Cukup arahkan kursor ke properti yang ingin diubah. Kita juga bisa mengimpor file JSON dengan mengunggah file dan mengekspor data ke file JSON. Minusnya: nggak bisa search/filter data dari konsol. 😱

![Screenshot of Firebase Realtime Database console, showing records in key-value pair tree data structure](https://dev-to-uploads.s3.amazonaws.com/i/e9lplvbedw7t07ukehem.jpg)

_Data dari [Star Wars API](https://swapi.co)_

__Cloud Firestore__ tampilannya cenderung lebih “ramah”. Kita bisa mensortir dan filter record langsung dari sini. Canggih juga filternya; selain operator-operator standar seperti _“equal”, “greater/less than”_, juga ada _“array contain”_. Dengan contoh SW API ini, kita bisa dengan mudah memfilter karakter yang hanya muncul di film _”The Empire Strikes Back”_, misalnya. Sayang nggak ada fitur ekspor dan impor ke/dari file JSON seperti Realtime Database.

![Screenshot of Firebase Firestore console, showing records in UI that resembles file/folder explorer](https://dev-to-uploads.s3.amazonaws.com/i/52bnla6zmcwvnex4n8md.jpg)

Kita dapat dua database terpisah untuk masing-masing produk, jadi bisa coba Realtime Database tanpa mempengaruhi data di Firestore (dan sebaliknya).

Untuk persamaan dan perbedaan lengkapnya, silakan baca:

* https://firebase.google.com/docs/firestore/rtdb-vs-firestore?hl=id
* https://savvyapps.com/blog/firebase-realtime-database-vs-cloud-firestore-for-your-app
* https://medium.com/datadriveninvestor/realtime-database-vs-cloud-firestore-which-database-is-suitable-for-your-mobile-app-87e11b56f50f

Oh ya, satu lagi yang perlu jadi pertimbangan: Kedua database ini punya *sistem perhitungan biaya yang berbeda*.

- **Realtime Database** *menghitung besar data* yang dikirim melalui operasi read/write, tidak peduli berapa jumlah API call-nya. Untuk plan Spark (plan gratis), batas maksimalnya adalah:
    - Total data yang disimpan: 1 GB (sama untuk kedua database)
    - Data yang didownload: 10 GB per bulan
    - Maksimal 100 device yang mengakses database secara bersamaan
    - [Detail hitungan biaya Realtime Database](https://firebase.google.com/docs/database/usage/billing?hl=id)

- Sebaliknya, **Cloud Firestore** nggak peduli besar/kecil data yang dikirim, tapi *menghitung jumlah operasi* yang kamu lakukan. Untuk plan Spark, batas maksimalnya:
    - Total data yang disimpan: 1 GB (sama untuk kedua database)
    - Jumlah write: 20 ribu per hari
    - Jumlah read: 50 ribu per hari
    - Jumlah delete: 20 ribu per hari
    - [Detail hitungan biaya Cloud Firestore](https://firebase.google.com/docs/firestore/pricing?hl=id)

Bayangkan kalau kamu bikin fitur chat yang payload-nya cuma berisi `id`, `created`, `userId`, dan `message`. Atau kalau aplikasimu ada fitur “like” yang kemungkinan akan banyak diklik, dan setiap klik mengirim request ke API. Ukuran data transaksi kecil, tapi frekuensi tinggi. Kalau pakai Firestore, bisa bangkrut karena yang dihitung adalah jumlah transaksi (read, write, bahkan delete). Jadi sebaiknya pakai __Realtime Database__ saja. 

Sebaliknya, kalau misalnya kamu bikin web app dokumentasi atau ensiklopedia (dan semua data untuk suatu entry dimasukkan dalam payload entry tersebut), apalagi kalau datanya cenderung jarang diedit, sebaiknya pakai __Firestore__.

Apapun database pilihanmu, pintar-pintar aja mengatur alur data dan minimalisir transaksi data yang tidak perlu. Jangan sampai seperti masnya ini yang [tiba-tiba dapat tagihan seribu Euro](https://pamartinezandres.com/lessons-learnt-the-hard-way-using-firebase-realtime-database-c609b52b9afb) akibat salah strategi sinkronisasi data. 🙀💸


### 4) Dapat digunakan di berbagai platform, bahasa, library, atau framework

Di luar beberapa produk yang khusus dibuat untuk native iOS dan Android, sebagian besar produk Firebase tersedia untuk berbagai platform: Web, iOS,  Android, C++, dan Unity.

Untuk web, kita bisa me-load library Firebase ke project kita dari:
- CDN dengan  `<script>` tag, atau…
- NPM package (`npm install --save firebase` atau `yarn add firebase`) lalu import modul yang dibutuhkan

Jadi, dengan satu halaman HTML statis dan vanilla JavaScript, kita sudah bisa menggunakan Firebase. Instruksi lengkapnya bisa dibaca di https://firebase.google.com/docs/web/setup.

Gimana kalau pakai framework? Nggak masalah, tinggal install dan import/load aja. Malah, kemungkinan besaaar sekali, sudah banyak starter site dan tutorial untuk framework/library pilihanmu, baik itu React, Vue, Svelte, dan library turunannya seperti Gatsby, Next, Nuxt, dll.

Web app yang ingin kubuat rencananya menggunakan Sapper, framework untuk Svelte. Bahkan untuk stack yang relatif baru ini, sudah ada beberapa _walkthrough_ dan starter/contoh kode. Memang, masih belum lengkap, jadi harus sedikit utak-atik sendiri, intip berbagai thread diskusi, dan tanya sana-sini. Yang membawa kita ke poin berikutnya…


### 5) Dokumentasi, referensi, dan komunitas

Menurutku ini faktor yang penting, khususnya untuk pemula. Firebase punya platform konten resmi yang lengkap, yaitu: 

- [Dokumentasi](https://firebase.google.com/docs) — Ini lengkap banget, dari A sampai Z ada. Kita tinggal ~~copas~~ pelajari dengan seksama aja.
- [Codelab](https://codelabs.developers.google.com/codelabs/firebase-web) — Belajar dari paaaaling dasar dengan cara praktik langsung. Aku nyesel sok-sokan langsung “loncat” cari-cari starter site yang ada Firebase-nya. Padahal aku belum paham prinsip-prinsip dasarnya, jadi bolak-balik berhenti untuk search bagian yang aku nggak ngerti. Sama aja buang waktu. Tau gitu mulai dari sini dulu 😤.
- [Channel Youtube](https://www.youtube.com/user/Firebase) — Channel ini aktif banget. Selain conference talks dan ulasan/demo fitur-fitur baru, ada seri video singkat “Ask Firebase” yang membahas hal-hal yang sering ditanyakan. Kalau kamu jenis orang yang lebih mudah belajar dengan penjelasan lisan + demo, bisa mulai dari sini.
- [Slack](https://firebase.googleblog.com/2016/02/come-join-firebase-slack-community_13.html) — Forum komunitas Firebase di Slack. Ada channel untuk masing-masing produk (Analytics, Firestore, dsb), juga channel umum seperti `#random` dan `#releases`. Rata-rata jumlah member belasan sampai puluhan ribu. Aku udah nge-post pertanyaan level pemula di channel Firestore, dan dijawab dengan baik dan jelas. 👍🏽

Karena popularitas Firebase, selain media/platform resmi di atas, tentu masih banyak materi lain (tutorial, artikel, dsb) yang bisa dipakai sebagai rujukan. Juga lebih besar kemungkinan ada orang yang punya use case sama/mirip denganmu, atau punya pertanyaan yang sama denganmu.

Ini yang akhirnya membuatku mantap ingin (belajar) menggunakan Firebase.


### Kesimpulan

Kita baru saja mengintip layanan Firebase, yang umumnya disebut sebagai _“(mobile) backend as a service”_. Kita tinggal buat _frontend_ dengan stack, bahasa, dan framework apapun pilihan kita; lalu ”tempel” saja ke Firebase. Firebase yang menangani segala urusan database, hosting, server, dengan tambahan _tools_ yang menunjang kebutuhan aplikasi kita.

Kemudahan ini jelas ada harganya; baik harga harfiah (jika melebihi kuota gratisan) maupun “harga” konsekuensi layanan _cloud computing_ secara umum: kita mempercayakan sebagian besar aplikasi kita—data dan logika—di tangan satu perusahaan. Tentu ini pilihan yang sifatnya subyektif.
 
Kalau memang kamu merasa itu sebanding dengan manfaatnya, Firebase bisa jadi pilihan yang menarik; nggak cuma untuk programmer kawakan yang membuat aplikasi-aplikasi “serius”, tapi juga untuk pemula yang ingin membuat produk atau project perdana.

Yuk, kita coba!

{% youtube mbj1RFaoyLk %}