🎛️ B5 · Controller: @RestController, path/query param
B5 · Controller: @RestController: Controller katmanı, API'nin **resepsiyon görevlisidir**: gelen HTTP request'ini karşılar, "hangi yol, hangi metod, hangi parametreler" diye ayrı
Controller katmanı, API'nin **resepsiyon görevlisidir**: gelen HTTP request'ini karşılar, "hangi yol, hangi metod, hangi parametreler" diye ayrıştırır ve doğru service metoduna yönlendirir — kendisi iş yapmaz, yönlendirir. İki tür parametreyi ayırt eder: **path variable** (yolun İÇİNDE, bir kaynağı KİMLİKLER — `/api/v1/bugs/42`'deki `42`) ve **query param** (yolun SONUNDA `?` ile, listeyi SÜZER/sayfalar — `?status=OPEN&page=2`). Peki ikisi de "parametre" ise neden ayrı kavramlar? Çünkü niyetleri farklıdır: path variable "hangi kaydı" (tekil, zorunlu), query param "nasıl filtreleyeyim" (opsiyonel, çoğul) der — birini diğerinin yerine koymak URL tasarımını ve testleri bozar. Java'da bunun karşılığı `@PathVariable Long id` ile `@RequestParam(required=false) String status` ayrımıdır; Spring bu annotation'larla URL parçalarını metot parametrelerine bağlar. QA açısından controller, **sınır testlerinin** kapısıdır: eksik/yanlış tipte path variable (`/bugs/abc`), tanımsız query param, sayfalama sınırları (`page=-1`, `size=99999`) — bu girdiler çoğu bug'ın doğduğu yerdir ve controller seviyesinde test edilir.
Controller: Yol, Path Variable, Query Param
**🐞 Defect Doğum Anı — sayfalama `size` sınırlanmazsa** **Kod:** `@RequestParam(defaultValue = "20") int size` — üst sınır yok; `size` doğrudan service'e/DB'ye geçiyor. **Ne olur:** `GET /api/v1/bugs?size=1000000` request'i milyonlarca kaydı tek response'ta çekmeye çalışır. Sunucu belleği şişer, response saniyelerce sürer veya OutOfMemory ile 500 döner. Kötü niyetli tek bir request servisi yavaşlatabilir (DoS). **Neden sinsi:** Normal kullanımda (`size=20`) her şey mükemmel çalışır, testler geçer. Sorun yalnızca sınır-dışı bir değerle ortaya çıkar — kimse "ya biri size=1000000 gönderirse?" diye düşünmediği için production'a kadar gizli kalır. **Tester nerede yakalar:** Sınır testinde — `size=0`, `size=-1`, `size=999999` gönderip makul bir davranış (400 veya sabit üst sınıra kırpma) beklerken sunucunun zorlandığını/500 döndüğünü görünce. Controller, bu tür girdi sınırlarının test edildiği katmandır.
🎬 Path mi Query mi? Bir URL Nasıl Doğru Yönlendirilir
/bugs/42?status=OPEN
Bir URL geliyor: `/api/v1/bugs/42?status=OPEN`. İçinde iki tür parametre var — controller bunları nasıl ayırır?
Yolun İÇİNDEKİ `42` bir path variable'dır: "hangi kaydı" der. Controller onu @PathVariable Long id'ye bağlar — tekil, zorunlu.
`?` sonrasındaki `status=OPEN` bir query param'dır: "nasıl süzeyim" der. Controller onu @RequestParam'a bağlar — opsiyonel, filtreleme.
Controller iki parçayı doğru bağlayıp service'e devreder: "42 numaralı bug'ı, OPEN filtresiyle getir". Kendisi iş yapmaz, yönlendirir.
Ders — path variable "hangi kaydı" (kimlik), query param "nasıl filtreleyeyim" (opsiyon) der. Tester sınırları burada zorlar: /bugs/abc, size=-1, tanımsız param.
Controller Seviyesinde Sınır Testleri
Yanlış tip path variable…
/api/v1/bugs/abc — id Long beklenirken metin gelir. Spring bunu 400 ile reddetmeli; etmiyorsa bug.
Sayfalama sınırları…