<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jidan Fatahillah</title>
    <description>The latest articles on DEV Community by Jidan Fatahillah (@thecrudify).</description>
    <link>https://dev.to/thecrudify</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3126829%2F06f7c677-5e90-485a-8fee-8128ad77804d.png</url>
      <title>DEV Community: Jidan Fatahillah</title>
      <link>https://dev.to/thecrudify</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thecrudify"/>
    <language>en</language>
    <item>
      <title>File yang Sudah Dihapus Beneran Hilang?</title>
      <dc:creator>Jidan Fatahillah</dc:creator>
      <pubDate>Thu, 08 May 2025 16:41:56 +0000</pubDate>
      <link>https://dev.to/thecrudify/file-yang-sudah-dihapus-beneran-hilang-2al2</link>
      <guid>https://dev.to/thecrudify/file-yang-sudah-dihapus-beneran-hilang-2al2</guid>
      <description>&lt;p&gt;Gue Kira File Gue Udah Hilang, Ternyata Masih Bisa Balik? Lah Kok?&lt;/p&gt;

&lt;p&gt;Jadi gini, ceritanya minggu lalu gue lagi bersih-bersih laptop.&lt;br&gt;
Maklum, udah semester akhir, storage mulai megap-megap. Banyak file gak jelas dari awal semester. Mulai dari file tugas, proposal PKL, sampe folder berlabel "fix_banget_final_edited_baru.zip" yang isinya gue pun udah lupa.&lt;/p&gt;

&lt;p&gt;Akhirnya gw ambil keputusan berat: &lt;strong&gt;hapus-hapusin semua file yang kayaknya udah nggak penting.&lt;/strong&gt;&lt;br&gt;
Dan gue beneran niat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hapus manual&lt;/li&gt;
&lt;li&gt;Kosongin Recycle Bin&lt;/li&gt;
&lt;li&gt;Bahkan shift+delete buat langsung gone dari muka bumi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Udah puas dong? Gww mikir,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Oke, storage lega, file udah hilang, hidup gw lebih tenang."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tapi... besoknya gw baru nyadar.&lt;br&gt;
&lt;strong&gt;ADA SATU FILE PENTING YANG IKUT KEHAPUS!&lt;/strong&gt;&lt;br&gt;
Itu file buat bahan revisi tugas akhir — dan gak ada backup-nya. Panik? IYA LAH.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mulai Googling, Ketemu EaseUS
&lt;/h2&gt;

&lt;p&gt;Gue cari-cari di Google:&lt;br&gt;
&lt;strong&gt;“Cara balikin file yang udah dihapus permanen.”&lt;/strong&gt;&lt;br&gt;
Dan muncullah nama-nama kayak EaseUS, Recuva, Disk Drill.&lt;/p&gt;

&lt;p&gt;Akhirnya gw coba EaseUS. Pas di-scan...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tiba-tiba muncul file gue yang udah gue anggap ilang.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jujur gw terheran-heran. Lah kok bisa?(nada pak Irwan)?&lt;/p&gt;




&lt;h2&gt;
  
  
  Baru Gw Ngerti: Delete Itu Nggak Bikin File Hilang Total
&lt;/h2&gt;

&lt;p&gt;Ternyata, pas lu hapus file (bahkan yang permanen), itu tuh &lt;strong&gt;nggak langsung ngilangin isi file dari storage.&lt;/strong&gt;&lt;br&gt;
Komputer cuma bilang:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Oke, slot ini sekarang kosong ya. Bisa dipake buat file baru nanti.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Padahal, isi data masih &lt;strong&gt;ngendap&lt;/strong&gt; di dalam storage. Dan selama belum ketiban sama data baru, ya dia masih bisa dibalikin.&lt;/p&gt;

&lt;p&gt;Aplikasi kayak EaseUS itu kerjanya &lt;strong&gt;nyari sisa-sisa file lama yang belum ditimpa&lt;/strong&gt;.&lt;br&gt;
Makanya, file gw bisa diselamatin. Nggak pake cingcong.&lt;/p&gt;




&lt;h2&gt;
  
  
  Jadi Pelajaran Penting Buat Gw
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hapus file nggak sama dengan ilang beneran.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Kalau nggak pengen file bisa dibalikin, lu harus &lt;strong&gt;overwrite&lt;/strong&gt; atau pake &lt;strong&gt;secure delete&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Dan paling penting: &lt;strong&gt;BACKUP ITU WAJIB, BRO.&lt;/strong&gt; Jangan males backup.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Sekarang gue ngerti, di dunia digital, yang lu buang belum tentu bener-bener pergi.&lt;br&gt;
Jadi hati-hati sebelum nyesel.&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Idempotency untuk Apa?</title>
      <dc:creator>Jidan Fatahillah</dc:creator>
      <pubDate>Wed, 07 May 2025 16:54:06 +0000</pubDate>
      <link>https://dev.to/thecrudify/idempotency-untuk-semua-kalangan-untuk-bayi-dan-mahasiswa-g8j</link>
      <guid>https://dev.to/thecrudify/idempotency-untuk-semua-kalangan-untuk-bayi-dan-mahasiswa-g8j</guid>
      <description>&lt;p&gt;Kamu lagi bikin backend API, trus tiba-tiba ada bug: user klik tombol &lt;strong&gt;"Bayar"&lt;/strong&gt; dua kali dan... 😱 mereka ditagih dua kali!&lt;/p&gt;

