Pusing data hilang? Kita bongkar cara persist state yang benar yuk!

Pusing data hilang? Kita bongkar cara persist state yang benar yuk!
Photo by Kurasitama/Unsplash

Pusing banget ya kalau lagi asik ngerjain sesuatu terus tiba tiba data yang udah diisi atau diatur raib begitu saja? Rasanya tuh kayak udah nulis panjang lebar tapi browser ke refresh semua ambyar. Jangan khawatir kita semua pernah kok mengalami momen horor kayak gini. Di Javapixa Creative Studio kita sering banget ketemu kasus kayak gini dan kita juga udah punya banyak pengalaman buat ngatasinnya. Nah kali ini kita mau bongkar tuntas nih cara persist state yang benar biar data kita nggak gampang hilang lagi. Yuk kita mulai petualangan kita di dunia persistensi data yang asik ini!

Mengapa Data Kita Sering Hilang Ya

Sebelum kita terjun lebih dalam ke solusi mari kita pahami dulu kenapa sih data kita sering hilang. Biasanya ini terjadi karena aplikasi kita kurang pandai menyimpan ‘ingatan’ tentang apa yang user lakukan atau inputkan. Misalnya saat user mengisi form belanja online tapi belum selesai terus browsernya tertutup atau di refresh. Data yang tadi sudah diinputkan biasanya langsung lenyap begitu saja.

Data yang hilang ini bisa jadi sangat frustrasi buat user dan pastinya bikin pengalaman pakai aplikasi jadi nggak optimal. Bayangkan kita udah susah payah milih milih barang di e commerce terus tiba tiba keranjang belanja kita kosong lagi cuma gara gara kita salah klik atau internet putus sesaat. Makanya penting banget bagi kita para developer untuk memikirkan strategi persistensi data yang tepat. Ini bukan cuma soal kenyamanan tapi juga kredibilitas aplikasi kita lho.

Hilangnya data ini sering terjadi karena aplikasi kita menggunakan client side state yang tidak dipersist secara eksplisit. Saat browser ditutup atau di refresh memori yang digunakan untuk menyimpan state itu langsung dihapus. Jadi kita butuh cara agar data itu tetap 'ingat' meskipun browsernya di restart. Nah inilah yang akan kita bahas tuntas.

Yuk Kenalan Dulu Sama Konsep State Persistence

Mungkin ada sebagian dari kita yang masih bertanya tanya apa sih sebenarnya 'state' itu dan 'persistence' itu apa. Tenang saja kita jelaskan dengan bahasa yang mudah dipahami kok.

Apa Itu State

State itu bisa kita ibaratkan sebagai 'keadaan' atau 'ingatan' dari aplikasi kita. Contohnya kalau di aplikasi e commerce state itu bisa berupa daftar barang di keranjang belanja filter yang sedang aktif status login user atau tema aplikasi yang sedang dipakai. Setiap kali user berinteraksi dengan aplikasi state ini akan berubah.

Misalnya saat kita menambahkan barang ke keranjang belanja state keranjang belanja akan berubah. Saat kita klik tombol like untuk sebuah postingan state postingan itu juga akan berubah. Mengelola state ini dengan baik adalah kunci aplikasi yang responsif dan interaktif. Tanpa state yang jelas aplikasi kita cuma jadi halaman statis yang nggak bisa apa apa.

Kenapa Harus Dipersist

Nah sekarang 'persistence' itu artinya kita membuat state itu 'bertahan' atau 'tidak hilang' bahkan ketika aplikasi ditutup atau di refresh. Kenapa harus dipersist? Ya karena kita nggak mau user kita frustrasi kalau data mereka tiba tiba hilang. Persistensi state ini penting banget buat user experience yang mulus.

Bayangkan kita lagi asik ngisi formulir panjang banget terus laptop mati mendadak. Kalau data formulir itu nggak dipersist pas kita nyalain laptop lagi dan buka aplikasinya kita harus mulai dari nol lagi kan? Itu sungguh menyebalkan. Dengan persistensi data user bisa melanjutkan pekerjaannya dari titik terakhir tanpa harus mengulang dari awal. Ini juga sangat membantu untuk aplikasi yang membutuhkan offline capability atau sekadar menyimpan preferensi user seperti mode gelap atau terang. Jadi tujuan utamanya adalah agar aplikasi kita punya memori jangka panjang.

