✅ B6 · POST + @Valid: Bean Validation
B6 · POST + @Valid: Bean Validation: `@Valid`, API'nin **kapı bekçisidir**: bir POST request'i içeri girmeden önce gövdedeki her alanı kurallara göre yoklar — `title` boş mu, 3-1
`@Valid`, API'nin **kapı bekçisidir**: bir POST request'i içeri girmeden önce gövdedeki her alanı kurallara göre yoklar — `title` boş mu, 3-120 karakter mi, `reporter` gerçek bir email mi? Kurala uymayan request daha service'e VARMADAN 400 ile geri çevrilir. Peki UI zaten boş başlığı JavaScript ile engelliyorsa, sunucuda ayrıca doğrulamaya neden gerek var? Çünkü UI sadece BİR istemcidir: mobil uygulama, Postman, başka bir servis veya kötü niyetli bir script doğrudan API'ye vurabilir ve UI'nın JS kontrolünü tamamen atlar — sunucu doğrulaması, güvenilebilecek TEK savunma hattıdır. Java'da bunun karşılığı Bean Validation'dır: DTO alanlarına `@NotBlank`, `@Size(min=3,max=120)`, `@Email` annotation'ları koyarsın ve `@Valid` bunları tetikler; controller metodu hiç çalışmadan hatalı request reddedilir. QA açısından bu, en klasik "yanlış güven" tuzağının panzehiridir: "UI valide ediyor, o yüzden API güvenli" varsayımı yanlıştır — tester UI'yı bypass edip doğrudan API'ye geçersiz veri göndererek sunucu doğrulamasını KANITLAMALIDIR.
DTO + Bean Validation + @Valid
**🐞 Defect Doğum Anı — `@Valid` annotation'ı unutulursa** **Kod:** `public ResponseEntity create(@RequestBody BugRequest req)` — `@Valid` YOK (yalnızca `@RequestBody`). **Ne olur:** DTO'daki `@NotBlank`/`@Size` kuralları TANIMLI ama tetiklenmez. `POST /api/v1/bugs { "title": "" }` request'i 400 yerine **201 Created** döner ve veritabanına boş başlıklı bir bug yazılır. **Neden sinsi:** UI'daki JavaScript zaten boş başlığı engelliyor, bu yüzden manuel/UI testi PASS verir — hata hiç görünmez. Ama mobil uygulama veya Postman doğrudan API'ye vurunca boş kayıt açılır: production'da "boş bug" kirliliği. Kurallar kodda DURUYOR ama bekçi olmadan hiçbir işe yaramıyor. **Tester nerede yakalar:** Postman'de UI'yı bypass edip boş `title` göndererek — 400 beklerken 201 alınca. Bu, "UI valide ediyor" güveninin neden yanlış olduğunun doğrudan kanıtıdır.
🎬 @Valid Kapıda Duruyor: UI Bypass Edilince Ne Olur?
Kullanıcı UI'da boş başlıkla "Kaydet"e basıyor. UI'daki JavaScript hemen engelliyor: "title boş olamaz". UI testi PASS.
Ama Postman (ya da mobil uygulama) UI'yı TAMAMEN atlar ve doğrudan API'ye boş title gönderir. UI'nın JS kontrolü burada YOKTUR.
@Valid VARSA: kapı bekçisi boş title'ı yakalar ve request'i 400 ile geri çevirir. Sunucu, güvenilebilecek son savunma hattı olarak çalışır.
@Valid YOKSA: kurallar kodda dursa da tetiklenmez. Boş title 201 döner, veritabanına boş bir bug yazılır — production kirliliği.
Ders — UI doğrulaması bir kolaylıktır, güvence değil. Tek güvenilir kapı sunucudaki @Valid'dir. Tester UI'yı bypass edip bunu KANITLAR.
Neden Sunucu Doğrulaması Şart?
UI yalnızca bir istemci…
UI'daki JS kontrolü sadece o tarayıcıda çalışır; mobil, Postman, başka servis bunu görmez.
@Valid merkezî kapı…
Sunucu doğrulaması hangi istemciden gelirse gelsin çalışır — güvenilebilecek tek katman.