&lt;p&gt;Tenang, kamu cuma butuh satu jurus: &lt;strong&gt;idempotency&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  📖 Apa Itu Idempotency?
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Idempotency adalah sifat dari suatu operasi yang &lt;strong&gt;tidak berubah hasil akhirnya walaupun dilakukan berkali-kali&lt;/strong&gt; dengan input yang sama.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🎓 Sekarang lo adalah Mahasiswa...
&lt;/h3&gt;

&lt;p&gt;Bayangin dehh lu ngisi KRS (Kartu Rencana Studi). terus klik tombol “Ambil Mata Kuliah A” satu kali:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Data masuk ke sistem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eh, lo panik, koneksi jelek, lo klik lagi...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Sistem bilang: “Mata kuliah A sudah diambil.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hasil akhirnya? &lt;strong&gt;Sama. lo tetap ambil 1 kelas.&lt;/strong&gt;&lt;br&gt;
Inilah &lt;strong&gt;idempotent operation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sekarang bandingkan dengan contoh yang &lt;strong&gt;tidak idempotent&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  😬 Operasi yang Tidak Idempotent
&lt;/h3&gt;

&lt;p&gt;Lo transfer uang lewat aplikasi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tekan tombol "Transfer" sekali: 💸 uang terkirim.&lt;/li&gt;
&lt;li&gt;Tapi karena loading terus, lo pencet lagi...&lt;/li&gt;
&lt;li&gt;💸 uang terkirim &lt;strong&gt;dua kali&lt;/strong&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Ini operasi &lt;strong&gt;tidak idempotent&lt;/strong&gt;, karena hasil akhirnya &lt;strong&gt;berubah&lt;/strong&gt; setiap kali dijalankan.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧪 HTTP dan Idempotency
&lt;/h3&gt;

&lt;p&gt;HTTP method juga punya karakter idempotency:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Idempotent?&lt;/th&gt;
&lt;th&gt;Penjelasan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;✅ Ya&lt;/td&gt;
&lt;td&gt;Ambil data, tidak ubah apapun.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUT&lt;/td&gt;
&lt;td&gt;✅ Ya&lt;/td&gt;
&lt;td&gt;Overwrite data, hasil akhirnya sama.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;✅ Ya&lt;/td&gt;
&lt;td&gt;Hapus data, kalau dihapus lagi tidak berubah.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;❌ Tidak&lt;/td&gt;
&lt;td&gt;Buat data baru, ulangi = data baru lagi.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PATCH&lt;/td&gt;
&lt;td&gt;⚠️ Kadang&lt;/td&gt;
&lt;td&gt;Bergantung implementasinya.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h3&gt;
  
  
  💡 Kenapa Kita Butuh Idempotency?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Koneksi Jelek&lt;/strong&gt;&lt;br&gt;
Server bisa lambat. User sering tekan tombol berkali-kali.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Retry Otomatis&lt;/strong&gt;&lt;br&gt;
Banyak client (termasuk frontend dan load balancer) akan &lt;strong&gt;otomatis ulangi request&lt;/strong&gt; kalau gagal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keamanan &amp;amp; Kepercayaan&lt;/strong&gt;&lt;br&gt;
Gak lucu kalau transaksi keuangan malah dua kali keluar uang cuma karena user panik ngeklik lagi.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  🛡️ Cara Bikin POST Idempotent: Gunakan &lt;code&gt;Idempotency-Key&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Untuk method yang &lt;strong&gt;secara default tidak idempotent&lt;/strong&gt;, kayak &lt;code&gt;POST&lt;/code&gt;, kita bisa kasih akal-akalan dengan &lt;strong&gt;header unik&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/payment
Idempotency-Key: 123e4567-e89b-12d3-a456-426614174000
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Server akan:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mengecek apakah &lt;code&gt;Idempotency-Key&lt;/code&gt; itu &lt;strong&gt;sudah pernah dipakai&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Kalau sudah → balikin &lt;strong&gt;response yang sama&lt;/strong&gt; seperti sebelumnya.&lt;/li&gt;
&lt;li&gt;Kalau belum → proses dan &lt;strong&gt;simpan hasilnya&lt;/strong&gt; berdasarkan key-nya.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🎯 Jadi walaupun user klik “Bayar” berkali-kali, uang hanya keluar sekali.&lt;/p&gt;