Berbagai Macam Pilihan Jurus Persist State

Ada banyak cara untuk persist state dan setiap cara punya kelebihan serta kekurangannya masing masing. Kita akan bongkar satu per satu biar kita tahu kapan harus pakai yang mana.

Browser Storage Andalan Kita

Ini adalah cara paling umum dan sering kita pakai untuk menyimpan data di sisi client.

Local Storage Si Paling Setia

Local Storage ini adalah salah satu pilihan paling populer untuk menyimpan data di browser. Datanya akan tersimpan tanpa batas waktu sampai kita hapus secara manual atau dihapus oleh user. Kapasitasnya lumayan besar sekitar 5MB sampai 10MB tergantung browsernya. Kita sering pakai ini untuk menyimpan preferensi user data keranjang belanja yang sifatnya non sensitif atau token otentikasi yang sudah dienkripsi.

Cara kerjanya mudah banget kita bisa simpan data dengan memberikan nama kunci dan nilainya dalam bentuk string. Untuk mengambilnya juga tinggal panggil nama kuncinya. Meskipun sangat membantu tapi jangan menyimpan data yang sangat sensitif di sini ya apalagi tanpa enkripsi. Local Storage rentan terhadap serangan XSS Cross Site Scripting.

Session Storage Si Memori Jangka Pendek

Session Storage mirip banget sama Local Storage tapi ada satu perbedaan besar. Data yang disimpan di Session Storage hanya bertahan selama sesi browser itu aktif. Artinya kalau tab browser ditutup atau browsernya di restart datanya akan langsung hilang. Cocok banget nih kalau kita cuma perlu menyimpan data sementara yang cuma dipakai selama user berada di sesi yang sama.

Contohnya data input formulir yang belum disubmit hasil pencarian sementara atau state UI tertentu. Kapasitasnya juga mirip dengan Local Storage. Karena sifatnya yang sementara Session Storage ini sedikit lebih aman dari Local Storage untuk beberapa kasus karena data tidak akan persist secara permanen di perangkat user.

Cookies Si Tua Tapi Masih Berguna

Cookies adalah metode paling lama untuk menyimpan data di sisi client. Ukurannya kecil cuma sekitar 4KB dan punya batas waktu kadaluarsa. Cookies biasanya dipakai untuk menyimpan informasi user seperti ID sesi status login atau preferensi website.

Salah satu kelebihan Cookies adalah bisa dikirim otomatis ke server dengan setiap request. Ini sangat berguna untuk otentikasi misalnya server bisa mengenali user berdasarkan cookie yang dikirim. Tapi karena ukurannya yang kecil dan sering dikirim ke server Cookies bisa memperlambat performa kalau isinya terlalu banyak atau terlalu besar. Dari segi keamanan Cookies juga punya risiko terutama kalau tidak diatur dengan atribut secure atau httponly. Kita harus hati hati sekali saat menggunakannya terutama untuk data sensitif.

IndexedDB Si Database Lokal Powerfull

Kalau kita butuh menyimpan data yang lebih besar terstruktur dan butuh kemampuan query seperti database IndexedDB ini jagoannya. Ini adalah sistem database NoSQL di dalam browser. Jadi kita bisa menyimpan data dalam jumlah besar hingga gigabyte dan melakukan operasi baca tulis hapus yang kompleks secara asinkron.

IndexedDB sangat cocok untuk aplikasi yang membutuhkan fitur offline support menyimpan cache aset besar atau data user yang sangat banyak. Contohnya aplikasi pengolah kata online yang bisa bekerja offline atau aplikasi chat yang menyimpan riwayat pesan. Menggunakan IndexedDB memang sedikit lebih kompleks dibandingkan Local atau Session Storage tapi fiturnya juga jauh lebih powerful. Kalau kita punya kebutuhan data yang kompleks dan besar di sisi client IndexedDB adalah pilihan terbaik.

Server Side State Management

Nggak cuma di sisi client lho state juga bisa kita kelola dan persist di sisi server.

Data di Server Biar Aman

Cara paling aman dan handal untuk persist state adalah dengan menyimpannya di server. Kita bisa pakai database seperti PostgreSQL MySQL MongoDB atau lainnya. Data user akan tersimpan di server dan setiap kali user mengakses aplikasi datanya akan diambil dari sana. Ini adalah pendekatan yang paling umum untuk data yang sensitif dan membutuhkan integritas tinggi seperti data transaksi user profile atau konten aplikasi.

