Save() di ORM: Praktis, Tapi Kadang Bikin Data Korban

2025-05-25

pro-kontra-developer

πŸ“’ DISCLAIMER

Ini pro kontra aja yaaa, jangan branteeem, pilih yang terbaik menurut kamu aja. Tapi, Klo km ngerasa yg bikin ga aman sih, yaaa segera tobat!! Hehe πŸ˜…

πŸ’¬ Squad Chat Group

T

si tester

Guuuuys, Kenapa user admin di production jadi user biasa semua ya? 😐

14.20

R

si paling ribet

Ini siapa yang bikin fungsi update nya?!

14.21

P

si paling praktis

Yaelah, udh gw pake save() di api update...

14.22

R

si paling ribet

Bentar, Lu save se-object dari payload frontend? 😱😱😱

14.22

P

si paling praktis

Iya, tapi kan dari FE nya cuma is_active doang yang diubah...

14.22

R

si paling ribet

Lha! kalo field lain NULL atau kosong gimana? Ketiban default di DB tuh 😬

14.23

T

si tester

Guuuuys, udaaaaah, ini semua role user berubah loh 😭😭😭, benerin iiiiiih ....

14.25

🟒 Tim Pro: Kenapa save() Jadi Pilihan?

  • Cepat, praktis, tinggal kirim objek β†’ ORM urus sisanya
  • Cocok untuk full update, admin panel, atau form lengkap
  • Sekali tulis, bisa handle insert atau update (UPSERT)
  • DRY: bisa reuse fungsi yang sama tanpa mikir kolom spesifik

πŸ”΄ Tim Kontra: Kenapa save() Bisa Jadi Bumerang

  • Gak aman buat partial update dari frontend
  • Field sensitif bisa ke-overwrite karena NULL/default
  • Payload kotor = bisa bikin silent data corruption
  • Debugging jadi ribet karena gak keliatan field mana yang berubah

πŸ§ͺ Analisa & Sudut Pandang Secure Coding

ORM .save() itu abstraction yang powerful... Tapi kalau kita kasih data setengah matang, ORM bisa aja ngira:

"Oh ini NULL? Berarti lo mau update NULL ya?"

Padahal… bisa jadi frontend gak kirim field itu.

❌❌ Bad Practices ❌❌

❌ NGERI INI MAH!!!

Hindari langsung .save() dari payload frontend untuk update sebagian data. Ini kaya ngasih senjata ke ORM tanpa kasih tahu targetnya.

Menggunakan .save() langsung dari payload frontend tanpa validasi atau sanitasi bisa berujung ke masalah besar.


Misalnya:

Ts

const payload = {
  id: 123,
  is_active: true, // cuma ini yang dimaksud
  // field lain gak dikirim β†’ jadi undefined/null
};

await userRepo.save(payload); // β›˜ Field lain bisa ke-replace

Kenapa ini bisa bahaya?

  • Field seperti role, status, atau flag bisa hilang nilainya jika tidak ikut dikirim oleh frontend.
  • Default value dari DB bisa menimpa nilai lama tanpa terdeteksi.
  • Logging perubahan jadi susah, karena kita gak tau mana field yang beneran diubah.
  • ORM akan anggap semua field yang dikirim adalah β€œintended update”.

πŸ›‘οΈπŸ›‘οΈ Secure Best Practices πŸ›‘οΈπŸ›‘οΈ

βœ… Mantap!

Pastikan dulu field data yang masuk konsesten dengan yang akan diupdate. Lakukan validasi dan sanitasi sebelum update. Update field yang memang dimaksud, jangan asal save.

Untuk partial update yang aman, kamu bisa gunakan pendekatan eksplisit di masing-masing stack:


βœ… Typescript (MongoDB dengan Mongoose)

Ts

await User.updateOne(
  { _id: userId },
  { $set: { is_active: true } }
);

βœ… Golang (PostgreSQL dengan SQLX)

Go

_, err := db.Exec(`UPDATE users SET is_active = $1 WHERE id = $2`, true, userID)

βœ… PHP (Laravel Eloquent dengan MySQL)

Php

User::where('id', $userId)->update(['is_active' => true]);

Semua contoh di atas:

  • Hanya mengubah field yang dimaksud
  • Menjaga field lain tetap utuh
  • Tidak bergantung pada keseluruhan object dari frontend

Tips tambahan:

  • Validasi payload secara eksplisit
  • Gunakan DTO (Data Transfer Object) atau Form Request (di Laravel)
  • Audit log: simpan perubahan dan siapa yang melakukan
  • Hindari auto-bind data tanpa filtering
⚠️ Waspada, Lur!

⚠️ ORM itu bukan cenayang. Dia gak tau mana field yang sengaja dikosongin, mana yang gak dikirim.

βœ… Takeaway Developer

Kalau update-nya full dan valid β†’ boleh pakai .save(). Kalau cuma ubah sebagian atau dari frontend β†’ mending .update().

Ilustrasi Developer Galau: Save atau Update?
SituasiRekomendasi
Update lengkap, data bersihBoleh pakai `.save()`
Partial updateGunakan `.update()` explicit
Field sensitif (role, status, flag)Wajib eksplisit! Jangan nekat `save()`
ℹ️ Info Gaes!

ℹ️ Beberapa ORM (kayak TypeORM, Sequelize) punya fitur preload/merge. Tapi tetep: abstraction bukan alasan buat males mikir.

πŸ€” Diskusi & Sharing Pengalaman

Lo tim save() atau update()? Pernah kena kasus field ketiban NULL cuma karena form gak lengkap?

Yuk share pengalaman lo. Biar semua developer belajar dari kasus nyata, bukan cuma dari dokumentasi.

Konten Terkait :

Any Any di Typescript: Males kok bilangnya biar Fleksibel