&lt;h3&gt;
  
  
  Implementasi Dasar Idempotency di Backend
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Di sisi server:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Simpan &lt;code&gt;idempotency_key&lt;/code&gt;, &lt;code&gt;payload&lt;/code&gt;, dan &lt;code&gt;response&lt;/code&gt; di database.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Saat request datang:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cari key → kalau ada, balikin response lama.&lt;/li&gt;
&lt;li&gt;Kalau tidak → proses dan simpan.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Contoh tabel:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;idempotency_key&lt;/th&gt;
&lt;th&gt;user_id&lt;/th&gt;
&lt;th&gt;endpoint&lt;/th&gt;
&lt;th&gt;response&lt;/th&gt;
&lt;th&gt;created_at&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;abc123&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/payment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;{ status: "paid" }&lt;/td&gt;
&lt;td&gt;2025-05-07 10:10:10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🧰 Studi Kasus Nyata
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Stripe (pembayaran online)
&lt;/h4&gt;

&lt;p&gt;Stripe adalah contoh emas. Mereka &lt;strong&gt;mewajibkan&lt;/strong&gt; penggunaan &lt;code&gt;Idempotency-Key&lt;/code&gt; untuk semua request penting seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Membuat pembayaran&lt;/li&gt;
&lt;li&gt;Membuat pelanggan&lt;/li&gt;
&lt;li&gt;Melakukan refund&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Baca di sini: &lt;a href="https://stripe.com/docs/idempotency" rel="noopener noreferrer"&gt;Stripe Docs - Idempotency&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Gojek / Grab
&lt;/h4&gt;

&lt;p&gt;Kalau lo pencet "Order GoRide" dua kali, aplikasi tetap kirim &lt;strong&gt;1 driver&lt;/strong&gt;. Mereka pasti pakai idempotency untuk menjaga supaya lo gak disamperin 2 motor.&lt;/p&gt;




&lt;p&gt;🧠 Kesimpulan&lt;br&gt;
Idempotency penting buat API yang aman dan tidak bikin user panik atau rugi.&lt;/p&gt;

&lt;p&gt;Gunakan Idempotency-Key untuk method seperti POST supaya aman dari dobel klik dan retry otomatis.&lt;/p&gt;

&lt;p&gt;Pahami sifat HTTP method, jangan asal pilih POST buat semua hal.&lt;/p&gt;

&lt;p&gt;🚀 Intinya, bikin API lu kayak orang yang sabar — meski diminta berkali-kali, tetap konsisten, tenang, dan gak panik.&lt;br&gt;
Kalau user lagi ngambek pencet tombol terus, lu tetap bisa jawab: “Tenang, ini udah aku proses kok.” 😉&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buat sistem kamu lebih bisa di-&lt;em&gt;retry&lt;/em&gt;, &lt;em&gt;robust&lt;/em&gt;, dan gak bikin drama.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📚 Referensi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://datatracker.ietf.org/doc/html/rfc7231#section-4.2.2" rel="noopener noreferrer"&gt;RFC 7231 - HTTP/1.1 Semantics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stripe.com/docs/idempotency" rel="noopener noreferrer"&gt;Stripe Docs - Idempotency&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Kalau lu suka artikel ini, jangan lupa share, kasih ❤️, dan kalau ada pengalaman menarik seputar API atau idempotency, yuk sharing di komentar!&lt;/p&gt;




</description>
      <category>programming</category>
      <category>idempotency</category>
      <category>discuss</category>
      <category>learning</category>
    </item>
    <item>
      <title>Commit Git Lo Kayak Skripsi Setengah Jadi? Yuk Rapihin, Biar Tim Lo Gak Kena Mental 😵‍💫</title>
      <dc:creator>Jidan Fatahillah</dc:creator>
      <pubDate>Tue, 06 May 2025 15:54:20 +0000</pubDate>
      <link>https://dev.to/thecrudify/commit-git-lo-kayak-skripsi-setengah-jadi-yuk-rapihin-biar-tim-lo-gak-kena-mental-2be0</link>
      <guid>https://dev.to/thecrudify/commit-git-lo-kayak-skripsi-setengah-jadi-yuk-rapihin-biar-tim-lo-gak-kena-mental-2be0</guid>
      <description>&lt;h3&gt;
  
  
  🧠 &lt;strong&gt;Intro: Cerita Lo, Cerita Kita&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Gue yakin lo pernah di fase ini: tengah malam, ngerjain project bareng tim, otak udah ngebul, dan tinggal satu hal yang harus lo lakuin...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;git commit -m "fix lagi, entahlah"&lt;/code&gt;&lt;br&gt;
&lt;code&gt;git push origin main&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Done. Close laptop. Tidur.&lt;/p&gt;

&lt;p&gt;Fast forward seminggu kemudian, tim lo panik: ada bug. Lo disuruh telusurin siapa yang ngubah logic di file &lt;code&gt;authController.js&lt;/code&gt;. Lo buka Git history... dan isinya cuma commit kayak "update", "fix", "ga tau kenapa error".&lt;/p&gt;