Dengan menyimpan data di server kita bisa memastikan data tidak akan hilang meskipun user ganti perangkat atau browser. Selain itu data juga lebih aman karena berada di lingkungan yang lebih terkontrol. Untuk menghubungkan client dengan server kita biasanya menggunakan API Application Programming Interface. Jadi client akan mengirim request ke API server akan memprosesnya menyimpan atau mengambil data dari database lalu mengirimkan respons kembali ke client. Ini adalah jantung dari kebanyakan aplikasi web modern.

SSR dan SSG Untuk Pengalaman Lebih Baik

Server Side Rendering SSR dan Static Site Generation SSG juga punya peran penting dalam persistensi state terutama untuk initial state. Dengan SSR atau SSG aplikasi kita bisa mengirimkan halaman HTML yang sudah berisi data dari server ke browser. Jadi saat user pertama kali membuka halaman datanya sudah ada nggak perlu menunggu JavaScript diload dan mengambil data lagi.

Ini membuat pengalaman user jadi lebih cepat dan SEO friendly. Contohnya di Nextjs kita bisa menggunakan getServerSideProps atau getStaticProps untuk mengambil data di server sebelum halaman dirender. Data yang sudah diambil ini kemudian bisa dihydrasi di sisi client dan menjadi initial state aplikasi kita. Jadi SSR dan SSG ini membantu kita mengirimkan state awal aplikasi dari server biar user langsung bisa melihat konten yang lengkap.

State Management Libraries dan Integrasinya

Untuk aplikasi yang lebih kompleks mengelola state bisa jadi sangat rumit. Di sinilah state management libraries datang membantu.

Redux Vuex Dkk Pembantu Setia

Framework seperti React Vue atau Angular punya ekosistem library state managementnya sendiri. Misalnya di React ada Redux Zustand Recoil Jotai atau Context API. Di Vue ada Vuex atau Pinia. Library ini membantu kita mengelola state secara terpusat dan terstruktur.

Nah banyak dari library ini juga punya cara atau plugin untuk persist state mereka ke browser storage. Contohnya Redux Persist untuk Redux. Dengan Redux Persist kita bisa dengan mudah menyimpan state store Redux kita ke Local Storage atau Session Storage secara otomatis. Jadi setiap kali aplikasi direfresh state terakhir user akan otomatis dimuat kembali. Ini sangat praktis dan mengurangi boilerplate code yang harus kita tulis.

Libraries Modern Lainnya

Selain Redux dan Vuex ada juga pilihan lain yang lebih modern dan seringkali lebih ringan. Misalnya Zustand dan Recoil di ekosistem React. Mereka menawarkan API yang lebih sederhana tapi tetap powerful untuk manajemen state. Beberapa dari library ini juga punya integrasi dengan solusi persistensi atau kita bisa implementasi sendiri dengan mudah menggunakan custom hook. Kuncinya adalah memilih library yang sesuai dengan kompleksitas dan kebutuhan proyek kita.

Kapan Pakai yang Mana Nih Biar Nggak Salah Pilih

Sekarang kita sudah tahu berbagai macam jurus persist state. Tapi kapan sih kita harus pakai yang mana? Yuk kita coba petakan.

Untuk Data Ringan dan Sederhana

Kalau kita cuma perlu menyimpan data yang ringan tidak sensitif dan sederhana seperti preferensi UI tema gelap terang atau state form sementara Local Storage atau Session Storage adalah pilihan yang paling asik dan mudah. Gunakan Session Storage jika data itu hanya perlu bertahan selama sesi browsing saat ini. Gunakan Local Storage jika data perlu bertahan lebih lama bahkan setelah browser ditutup.

Untuk Data Kompleks dan Offline

Jika aplikasi kita membutuhkan kemampuan offline support atau harus menyimpan data terstruktur dalam jumlah besar di sisi client seperti data cache yang banyak atau data aplikasi yang bisa diakses tanpa internet IndexedDB adalah jawabannya. Ini adalah solusi database mini di browser yang sangat kuat.

Untuk Data Sensitif dan Aman