&lt;p&gt;Udah deh, kaya baca jurnal tapi semua referensinya ditutupin.&lt;/p&gt;

&lt;p&gt;Gue pernah di posisi itu. Dan lo (mungkin) juga. Makanya gue nulis ini: &lt;strong&gt;biar lo gak mengulang dosa commit yang sama.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 &lt;strong&gt;Commit Message Itu Bukan Formalitas. Itu Logbook Perjuangan.&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Anggep aja commit message itu kayak &lt;em&gt;catatan lapangan skripsi&lt;/em&gt; lo yang pastinya harus rapi, jelas, dan bisa dipahami orang lain (termasuk lo sendiri di masa depan waktu buka proyek lama pas disuruh revisi portofolio).&lt;/p&gt;

&lt;p&gt;Nah, untungnya udah ada aturan &lt;strong&gt;Conventional Commit&lt;/strong&gt; yang ngebantu lo nulis commit yang cakep tanpa mikir terlalu lama. Formatnya simple, bro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;tipe&amp;gt;(opsional scope): deskripsi singkat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh paling basic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat(auth): Tambahin fitur login pake OTP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 &lt;strong&gt;Jenis-Jenis Commit: Anggep Aja Ini Karakter di Party Game&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipe Commit&lt;/th&gt;
&lt;th&gt;Fungsi&lt;/th&gt;
&lt;th&gt;Analogi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nambah fitur baru&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Tank&lt;/strong&gt;: maju duluan buka jalan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Benerin bug&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Support&lt;/strong&gt;: backup tim pas ada yang jatoh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update dokumentasi&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;NPC&lt;/strong&gt;: diem-diem penting, bro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Perubahan tampilan code (tanpa ngubah logic)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Make-up Artist&lt;/strong&gt;: biar rapi, enak diliat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;refactor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ngubah struktur code tanpa ubah hasilnya&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Arsitek&lt;/strong&gt;: ngerombak rumah biar lebih kuat fondasinya&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tambahin atau edit test&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;QA&lt;/strong&gt;: biar bug gak kabur pas release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Segala hal non-kode utama (update deps, config)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;OB kantor&lt;/strong&gt;: kerjaannya gak keliatan, tapi chaos kalau gak ada&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🛠 &lt;strong&gt;Contoh Real-Life Commit yang Mendingan Dibaca Daripada Skripsi&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fix&lt;span class="o"&gt;(&lt;/span&gt;auth&lt;span class="o"&gt;)&lt;/span&gt;: Benerin bug login gara-gara email &lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="nt"&gt;-sensitive&lt;/span&gt;

Sebelumnya user gagal login kalau input email pakai huruf kapital.
Sekarang semua email di-normalisasi ke lowercase.

Closes &lt;span class="c"&gt;#42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commit di atas gak cuma ngasih tau &lt;em&gt;apa&lt;/em&gt; yang berubah, tapi juga &lt;em&gt;kenapa&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;Kenapa Lo Harus Peduli?&lt;/strong&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Kan yang penting bisa jalan, bro."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Iya, sampe lo kerja tim. Atau open-source. Atau buka project lama 3 bulan lagi.&lt;br&gt;
Commit message yang jelas bisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bikin &lt;strong&gt;code review gak bikin ngelus dada&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Memudahkan generate &lt;strong&gt;changelog otomatis&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Ngebantu tracing bug dari commit sebelumnya&lt;/li&gt;
&lt;li&gt;Kasih gambaran &lt;strong&gt;apa yang dikerjain siapa&lt;/strong&gt;, kapan, dan kenapa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pokoknya lo kayak nyiapin surat cinta buat pembaca codebase lo. 🥲&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 &lt;strong&gt;Referensi Buat Lo Yang Mau Dalemin&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📜 &lt;a href="https://www.conventionalcommits.org/en/v1.0.0/" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt; – Ini panduan utamanya&lt;/li&gt;
&lt;li&gt;✍️ &lt;a href="https://chris.beams.io/posts/git-commit/" rel="noopener noreferrer"&gt;Chris Beams - How to Write a Git Commit Message&lt;/a&gt; – Gaya klasik, tapi solid&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://git-scm.com/docs/git-commit" rel="noopener noreferrer"&gt;Git Docs - Git Commit&lt;/a&gt; – Buat yang mau ngebaca versi “resmi” dari Git&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Penutup: Commit Message Lo, Warisan Lo
&lt;/h2&gt;

&lt;p&gt;Kalau lo anggap coding itu seni, commit message itu caption-nya.&lt;br&gt;
Dan percayalah, caption yang bagus bisa bikin orang ngerti dan jatuh cinta.&lt;/p&gt;

&lt;p&gt;So, next time lo commit, pikirin:&lt;br&gt;
&lt;strong&gt;“Kalau ini dibaca doi gue, malu gak?”&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Gimana, bro? Kalau lo punya pengalaman lucu atau pahit soal commit message, atau tim lo punya gaya commit sendiri, drop di kolom komentar ya. Kita bahas bareng!&lt;/p&gt;

&lt;p&gt;👊 Keep coding, keep pushing. Kasih pesan, bukan misteri.&lt;/p&gt;




</description>
      <category>git</category>
      <category>coding</category>
      <category>collaboration</category>
      <category>programming</category>
    </item>
    <item>
      <title>Validasi di Frontend dan Backend: Kenapa Harus Dua-duanya?</title>
      <dc:creator>Jidan Fatahillah</dc:creator>
      <pubDate>Mon, 05 May 2025 16:57:49 +0000</pubDate>
      <link>https://dev.to/thecrudify/validasi-di-frontend-dan-backend-kenapa-harus-dua-duanya-2f05</link>
      <guid>https://dev.to/thecrudify/validasi-di-frontend-dan-backend-kenapa-harus-dua-duanya-2f05</guid>
      <description>&lt;p&gt;Yo, &lt;em&gt;Guys&lt;/em&gt;! mari mabar.&lt;/p&gt;

&lt;p&gt;Jadi gini, pas kita lagi &lt;em&gt;ngoding&lt;/em&gt; aplikasi, mau itu &lt;em&gt;web app&lt;/em&gt;, &lt;em&gt;mobile&lt;/em&gt;, atau bikin API pasti bakal ada momen kita nerima &lt;em&gt;input&lt;/em&gt; dari &lt;em&gt;user&lt;/em&gt;, kan? Entah itu form registrasi, data login, &lt;em&gt;upload&lt;/em&gt; file, atau apa pun lah.&lt;/p&gt;

&lt;p&gt;Nah, data yang masuk ini &lt;strong&gt;nggak bisa langsung kita percaya gitu aja&lt;/strong&gt;. Sebelum diproses atau dilempar ke &lt;em&gt;database&lt;/em&gt;, kita &lt;em&gt;wajib&lt;/em&gt; pastiin dulu datanya itu &lt;strong&gt;valid, lengkap, dan formatnya sesuai&lt;/strong&gt; sama yang kita harapkan.&lt;/p&gt;

&lt;p&gt;Proses ini, ya kalian udah tau lah, namanya &lt;strong&gt;Validasi Data&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tapi sering banget muncul pertanyaan klasik nih di kalangan &lt;em&gt;developer&lt;/em&gt;, termasuk kita-kita:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Bro, validasi di &lt;em&gt;frontend&lt;/em&gt; aja cukup nggak sih? Kan udah dicek di &lt;em&gt;browser&lt;/em&gt; user. Atau mending di &lt;em&gt;backend&lt;/em&gt; aja biar lebih &lt;em&gt;secure&lt;/em&gt;?" 🤔&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Simple answer&lt;/em&gt;: &lt;strong&gt;Nggak cukup satu, &lt;em&gt;Guys&lt;/em&gt;. Harus dua-duanya. Validasi itu kudu jalan di &lt;em&gt;frontend&lt;/em&gt; DAN &lt;em&gt;backend&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kenapa gitu? Oke, let's cekidot. 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Definisi Validasi Data
&lt;/h2&gt;