Untuk data yang sangat sensitif seperti informasi pribadi user token otentikasi yang belum dienkripsi atau data transaksi keuangan selalu prioritaskan untuk menyimpannya di sisi server. Jangan pernah menyimpan data ini di client storage tanpa enkripsi yang sangat kuat. Kita bisa menggunakan Cookies yang diatur dengan atribut secure dan httponly untuk token otentikasi agar lebih aman saat dikirim ke server.

Untuk Integrasi Antar Halaman atau Sesi

Cookies sangat berguna untuk state yang perlu dibagikan antar halaman di domain yang sama atau perlu secara otomatis dikirimkan ke server untuk keperluan otentikasi dan sesi. Sementara itu server side state management dengan database adalah yang paling ideal untuk menjaga konsistensi data lintas sesi dan perangkat yang berbeda.

Tips dan Trik Persist State Ala Javapixa

Di Javapixa Creative Studio kita punya beberapa tips jitu nih biar persistensi state kita jadi lebih mantap.

Jangan Simpan Semua di Browser

Ingat ya tidak semua state harus kita simpan di browser. Terlalu banyak menyimpan data di Local Storage atau Session Storage bisa mempengaruhi performa aplikasi dan juga berisiko dari sisi keamanan. Pertimbangkan selalu apakah data itu benar benar perlu disimpan di sisi client atau lebih baik di server.

Enkripsi Data Sensitif

Jika memang terpaksa harus menyimpan data sensitif di browser storage pastikan data itu sudah dienkripsi dengan kuat. Jangan pernah menyimpan plain text password atau informasi pribadi yang sangat rahasia tanpa perlindungan. Kita bisa menggunakan library enkripsi di JavaScript untuk ini.

Manfaatkan Redux Persist atau Tools Serupa

Untuk aplikasi yang menggunakan state management library besar seperti Redux atau Vuex manfaatkan library persistensinya. Redux Persist adalah contoh yang sangat baik yang bisa mengotomatiskan proses penyimpanan dan pengambilan state dari browser storage. Ini akan menghemat banyak waktu dan mengurangi potensi bug.

Perhatikan Limit dan Kuota

Setiap jenis storage di browser punya limitnya masing masing. Jangan sampai kita menyimpan data melebihi kuota yang tersedia karena bisa menyebabkan error di aplikasi. Selalu periksa apakah data yang kita simpan tidak terlalu besar. IndexedDB punya kapasitas paling besar.

Handle Error dengan Baik

Selalu siapkan mekanisme error handling untuk setiap operasi persistensi data. Apa yang terjadi kalau Local Storage penuh? Apa yang terjadi kalau IndexedDB gagal diinisialisasi? Pastikan aplikasi kita bisa memberikan feedback yang jelas kepada user atau setidaknya tidak crash.

Test Skenario Data Hilang

Ini penting banget nih. Setelah kita mengimplementasikan persistensi state jangan lupa untuk menguji berbagai skenario di mana data bisa hilang. Contohnya coba refresh halaman tutup browser lalu buka lagi ganti tab mode incognito dan lain lain. Pastikan data tetap aman dan sesuai harapan.

Masa Depan State Persistence dan Teknologi Baru

Dunia pengembangan web terus bergerak maju dan begitu juga dengan cara kita mengelola dan persist state. Teknologi seperti React Server Components dan Service Workers akan semakin banyak berperan. Server Components memungkinkan kita mengelola state di server yang kemudian di stream ke client. Ini bisa mengurangi jumlah state yang harus dikelola di client.

Sementara itu Service Workers bisa memberikan kemampuan offline yang sangat powerful memungkinkan aplikasi kita bekerja bahkan tanpa koneksi internet sama sekali. Mereka bisa mengelola cache data dan resource secara lebih canggih dari sekadar IndexedDB. Jadi kedepannya kita akan punya lebih banyak pilihan dan kombinasi strategi persistensi yang bisa kita pakai. Tetap update dengan teknologi terbaru itu asik kan.

Nah itu dia pembahasan lengkap kita tentang cara persist state yang benar biar data user nggak gampang hilang lagi. Mulai sekarang kita nggak perlu pusing lagi kan kalau data tiba tiba raib. Dengan memahami berbagai metode dan kapan harus menggunakannya kita bisa membangun aplikasi yang lebih tangguh aman dan memberikan pengalaman user yang luar biasa. Ingat ya persistensi data itu investasi penting untuk kepercayaan user. Selamat mencoba dan berkreasi dengan persistensi data yang lebih baik!