&lt;p&gt;Intinya, validasi itu proses &lt;strong&gt;nge-filter dan ngecek&lt;/strong&gt; data &lt;em&gt;input&lt;/em&gt; dari &lt;em&gt;user&lt;/em&gt; biar sesuai sama &lt;em&gt;rules&lt;/em&gt; yang udah kita tentuin. Contoh &lt;em&gt;rules&lt;/em&gt;-nya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email harus pake format &lt;code&gt;nama@domain.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Password&lt;/em&gt; minimal 8 karakter, ada kombinasi huruf besar-kecil, angka, simbol (biar nggak gampang kena &lt;em&gt;brute force&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Nomor HP harus angka semua, panjangnya sekian digit.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Field&lt;/em&gt; nama nggak boleh kosong (&lt;code&gt;required&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Tipe data harus bener (misal, umur ya harus &lt;em&gt;integer&lt;/em&gt;, bukan &lt;em&gt;string&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tujuannya? Jelas, biar data di &lt;em&gt;database&lt;/em&gt; kita bersih (&lt;em&gt;data integrity&lt;/em&gt;), aplikasi nggak gampang &lt;em&gt;crash&lt;/em&gt; gara-gara data aneh, dan yang paling krusial: &lt;strong&gt;nutup celah keamanan&lt;/strong&gt; dari &lt;em&gt;malicious input&lt;/em&gt;. &lt;/p&gt;




&lt;h2&gt;
  
  
  🖥️ Validasi di &lt;em&gt;Frontend&lt;/em&gt; (Sisi Klien/Browser)
&lt;/h2&gt;

&lt;p&gt;Ini validasi yang kita implementasiin pake HTML5 &lt;em&gt;attributes&lt;/em&gt; (&lt;code&gt;required&lt;/code&gt;, &lt;code&gt;minlength&lt;/code&gt;, &lt;code&gt;pattern&lt;/code&gt;, dll) atau pake JavaScript yang jalan di &lt;em&gt;browser&lt;/em&gt; &lt;em&gt;user&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Fungsi utamanya lebih ke &lt;strong&gt;User Experience (UX)&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kasih &lt;em&gt;feedback&lt;/em&gt; instan ke &lt;em&gt;user&lt;/em&gt; kalo ada yang salah input.&lt;/li&gt;
&lt;li&gt;Mencegah &lt;em&gt;submit&lt;/em&gt; form kalo datanya belum bener.&lt;/li&gt;
&lt;li&gt;Bikin interaksi &lt;em&gt;user&lt;/em&gt; lebih mulus dan nggak bikin frustrasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contoh simpel pake JS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Ambil value dari input email&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emailInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Cek simpel pake regex atau string method&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;emailInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;emailInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Kasih warning langsung di UI, jangan cuma alert() hehe&lt;/span&gt;
    &lt;span class="nf"&gt;showError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emailInput&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Format emailnya belum bener, Bro!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validasi &lt;em&gt;frontend&lt;/em&gt; ini penting banget buat &lt;strong&gt;kenyamanan *user&lt;/strong&gt;&lt;em&gt;. Mereka jadi tau kesalahannya di mana *sebelum&lt;/em&gt; data dikirim ke &lt;em&gt;server&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Plus-nya Validasi &lt;em&gt;Frontend&lt;/em&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Responsif:&lt;/strong&gt; &lt;em&gt;Feedback&lt;/em&gt; cepet, nggak perlu nunggu &lt;em&gt;round trip&lt;/em&gt; ke &lt;em&gt;server&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UX Mantap:&lt;/strong&gt; &lt;em&gt;User&lt;/em&gt; nggak perlu nunggu lama buat tau ada yang salah.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ngeringanin Beban &lt;em&gt;Server&lt;/em&gt;:&lt;/strong&gt; &lt;em&gt;Request&lt;/em&gt; yang udah pasti salah nggak perlu dikirim.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ Minus-nya Validasi &lt;em&gt;Frontend&lt;/em&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gampang Banget Di-&lt;em&gt;Bypass&lt;/em&gt;!&lt;/strong&gt; Siapa pun yang ngerti dikit soal &lt;em&gt;web dev&lt;/em&gt; bisa matiin JS di &lt;em&gt;browser&lt;/em&gt;, pake &lt;em&gt;DevTools&lt;/em&gt;, atau langsung &lt;em&gt;hit&lt;/em&gt; API pake Postman/curl. Validasi &lt;em&gt;frontend&lt;/em&gt; jadi nggak ada gunanya.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nggak Bisa Jadi Andalan Keamanan:&lt;/strong&gt; Karena bisa dilewatin, ini &lt;strong&gt;bukan&lt;/strong&gt; benteng keamanan.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Main rule&lt;/em&gt;: &lt;strong&gt;Never trust client-side code for security.&lt;/strong&gt; Semua yang jalan di &lt;em&gt;client&lt;/em&gt; itu bisa dimanipulasi.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔐 Validasi di &lt;em&gt;Backend&lt;/em&gt; (Sisi Server)
&lt;/h2&gt;

&lt;p&gt;Ini dia &lt;strong&gt;benteng pertahanan utama&lt;/strong&gt;. Validasi yang kita implementasiin di sisi &lt;em&gt;server&lt;/em&gt; pake bahasa &lt;em&gt;backend&lt;/em&gt; kita (Node.js, PHP, Python, Go, Java, dll). Semua data yang diterima dari &lt;em&gt;request&lt;/em&gt; (mau itu dari &lt;em&gt;browser&lt;/em&gt;, Postman, atau aplikasi lain) &lt;strong&gt;wajib hukumnya&lt;/strong&gt; divalidasi ulang di sini.&lt;/p&gt;

&lt;p&gt;Contoh di Node.js pake &lt;em&gt;library&lt;/em&gt; kayak Joi atau Express-validator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Pake Joi buat define schema validasi&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RegExp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;^[a-zA-Z0-9]{3,30}$&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// Contoh pake pattern regex&lt;/span&gt;
    &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Joi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;required&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// Umur minimal 17&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Di dalam route handler (misal Express)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userSchema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Validasi req.body&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Kalo validasi gagal, kirim response error 400 (Bad Request)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Input tidak valid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;details&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;details&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Kalo lolos, baru `value` (data yg udah divalidasi &amp;amp; mungkin di-sanitize) diproses lanjut&lt;/span&gt;
&lt;span class="c1"&gt;// Misal: simpan ke database...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Plus-nya Validasi &lt;em&gt;Backend&lt;/em&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Secure:&lt;/em&gt;&lt;/strong&gt; Nggak bisa di-&lt;em&gt;bypass&lt;/em&gt; sama &lt;em&gt;user&lt;/em&gt;. Ini &lt;em&gt;single source of truth&lt;/em&gt; buat aturan data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Melindungi Integritas Data:&lt;/strong&gt; Mastiin data yang masuk ke &lt;em&gt;database&lt;/em&gt; atau diproses &lt;em&gt;logic&lt;/em&gt; bisnis itu beneran valid.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Menjaga Konsistensi &lt;em&gt;Business Logic&lt;/em&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wajib Ada&lt;/strong&gt; untuk semua API &lt;em&gt;endpoint&lt;/em&gt;, terutama yang &lt;em&gt;public&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚠️ Minus-nya Validasi &lt;em&gt;Backend&lt;/em&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;Feedback&lt;/em&gt; ke &lt;em&gt;User&lt;/em&gt; Lebih Lambat:&lt;/strong&gt; Perlu &lt;em&gt;request&lt;/em&gt; dikirim dulu, diproses &lt;em&gt;server&lt;/em&gt;, baru &lt;em&gt;response&lt;/em&gt; balik.&lt;/li&gt;
&lt;li&gt;Butuh &lt;em&gt;Network Round Trip.&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤝 Jadi, Kenapa Harus Dua-duanya?
&lt;/h2&gt;

&lt;p&gt;Karena &lt;em&gt;frontend&lt;/em&gt; dan &lt;em&gt;backend&lt;/em&gt; punya &lt;strong&gt;peran dan tujuan yang beda tapi saling melengkapi&lt;/strong&gt;. Bukan pilihan &lt;em&gt;either/or&lt;/em&gt;, tapi &lt;em&gt;both&lt;/em&gt;. Kek aku dan kamu aokwoakwoa.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lokasi Validasi&lt;/th&gt;
&lt;th&gt;Fokus Utama&lt;/th&gt;
&lt;th&gt;Bisa Di-&lt;em&gt;Bypass&lt;/em&gt;?&lt;/th&gt;
&lt;th&gt;
&lt;em&gt;Feedback&lt;/em&gt; Cepat?&lt;/th&gt;
&lt;th&gt;
&lt;em&gt;Security&lt;/em&gt;?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Frontend&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;UX, Kenyamanan User&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yoi&lt;/strong&gt; (Mudah)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yoi&lt;/strong&gt; (Instan)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Tidak Aman&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Backend&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Keamanan&lt;/strong&gt;, Integritas Data, &lt;em&gt;Rules&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;TIDAK&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tidak Instan&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Wajib Aman&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gampangnya gini:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Frontend&lt;/em&gt; itu buat kenyamanan (&lt;em&gt;convenience&lt;/em&gt;), &lt;em&gt;Backend&lt;/em&gt; itu buat keamanan (&lt;em&gt;security&lt;/em&gt;).&lt;/strong&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Contoh skenario ideal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;em&gt;User&lt;/em&gt; salah ketik format email di &lt;em&gt;form&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;&lt;em&gt;Frontend&lt;/em&gt; (JS):&lt;/strong&gt; Langsung ngasih &lt;em&gt;warning&lt;/em&gt; di bawah &lt;em&gt;input field&lt;/em&gt;, "Format email salah nih." -&amp;gt; UX bagus.&lt;/li&gt;
&lt;li&gt; &lt;em&gt;User&lt;/em&gt; iseng &lt;em&gt;bypass&lt;/em&gt; validasi &lt;em&gt;frontend&lt;/em&gt; pake Postman, kirim email ngasal.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;&lt;em&gt;Backend&lt;/em&gt; (Server):&lt;/strong&gt; Nerima &lt;em&gt;request&lt;/em&gt;, jalanin validasi &lt;em&gt;backend&lt;/em&gt;. "Wah, email nggak valid!" -&amp;gt; &lt;em&gt;Request&lt;/em&gt; ditolak (400 Bad Request), data sampah nggak masuk sistem. -&amp;gt; &lt;em&gt;Security&lt;/em&gt; terjaga.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ⚠️ Risiko Kalo Cuma Validasi di Satu Sisi?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Frontend&lt;/em&gt; Aja (Tanpa &lt;em&gt;Backend&lt;/em&gt;)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⛔ &lt;strong&gt;Fatal!&lt;/strong&gt; Sistem lo gampang banget dieksploitasi. &lt;em&gt;SQL Injection&lt;/em&gt;, &lt;em&gt;XSS&lt;/em&gt;, data korup di DB, semua bisa terjadi.&lt;/li&gt;
&lt;li&gt;✅ UX mungkin oke, tapi keamanannya nol besar. Nggak &lt;em&gt;sustainable&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Backend&lt;/em&gt; Aja (Tanpa &lt;em&gt;Frontend&lt;/em&gt;)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Aman? Iya.&lt;/strong&gt; Data dijamin &lt;em&gt;valid&lt;/em&gt; sesuai &lt;em&gt;rules&lt;/em&gt; &lt;em&gt;server&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;⛔ &lt;strong&gt;UX Jelek.&lt;/strong&gt; &lt;em&gt;User&lt;/em&gt; harus &lt;em&gt;submit&lt;/em&gt; dulu, nunggu &lt;em&gt;loading&lt;/em&gt;, baru dikasih tau ada &lt;em&gt;error&lt;/em&gt; di &lt;em&gt;field&lt;/em&gt; A, B, C. Bolak-balik gitu terus bisa bikin &lt;em&gt;user&lt;/em&gt; emosi jiwa. 😤&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jadi, jelas ya? Kalo &lt;em&gt;frontend&lt;/em&gt; doang, aplikasi lo rapuh. Kalo &lt;em&gt;backend&lt;/em&gt; doang, &lt;em&gt;user&lt;/em&gt; nggak nyaman pakenya.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ &lt;em&gt;Best Practice&lt;/em&gt; Validasi
&lt;/h2&gt;

&lt;p&gt;Biar implementasi validasi lo bener:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;💡 &lt;strong&gt;Gunakan *Library/Framework Validation:&lt;/strong&gt;* Jangan &lt;em&gt;reinvent the wheel&lt;/em&gt;. Manfaatin &lt;em&gt;library&lt;/em&gt; kayak Joi, Yup, Zod, class-validator (Node.js/TS), atau fitur validasi bawaan &lt;em&gt;framework&lt;/em&gt; (Laravel, Django, Spring Boot, dll). Ini lebih efisien dan &lt;em&gt;less error-prone&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🧪 &lt;strong&gt;Validasi Semua &lt;em&gt;Entry Point&lt;/em&gt; Data:&lt;/strong&gt; Termasuk &lt;em&gt;request body&lt;/em&gt;, &lt;em&gt;query parameters&lt;/em&gt;, &lt;em&gt;path parameters&lt;/em&gt; (URL), &lt;em&gt;headers&lt;/em&gt;, &lt;em&gt;cookies&lt;/em&gt;, dan &lt;em&gt;file uploads&lt;/em&gt;. Jangan ada yang lolos!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔁 &lt;strong&gt;&lt;em&gt;Re-validate&lt;/em&gt; di &lt;em&gt;Backend&lt;/em&gt;:&lt;/strong&gt; Ini mantra wajib. &lt;strong&gt;Selalu validasi ulang di &lt;em&gt;backend&lt;/em&gt;,&lt;/strong&gt; jangan pernah percaya 100% sama data yang udah "lolos" validasi &lt;em&gt;frontend&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔐 &lt;strong&gt;&lt;em&gt;Treat All User Input as Untrusted:&lt;/em&gt;&lt;/strong&gt; Punya &lt;em&gt;mindset&lt;/em&gt; &lt;em&gt;zero-trust&lt;/em&gt; ke &lt;em&gt;input&lt;/em&gt; dari luar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✨ &lt;strong&gt;&lt;em&gt;Shared Validation Schema (Opsional tapi Keren):&lt;/em&gt;&lt;/strong&gt; Kalo memungkinkan (misal pake &lt;em&gt;fullstack&lt;/em&gt; TypeScript), coba pake &lt;em&gt;library&lt;/em&gt; kayak Zod yang bisa bikin &lt;em&gt;schema&lt;/em&gt; validasi yang sama buat dipake di &lt;em&gt;frontend&lt;/em&gt; dan &lt;em&gt;backend&lt;/em&gt;. Biar &lt;em&gt;DRY (Don't Repeat Yourself)&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Kesimpulan Akhir
&lt;/h2&gt;

&lt;p&gt;Validasi data itu &lt;em&gt;fundamental&lt;/em&gt; banget dalam &lt;em&gt;software development&lt;/em&gt;. Nggak bisa dianggap remeh. Jangan pilih satu sisi aja.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Validasi &lt;em&gt;frontend&lt;/em&gt; itu kayak &lt;strong&gt;asisten dosen&lt;/strong&gt; yang ngecek kelengkapan laporan sebelum dikumpul biar rapi dan enak dilihat.&lt;br&gt;
Validasi &lt;em&gt;backend&lt;/em&gt; itu kayak &lt;em&gt;dosen&lt;/em&gt; &lt;strong&gt;killer&lt;/strong&gt; yang meriksa isi laporannya beneran sesuai kaidah atau nggak ini penentu utama lulus atau nggaknya.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Jadi, &lt;em&gt;WAJIB&lt;/em&gt; pake dua-duanya.&lt;/strong&gt; Bikin aplikasi yang &lt;em&gt;user-friendly&lt;/em&gt; di depan, tapi juga &lt;em&gt;robust&lt;/em&gt; dan &lt;em&gt;secure&lt;/em&gt; di belakang. Oke, &lt;em&gt;Guys&lt;/em&gt;? 😉&lt;/p&gt;




&lt;p&gt;Semoga penjelasan ini bermanfaat ya! Kalo ada pengalaman atau tips lain soal validasi, &lt;em&gt;sharing&lt;/em&gt; aja di bawah! 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>validation</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
