{"id":38545,"date":"2026-02-02T16:00:41","date_gmt":"2026-02-02T13:00:41","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/"},"modified":"2026-02-02T16:00:41","modified_gmt":"2026-02-02T13:00:41","slug":"spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/","title":{"rendered":"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f"},"content":{"rendered":"<h2>Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f<\/h2>\n<p>Spring Boot, modern Java tabanl\u0131 web uygulamalar\u0131 geli\u015ftirmek i\u00e7in tercih edilen bir \u00e7er\u00e7evedir. Bu ekosistemin temel yap\u0131 ta\u015flar\u0131ndan biri olan Controller&#8217;lar, gelen HTTP isteklerini kar\u015f\u0131lamak, i\u015f mant\u0131\u011f\u0131n\u0131 tetiklemek ve uygun yan\u0131tlar\u0131 d\u00f6nd\u00fcrmekle g\u00f6revli bile\u015fenlerdir. Bu makale, Spring Boot projelerinde Controller kavram\u0131n\u0131 A&#8217;dan Z&#8217;ye ele alacak, temelden ileri seviyeye kadar t\u00fcm y\u00f6nlerini detayl\u0131 bir \u015fekilde inceleyerek, bu kritik bile\u015feni tam anlam\u0131yla anlaman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Controller Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>Spring Boot uygulamalar\u0131nda Controller&#8217;lar, web katman\u0131n\u0131n kalbini olu\u015fturur. Kullan\u0131c\u0131lardan gelen istekleri kar\u015f\u0131layan, bu istekleri uygun servis katmanlar\u0131na y\u00f6nlendiren ve sonras\u0131nda i\u015flenen verileri kullan\u0131c\u0131ya geri d\u00f6nd\u00fcren k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcrler. MVC (Model-View-Controller) mimarisinin &#8220;C&#8221; bile\u015fenini temsil eden Controller&#8217;lar, uygulaman\u0131n d\u0131\u015f d\u00fcnya ile etkile\u015fimini y\u00f6netir.<\/p>\n<h4>MVC Mimarisi ve Controller&#8217;\u0131n Rol\u00fc<\/h4>\n<p>MVC, yaz\u0131l\u0131m tasar\u0131m\u0131nda kullan\u0131lan bir mimari desendir ve uygulamay\u0131 \u00fc\u00e7 ana bile\u015fene ay\u0131r\u0131r:<\/p>\n<ul>\n<li><b>Model:<\/b> Uygulaman\u0131n verilerini ve i\u015f mant\u0131\u011f\u0131n\u0131 temsil eder.<\/li>\n<li><b>View:<\/b> Kullan\u0131c\u0131ya sunulan aray\u00fcz\u00fc (HTML, JSON vb.) temsil eder.<\/li>\n<li><b>Controller:<\/b> Model ve View aras\u0131ndaki ileti\u015fimi sa\u011flar, kullan\u0131c\u0131 etkile\u015fimlerini y\u00f6netir.<\/li>\n<\/ul>\n<p>Spring Boot&#8217;ta Controller, gelen HTTP isteklerini (GET, POST, PUT, DELETE) al\u0131r, bu istekleri i\u015flemek i\u00e7in Model katman\u0131ndaki servisleri \u00e7a\u011f\u0131r\u0131r ve ard\u0131ndan elde edilen sonu\u00e7lar\u0131 uygun bir View (\u00f6rne\u011fin bir HTML sayfas\u0131 veya bir REST API durumunda JSON verisi) arac\u0131l\u0131\u011f\u0131yla kullan\u0131c\u0131ya geri g\u00f6nderir. Bu ayr\u0131m, kodun daha d\u00fczenli, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>\u0130stek-Yan\u0131t D\u00f6ng\u00fcs\u00fcnde Controller&#8217;\u0131n Yeri<\/h4>\n<p>Bir web uygulamas\u0131nda tipik bir istek-yan\u0131t d\u00f6ng\u00fcs\u00fc \u015fu ad\u0131mlar\u0131 izler:<\/p>\n<ol>\n<li>Kullan\u0131c\u0131 bir HTTP iste\u011fi g\u00f6nderir (\u00f6rne\u011fin, bir URL&#8217;ye eri\u015fir).<\/li>\n<li>\u0130stek, Spring DispatcherServlet taraf\u0131ndan yakalan\u0131r.<\/li>\n<li>DispatcherServlet, iste\u011fi i\u015flemek i\u00e7in uygun Controller&#8217;\u0131 bulur.<\/li>\n<li>Controller, iste\u011fi i\u015fler, gerekli i\u015f mant\u0131\u011f\u0131n\u0131 servisler arac\u0131l\u0131\u011f\u0131yla y\u00fcr\u00fct\u00fcr.<\/li>\n<li>Controller, i\u015flenen veriyi bir yan\u0131t (\u00f6rne\u011fin, HTML, JSON, XML) olarak haz\u0131rlar.<\/li>\n<li>Yan\u0131t, DispatcherServlet arac\u0131l\u0131\u011f\u0131yla kullan\u0131c\u0131ya geri g\u00f6nderilir.<\/li>\n<\/ol>\n<p>Bu d\u00f6ng\u00fcde Controller, merkezi bir rol oynayarak uygulaman\u0131n d\u0131\u015f d\u00fcnya ile etkile\u015fimini d\u00fczenler.<\/p>\n<h4>Web Uygulamalar\u0131nda Controller&#8217;\u0131n \u00d6nemi<\/h4>\n<p>Controller&#8217;lar, bir Spring Boot uygulamas\u0131n\u0131n API veya web aray\u00fcz\u00fcn\u00fc tan\u0131mlayan ana bile\u015fenlerdir. Do\u011fru tasarlanm\u0131\u015f Controller&#8217;lar sayesinde:<\/p>\n<ul>\n<li>Uygulaman\u0131n API&#8217;si anla\u015f\u0131l\u0131r ve tutarl\u0131 olur.<\/li>\n<li>\u0130steklerin do\u011fru i\u015f mant\u0131\u011f\u0131na y\u00f6nlendirilmesi sa\u011flan\u0131r.<\/li>\n<li>Hata y\u00f6netimi ve g\u00fcvenlik gibi \u00e7apraz kesen konular daha kolay entegre edilir.<\/li>\n<li>Uygulama, farkl\u0131 istemciler (web taray\u0131c\u0131lar\u0131, mobil uygulamalar, di\u011fer servisler) taraf\u0131ndan kolayca t\u00fcketilebilir hale gelir.<\/li>\n<\/ul>\n<h3>Temel Controller Annotasyonlar\u0131 ve Kullan\u0131mlar\u0131<\/h3>\n<p>Spring Boot&#8217;ta Controller&#8217;lar\u0131 tan\u0131mlamak ve yap\u0131land\u0131rmak i\u00e7in \u00e7e\u015fitli annotasyonlar kullan\u0131l\u0131r. Bu annotasyonlar, Spring \u00e7er\u00e7evesine bir s\u0131n\u0131f\u0131n veya metodun belirli bir rol\u00fc oldu\u011funu bildirir.<\/p>\n<h4><code>@Controller<\/code> ve <code>@RestController<\/code> Fark\u0131<\/h4>\n<p>Bu iki annotasyon, Spring Boot&#8217;ta Controller s\u0131n\u0131flar\u0131n\u0131 i\u015faretlemek i\u00e7in kullan\u0131l\u0131r, ancak \u00f6nemli farkl\u0131l\u0131klar\u0131 vard\u0131r:<\/p>\n<table>\n<thead>\n<tr>\n<th>\u00d6zellik<\/th>\n<th><code>@Controller<\/code><\/th>\n<th><code>@RestController<\/code><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><b>Ama\u00e7<\/b><\/td>\n<td>Geleneksel web uygulamalar\u0131 (MVC) i\u00e7in, genellikle ViewResolver ile birlikte HTML sayfalar\u0131 d\u00f6nd\u00fcr\u00fcr.<\/td>\n<td>RESTful web servisleri i\u00e7in, varsay\u0131lan olarak JSON\/XML gibi veri formatlar\u0131nda yan\u0131t d\u00f6nd\u00fcr\u00fcr.<\/td>\n<\/tr>\n<tr>\n<td><b><code>@ResponseBody<\/code><\/b><\/td>\n<td>Metotlar\u0131n <code>@ResponseBody<\/code> ile a\u00e7\u0131k\u00e7a i\u015faretlenmesi gerekir.<\/td>\n<td>T\u00fcm metotlar i\u00e7in varsay\u0131lan olarak <code>@ResponseBody<\/code> davran\u0131\u015f\u0131n\u0131 i\u00e7erir.<\/td>\n<\/tr>\n<tr>\n<td><b>D\u00f6n\u00fc\u015f Tipi<\/b><\/td>\n<td>Genellikle bir g\u00f6r\u00fcn\u00fcm ad\u0131 (String) veya <code>ModelAndView<\/code> d\u00f6nd\u00fcr\u00fcr.<\/td>\n<td>Do\u011frudan veriyi (POJO, List vb.) d\u00f6nd\u00fcr\u00fcr, bu da HTTP yan\u0131t g\u00f6vdesine d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr.<\/td>\n<\/tr>\n<tr>\n<td><b>Kullan\u0131m Alan\u0131<\/b><\/td>\n<td>Thymeleaf, JSP gibi \u015fablon motorlar\u0131yla \u00e7al\u0131\u015fan web aray\u00fczleri.<\/td>\n<td>API&#8217;ler, mikroservisler, mobil uygulama backend&#8217;leri.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><b>\u00d6rnek <code>@Controller<\/code>:<\/b><\/p>\n<pre><code>\n@Controller\npublic class WebController {\n\n    @GetMapping(\"\/merhaba\")\n    public String merhabaDunya(Model model) {\n        model.addAttribute(\"mesaj\", \"Merhaba Spring Boot!\");\n        return \"merhaba\"; \/\/ merhaba.html veya merhaba.jsp'yi arar\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p><b>\u00d6rnek <code>@RestController<\/code>:<\/b><\/p>\n<pre><code>\n@RestController\n@RequestMapping(\"\/api\/urunler\")\npublic class UrunRestController {\n\n    @GetMapping\n    public List<String> getAllUrunler() {\n        return Arrays.asList(\"Laptop\", \"Mouse\", \"Klavye\");\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4><code>@RequestMapping<\/code> Genel Kullan\u0131m\u0131<\/h4>\n<p><code>@RequestMapping<\/code>, bir HTTP iste\u011fini bir Controller metoduna e\u015fle\u015ftirmek i\u00e7in kullan\u0131lan \u00e7ok y\u00f6nl\u00fc bir annotasyondur. Hem s\u0131n\u0131f seviyesinde hem de metot seviyesinde kullan\u0131labilir. S\u0131n\u0131f seviyesinde kullan\u0131ld\u0131\u011f\u0131nda, o Controller i\u00e7indeki t\u00fcm metotlar\u0131n URL yollar\u0131n\u0131n \u00f6n\u00fcne bir \u00f6nek ekler.<\/p>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\n@RestController\n@RequestMapping(\"\/api\/kullanicilar\") \/\/ S\u0131n\u0131f seviyesi \u00f6nek\npublic class KullaniciRestController {\n\n    @RequestMapping(method = RequestMethod.GET, path = \"\/{id}\") \/\/ Metot seviyesi e\u015fle\u015ftirme\n    public String getKullaniciById(@PathVariable Long id) {\n        return \"Kullan\u0131c\u0131 ID: \" + id;\n    }\n}\n<\/pre>\n<p><\/code><br \/>\nBu \u00f6rnekte, <code>\/api\/kullanicilar\/1<\/code> adresine yap\u0131lan bir GET iste\u011fi <code>getKullaniciById<\/code> metodunu tetikleyecektir.<\/p>\n<h4><code>@GetMapping<\/code>, <code>@PostMapping<\/code> ve Di\u011ferleri<\/h4>\n<p><code>@RequestMapping<\/code> annotasyonunun daha spesifik ve okunabilir versiyonlar\u0131d\u0131r. Bunlar, belirli HTTP metotlar\u0131na g\u00f6re istekleri e\u015fle\u015ftirmek i\u00e7in kullan\u0131l\u0131r ve kodun amac\u0131n\u0131 daha net ifade eder.<\/p>\n<ul>\n<li><code>@GetMapping<\/code>: HTTP GET istekleri i\u00e7in.<\/li>\n<li><code>@PostMapping<\/code>: HTTP POST istekleri i\u00e7in.<\/li>\n<li><code>@PutMapping<\/code>: HTTP PUT istekleri i\u00e7in.<\/li>\n<li><code>@DeleteMapping<\/code>: HTTP DELETE istekleri i\u00e7in.<\/li>\n<li><code>@PatchMapping<\/code>: HTTP PATCH istekleri i\u00e7in.<\/li>\n<\/ul>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\n@RestController\n@RequestMapping(\"\/api\/gorevler\")\npublic class GorevRestController {\n\n    @GetMapping \/\/ GET \/api\/gorevler\n    public List<String> getAllGorevler() {\n        return Arrays.asList(\"Al\u0131\u015fveri\u015f yap\", \"Fatura \u00f6de\");\n    }\n\n    @PostMapping \/\/ POST \/api\/gorevler\n    public String createGorev(@RequestBody String gorevAdi) {\n        return \"G\u00f6rev olu\u015fturuldu: \" + gorevAdi;\n    }\n\n    @DeleteMapping(\"\/{id}\") \/\/ DELETE \/api\/gorevler\/{id}\n    public String deleteGorev(@PathVariable Long id) {\n        return \"G\u00f6rev silindi: \" + id;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>HTTP \u0130steklerini Y\u00f6netmek: <code>@RequestMapping<\/code> ve T\u00fcrevleri<\/h3>\n<p>Spring Boot Controller'lar\u0131, <code>@RequestMapping<\/code> ve onun t\u00fcrevleri sayesinde gelen HTTP isteklerini \u00e7ok esnek bir \u015fekilde y\u00f6netebilir. Bu, sadece URL yoluna g\u00f6re de\u011fil, ayn\u0131 zamanda HTTP metodu, ba\u015fl\u0131klar, parametreler ve medya tiplerine g\u00f6re de e\u015fle\u015ftirme yapabilme yetene\u011fi anlam\u0131na gelir.<\/p>\n<h4>URL Yollar\u0131 ve Wildcard Kullan\u0131m\u0131<\/h4>\n<p><code>@RequestMapping<\/code> annotasyonunda URL yollar\u0131n\u0131 tan\u0131mlarken wildcard karakterler kullan\u0131labilir.<\/p>\n<ul>\n<li><code>*<\/code>: Tek bir yol segmentini e\u015fle\u015ftirir. \u00d6rn: <code>\/urunler\/*<\/code> -> <code>\/urunler\/kitap<\/code> veya <code>\/urunler\/kalem<\/code><\/li>\n<li><code><strong><\/code>: Birden fazla yol segmentini e\u015fle\u015ftirir. \u00d6rn: <code>\/static\/<\/strong><\/code> -> <code>\/static\/css\/style.css<\/code> veya <code>\/static\/js\/app.js<\/code><\/li>\n<\/ul>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\n@GetMapping(\"\/urunler\/{kategori}\/{urunAdi}\")\npublic String getUrunDetay(@PathVariable String kategori, @PathVariable String urunAdi) {\n    return \"Kategori: \" + kategori + \", \u00dcr\u00fcn: \" + urunAdi;\n}\n\n@GetMapping(\"\/dosyalar\/**\")\npublic String getDosyaYolu() {\n    return \"Dinamik dosya yolu iste\u011fi.\";\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>HTTP Metotlar\u0131na G\u00f6re E\u015fle\u015ftirme<\/h4>\n<p>Yukar\u0131da bahsedildi\u011fi gibi, <code>@GetMapping<\/code>, <code>@PostMapping<\/code> gibi \u00f6zel annotasyonlar, iste\u011fin HTTP metoduna g\u00f6re e\u015fle\u015ftirme yapmay\u0131 sa\u011flar. Bu, ayn\u0131 URL yolu i\u00e7in farkl\u0131 HTTP metotlar\u0131yla farkl\u0131 i\u015flemler tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<h4>T\u00fcketilen ve \u00dcretilen Medya Tipleri (<code>consumes<\/code>, <code>produces<\/code>)<\/h4>\n<p><code>@RequestMapping<\/code> annotasyonu, iste\u011fin <code>Content-Type<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 (<code>consumes<\/code>) ve Controller'\u0131n \u00fcretece\u011fi yan\u0131t\u0131n <code>Accept<\/code> ba\u015fl\u0131\u011f\u0131n\u0131 (<code>produces<\/code>) belirterek daha spesifik e\u015fle\u015ftirmeler yapabilir. Bu \u00f6zellikler, RESTful API'lerde farkl\u0131 veri formatlar\u0131n\u0131 (JSON, XML vb.) y\u00f6netmek i\u00e7in \u00e7ok \u00f6nemlidir.<\/p>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\n@PostMapping(path = \"\/json\", consumes = \"application\/json\", produces = \"application\/json\")\npublic Urun createUrunJson(@RequestBody Urun urun) {\n    \/\/ JSON olarak gelen \u00fcr\u00fcn\u00fc i\u015fler ve JSON olarak d\u00f6nd\u00fcr\u00fcr\n    return urun;\n}\n\n@PostMapping(path = \"\/xml\", consumes = \"application\/xml\", produces = \"application\/xml\")\npublic Urun createUrunXml(@RequestBody Urun urun) {\n    \/\/ XML olarak gelen \u00fcr\u00fcn\u00fc i\u015fler ve XML olarak d\u00f6nd\u00fcr\u00fcr\n    return urun;\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>\u0130stek Parametreleri ve Veri Ba\u011flama<\/h3>\n<p>Controller'lar, gelen isteklerden farkl\u0131 \u015fekillerde veri alabilir. Spring Boot, bu verileri Controller metotlar\u0131n\u0131n parametrelerine kolayca ba\u011flamak i\u00e7in \u00e7e\u015fitli annotasyonlar sunar.<\/p>\n<h4><code>@RequestParam<\/code> ile Sorgu Parametreleri<\/h4>\n<p><code>@RequestParam<\/code>, URL'deki sorgu parametrelerini (\u00f6rne\u011fin, <code>?ad=deger&id=123<\/code>) metot parametrelerine ba\u011flamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\n@GetMapping(\"\/arama\")\npublic String aramaYap(@RequestParam String anahtarKelime,\n                       @RequestParam(required = false, defaultValue = \"1\") int sayfa) {\n    return \"Aranan: \" + anahtarKelime + \", Sayfa: \" + sayfa;\n}\n<\/pre>\n<p><\/code><br \/>\n<code>required = false<\/code> ile parametrenin iste\u011fe ba\u011fl\u0131 oldu\u011funu, <code>defaultValue<\/code> ile de varsay\u0131lan de\u011ferini belirtebiliriz.<\/p>\n<h4><code>@PathVariable<\/code> ile Yol De\u011fi\u015fkenleri<\/h4>\n<p><code>@PathVariable<\/code>, URL yolundaki de\u011fi\u015fkenleri metot parametrelerine ba\u011flamak i\u00e7in kullan\u0131l\u0131r. Bu, RESTful API'lerde kaynak kimliklerini belirtmek i\u00e7in yayg\u0131n olarak kullan\u0131l\u0131r.<\/p>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\n@GetMapping(\"\/kullanicilar\/{id}\")\npublic String getKullanici(@PathVariable Long id) {\n    return \"Kullan\u0131c\u0131 ID: \" + id;\n}\n\n@GetMapping(\"\/urunler\/{kategori}\/{urunId}\")\npublic String getUrun(@PathVariable String kategori, @PathVariable Long urunId) {\n    return \"Kategori: \" + kategori + \", \u00dcr\u00fcn ID: \" + urunId;\n}\n<\/pre>\n<p><\/code><\/p>\n<h4><code>@RequestBody<\/code> ile \u0130stek G\u00f6vdesi<\/h4>\n<p><code>@RequestBody<\/code>, HTTP iste\u011finin g\u00f6vdesini (genellikle JSON veya XML format\u0131nda) bir Java nesnesine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullan\u0131l\u0131r. Bu, POST ve PUT isteklerinde veri g\u00f6ndermek i\u00e7in \u00e7ok yayg\u0131nd\u0131r.<\/p>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\npublic class Urun {\n    private String ad;\n    private double fiyat;\n    \/\/ getter\/setter\n}\n\n@PostMapping(\"\/urunler\")\npublic String addUrun(@RequestBody Urun urun) {\n    return \"\u00dcr\u00fcn eklendi: \" + urun.getAd() + \", Fiyat: \" + urun.getFiyat();\n}\n<\/pre>\n<p><\/code><br \/>\nSpring Boot, Jackson veya JAXB gibi k\u00fct\u00fcphaneleri kullanarak JSON\/XML'i otomatik olarak Java nesnesine d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<h4>Form Verilerini Ba\u011flama (<code>@ModelAttribute<\/code>)<\/h4>\n<p><code>@ModelAttribute<\/code>, HTML formlar\u0131ndan gelen verileri do\u011frudan bir Java nesnesine (POJO) ba\u011flamak i\u00e7in kullan\u0131l\u0131r. Bu, geleneksel web uygulamalar\u0131nda form g\u00f6nderimlerini i\u015flemek i\u00e7in idealdir.<\/p>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\npublic class KullaniciForm {\n    private String ad;\n    private String soyad;\n    \/\/ getter\/setter\n}\n\n@PostMapping(\"\/kayit\")\npublic String kayitOl(@ModelAttribute KullaniciForm form) {\n    return \"Kullan\u0131c\u0131 kaydedildi: \" + form.getAd() + \" \" + form.getSoyad();\n}\n<\/pre>\n<p><\/code><br \/>\n<code>@ModelAttribute<\/code> varsay\u0131lan olarak form verilerini ba\u011flar, bu nedenle genellikle a\u00e7\u0131k\u00e7a belirtilmesine gerek kalmaz. Metot parametresi olarak bir POJO kullanmak yeterlidir.<\/p>\n<h3>Yan\u0131t Olu\u015fturma ve G\u00f6r\u00fcn\u00fcm Katman\u0131 Entegrasyonu<\/h3>\n<p>Controller'lar, iste\u011fi i\u015fledikten sonra istemciye geri g\u00f6nderilecek yan\u0131t\u0131 olu\u015fturur. Bu yan\u0131t, bir HTML sayfas\u0131, JSON verisi, XML veya ba\u015fka bir format olabilir.<\/p>\n<h4>String ve POJO D\u00f6n\u00fc\u015f Tipleri<\/h4>\n<p><code>@Controller<\/code> ile bir String d\u00f6nd\u00fcrmek, genellikle bir g\u00f6r\u00fcn\u00fcm ad\u0131n\u0131 (\u00f6rne\u011fin, \"index\", \"hata\") belirtir ve Spring'in ViewResolver'\u0131 bu isme kar\u015f\u0131l\u0131k gelen \u015fablonu bulmaya \u00e7al\u0131\u015f\u0131r. <code>@RestController<\/code> ile String veya POJO d\u00f6nd\u00fcrmek ise, bu verinin do\u011frudan HTTP yan\u0131t g\u00f6vdesine yaz\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4><code>@ResponseBody<\/code> ve JSON\/XML D\u00f6n\u00fc\u015f\u00fcm\u00fc<\/h4>\n<p><code>@ResponseBody<\/code> annotasyonu, bir metodun d\u00f6n\u00fc\u015f de\u011ferinin do\u011frudan HTTP yan\u0131t g\u00f6vdesine yaz\u0131lmas\u0131n\u0131 sa\u011flar. Bu annotasyon, <code>@RestController<\/code> taraf\u0131ndan otomatik olarak dahil edildi\u011fi i\u00e7in <code>@RestController<\/code> kullan\u0131rken manuel olarak eklemeye gerek yoktur. Spring, mesaj d\u00f6n\u00fc\u015ft\u00fcr\u00fcc\u00fcleri (Message Converters) kullanarak Java nesnelerini JSON (Jackson ile) veya XML (JAXB ile) gibi formatlara d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\n@Controller \/\/ @RestController olsayd\u0131 @ResponseBody'ye gerek kalmazd\u0131\npublic class DataController {\n\n    @GetMapping(\"\/data\")\n    @ResponseBody \/\/ Bu metodun d\u00f6n\u00fc\u015f de\u011ferini do\u011frudan HTTP yan\u0131t g\u00f6vdesine yaz\n    public Map<String, String> getData() {\n        Map<String, String> data = new HashMap<>();\n        data.put(\"mesaj\", \"Merhaba API!\");\n        data.put(\"version\", \"1.0\");\n        return data; \/\/ JSON olarak d\u00f6ner\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4><code>ResponseEntity<\/code> ile Detayl\u0131 Yan\u0131t Kontrol\u00fc<\/h4>\n<p><code>ResponseEntity<\/code>, Spring'in bir HTTP yan\u0131t\u0131n\u0131 (ba\u015fl\u0131klar, durum kodu ve g\u00f6vde dahil) tamamen kontrol etmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir s\u0131n\u0131ft\u0131r. \u00d6zellikle RESTful API'lerde esnek yan\u0131tlar olu\u015fturmak i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\n@GetMapping(\"\/durum\")\npublic ResponseEntity<String> getDurum() {\n    \/\/ HTTP 200 OK ve \u00f6zel bir ba\u015fl\u0131k ile yan\u0131t d\u00f6nd\u00fcr\n    return ResponseEntity.ok()\n                         .header(\"X-Custom-Header\", \"De\u011fer\")\n                         .body(\"Her \u015fey yolunda!\");\n}\n\n@PostMapping(\"\/kaydet\")\npublic ResponseEntity<Urun> kaydetUrun(@RequestBody Urun urun) {\n    if (urun.getAd() == null || urun.getAd().isEmpty()) {\n        return new ResponseEntity<>(HttpStatus.BAD_REQUEST); \/\/ 400 Bad Request\n    }\n    \/\/ \u00dcr\u00fcn\u00fc kaydetme mant\u0131\u011f\u0131...\n    return new ResponseEntity<>(urun, HttpStatus.CREATED); \/\/ 201 Created\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>G\u00f6r\u00fcn\u00fcm \u00c7\u00f6z\u00fcmleyiciler (View Resolvers) ve Thymeleaf\/JSP<\/h4>\n<p><code>@Controller<\/code> kullan\u0131ld\u0131\u011f\u0131nda, metotlar genellikle bir String d\u00f6nd\u00fcrerek bir g\u00f6r\u00fcn\u00fcm ad\u0131 belirtir. Spring, bu g\u00f6r\u00fcn\u00fcm ad\u0131n\u0131 ger\u00e7ek bir View bile\u015fenine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in ViewResolver'lar\u0131 kullan\u0131r. Spring Boot, Thymeleaf, FreeMarker gibi \u015fablon motorlar\u0131n\u0131 veya JSP'yi destekler.<\/p>\n<p><b>\u00d6rnek (Thymeleaf ile):<\/b><br \/>\n<code>application.properties<\/code> dosyas\u0131nda:<br \/>\n<code>spring.thymeleaf.prefix=classpath:\/templates\/<\/code><br \/>\n<code>spring.thymeleaf.suffix=.html<\/code><\/p>\n<p>Controller:<\/p>\n<pre><code>\n@Controller\npublic class HomeController {\n\n    @GetMapping(\"\/\")\n    public String home(Model model) {\n        model.addAttribute(\"baslik\", \"Anasayfa\");\n        return \"index\"; \/\/ src\/main\/resources\/templates\/index.html dosyas\u0131n\u0131 arar\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Geli\u015fmi\u015f Controller Konseptleri ve En \u0130yi Uygulamalar<\/h3>\n<p>Spring Boot Controller'lar\u0131 sadece temel istek i\u015fleme ile s\u0131n\u0131rl\u0131 de\u011fildir. Uygulaman\u0131z\u0131n daha sa\u011flam, g\u00fcvenli ve y\u00f6netilebilir olmas\u0131 i\u00e7in \u00e7e\u015fitli geli\u015fmi\u015f konseptler ve en iyi uygulamalar mevcuttur.<\/p>\n<h4>\u0130stisna Y\u00f6netimi (<code>@ExceptionHandler<\/code>, <code>@ControllerAdvice<\/code>)<\/h4>\n<p>Uygulamalarda hatalar ka\u00e7\u0131n\u0131lmazd\u0131r. Spring Boot, Controller'larda istisna y\u00f6netimini merkezi ve temiz bir \u015fekilde yapman\u0131z\u0131 sa\u011flar.<\/p>\n<ul>\n<li><code>@ExceptionHandler<\/code>: Bir Controller i\u00e7indeki belirli bir metodun belirli bir istisna t\u00fcr\u00fcn\u00fc yakalamas\u0131n\u0131 sa\u011flar.<\/li>\n<li><code>@ControllerAdvice<\/code>: T\u00fcm Controller'larda veya belirli Controller gruplar\u0131nda istisna y\u00f6netimini merkezi hale getirmek i\u00e7in kullan\u0131l\u0131r. Bu, uygulaman\u0131z genelinde tutarl\u0131 hata yan\u0131tlar\u0131 sa\u011flaman\u0131n en iyi yoludur.<\/li>\n<\/ul>\n<p><b>\u00d6rnek <code>@ControllerAdvice<\/code>:<\/b><\/p>\n<pre><code>\n@ControllerAdvice\npublic class GlobalExceptionHandler {\n\n    @ExceptionHandler(ResourceNotFoundException.class)\n    @ResponseStatus(HttpStatus.NOT_FOUND)\n    @ResponseBody\n    public ErrorResponse handleResourceNotFound(ResourceNotFoundException ex) {\n        return new ErrorResponse(\"Kaynak bulunamad\u0131: \" + ex.getMessage());\n    }\n\n    @ExceptionHandler(MethodArgumentNotValidException.class)\n    @ResponseStatus(HttpStatus.BAD_REQUEST)\n    @ResponseBody\n    public ErrorResponse handleValidationExceptions(MethodArgumentNotValidException ex) {\n        \/\/ Do\u011frulama hatalar\u0131n\u0131 i\u015fleme\n        return new ErrorResponse(\"Do\u011frulama hatas\u0131: \" + ex.getMessage());\n    }\n}\n\n\/\/ \u00d6rnek \u00f6zel istisna\nclass ResourceNotFoundException extends RuntimeException {\n    public ResourceNotFoundException(String message) {\n        super(message);\n    }\n}\n\n\/\/ \u00d6rnek hata yan\u0131t\u0131 s\u0131n\u0131f\u0131\nclass ErrorResponse {\n    private String mesaj;\n    public ErrorResponse(String mesaj) { this.mesaj = mesaj; }\n    public String getMesaj() { return mesaj; }\n    public void setMesaj(String mesaj) { this.mesaj = mesaj; }\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Veri Do\u011frulama (Validation)<\/h4>\n<p>Gelen istek verilerinin ge\u00e7erlili\u011fini kontrol etmek, uygulaman\u0131n g\u00fcvenli\u011fi ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in kritik \u00f6neme sahiptir. Spring Boot, Bean Validation API (JSR 380) ile entegrasyonu sayesinde kolayca do\u011frulama yapman\u0131z\u0131 sa\u011flar.<\/p>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\nimport javax.validation.Valid;\nimport javax.validation.constraints.Min;\nimport javax.validation.constraints.NotBlank;\nimport javax.validation.constraints.Size;\n\npublic class UrunDTO {\n    @NotBlank(message = \"\u00dcr\u00fcn ad\u0131 bo\u015f olamaz\")\n    @Size(min = 3, max = 50, message = \"\u00dcr\u00fcn ad\u0131 3 ile 50 karakter aras\u0131nda olmal\u0131\")\n    private String ad;\n\n    @Min(value = 0, message = \"Fiyat negatif olamaz\")\n    private double fiyat;\n    \/\/ getter\/setter\n}\n\n@PostMapping(\"\/urunler\")\npublic ResponseEntity<String> createUrun(@Valid @RequestBody UrunDTO urunDto) {\n    \/\/ Do\u011frulama ba\u015far\u0131l\u0131ysa buraya gelir\n    return ResponseEntity.ok(\"\u00dcr\u00fcn ba\u015far\u0131yla olu\u015fturuldu.\");\n}\n<\/pre>\n<p><\/code><br \/>\n<code>@Valid<\/code> annotasyonu, Spring'e <code>UrunDTO<\/code> nesnesini do\u011frulamas\u0131 gerekti\u011fini bildirir. Do\u011frulama ba\u015far\u0131s\u0131z olursa, <code>MethodArgumentNotValidException<\/code> f\u0131rlat\u0131l\u0131r ve bu istisna <code>@ControllerAdvice<\/code> ile merkezi olarak yakalanabilir.<\/p>\n<h4>Interceptor'lar ile \u0130stek \u00d6ncesi\/Sonras\u0131 \u0130\u015flemler<\/h4>\n<p>Interceptor'lar, Controller metodlar\u0131 \u00e7a\u011fr\u0131lmadan \u00f6nce veya sonra belirli i\u015flemleri (\u00f6rne\u011fin, loglama, yetkilendirme kontrol\u00fc, performans \u00f6l\u00e7\u00fcm\u00fc) ger\u00e7ekle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. <code>HandlerInterceptor<\/code> aray\u00fcz\u00fcn\u00fc uygulayarak kendi interceptor'lar\u0131n\u0131z\u0131 yazabilirsiniz.<\/p>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\nimport org.springframework.web.servlet.HandlerInterceptor;\nimport org.springframework.web.servlet.ModelAndView;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\npublic class LogInterceptor implements HandlerInterceptor {\n\n    @Override\n    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {\n        System.out.println(\"\u0130stek geldi: \" + request.getRequestURI());\n        return true; \/\/ true d\u00f6nerse istek i\u015flenmeye devam eder\n    }\n\n    @Override\n    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {\n        System.out.println(\"\u0130stek i\u015flendi: \" + request.getRequestURI());\n    }\n\n    @Override\n    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {\n        System.out.println(\"\u0130stek tamamland\u0131: \" + request.getRequestURI());\n    }\n}\n<\/pre>\n<p><\/code><br \/>\nBu interceptor'\u0131 bir <code>WebMvcConfigurer<\/code> s\u0131n\u0131f\u0131nda kaydetmeniz gerekir.<\/p>\n<h4>G\u00fcvenlik Entegrasyonu (Spring Security)<\/h4>\n<p>Spring Security, Controller seviyesinde yetkilendirme ve kimlik do\u011frulama sa\u011flamak i\u00e7in g\u00fc\u00e7l\u00fc bir \u00e7er\u00e7evedir. <code>@PreAuthorize<\/code>, <code>@PostAuthorize<\/code> gibi annotasyonlar veya metot seviyesi g\u00fcvenlik yap\u0131land\u0131rmalar\u0131 ile Controller metotlar\u0131na eri\u015fimi k\u0131s\u0131tlayabilirsiniz.<\/p>\n<p><b>\u00d6rnek:<\/b><\/p>\n<pre><code>\nimport org.springframework.security.access.prepost.PreAuthorize;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class AdminController {\n\n    @GetMapping(\"\/admin\/dashboard\")\n    @PreAuthorize(\"hasRole('ADMIN')\") \/\/ Sadece ADMIN rol\u00fcne sahip kullan\u0131c\u0131lar eri\u015febilir\n    public String getAdminDashboard() {\n        return \"Admin Paneli\";\n    }\n\n    @GetMapping(\"\/user\/profile\")\n    @PreAuthorize(\"isAuthenticated()\") \/\/ Sadece kimli\u011fi do\u011frulanm\u0131\u015f kullan\u0131c\u0131lar eri\u015febilir\n    public String getUserProfile() {\n        return \"Kullan\u0131c\u0131 Profili\";\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Spring Boot projelerinde Controller'lar, uygulaman\u0131n d\u0131\u015f d\u00fcnyaya a\u00e7\u0131lan kap\u0131s\u0131d\u0131r ve web katman\u0131n\u0131n temelini olu\u015fturur. <code>@Controller<\/code> ve <code>@RestController<\/code> gibi temel annotasyonlardan ba\u015flayarak, <code>@RequestMapping<\/code> ve t\u00fcrevleriyle istekleri y\u00f6netme, <code>@RequestParam<\/code>, <code>@PathVariable<\/code>, <code>@RequestBody<\/code> ile veri ba\u011flama ve <code>ResponseEntity<\/code> ile esnek yan\u0131tlar olu\u015fturma gibi bir\u00e7ok konsepti inceledik. Ayr\u0131ca, merkezi istisna y\u00f6netimi, veri do\u011frulama, interceptor'lar ve Spring Security entegrasyonu gibi geli\u015fmi\u015f konulara da de\u011findik. Bu bilgiler \u0131\u015f\u0131\u011f\u0131nda, Spring Boot uygulamalar\u0131n\u0131zda sa\u011flam, g\u00fcvenli ve bak\u0131m\u0131 kolay Controller'lar geli\u015ftirebilirsiniz. Unutmay\u0131n ki temiz kod, do\u011fru ayr\u0131m ve en iyi uygulamalar\u0131 takip etmek, ba\u015far\u0131l\u0131 bir Spring Boot projesinin anahtar\u0131d\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<h4><code>@Controller<\/code> ile <code>@RestController<\/code> aras\u0131ndaki temel fark nedir?<\/h4>\n<p><code>@Controller<\/code> genellikle geleneksel MVC uygulamalar\u0131nda, yani HTML gibi g\u00f6r\u00fcn\u00fcm \u015fablonlar\u0131 d\u00f6nd\u00fcrmek i\u00e7in kullan\u0131l\u0131r. Metotlar\u0131n <code>@ResponseBody<\/code> ile i\u015faretlenmesi gerekir. <code>@RestController<\/code> ise RESTful API'ler i\u00e7in tasarlanm\u0131\u015ft\u0131r ve varsay\u0131lan olarak t\u00fcm metotlar\u0131n d\u00f6n\u00fc\u015f de\u011ferlerini do\u011frudan HTTP yan\u0131t g\u00f6vdesine (genellikle JSON veya XML olarak) yazar. <code>@ResponseBody<\/code> annotasyonunu otomatik olarak i\u00e7erir.<\/p>\n<h4>Bir Controller metodunda birden fazla <code>@RequestMapping<\/code> kullanabilir miyim?<\/h4>\n<p>Hay\u0131r, bir metot \u00fczerinde do\u011frudan birden fazla <code>@RequestMapping<\/code> annotasyonu kullanamazs\u0131n\u0131z. Ancak, ayn\u0131 i\u015flevi g\u00f6ren birden fazla URL yolunu tek bir <code>@RequestMapping<\/code> annotasyonu i\u00e7inde bir dizi olarak belirtebilirsiniz. \u00d6rne\u011fin: <code>@GetMapping({\"\/path1\", \"\/path2\"})<\/code>.<\/p>\n<h4>Spring Boot'ta form verilerini en iyi nas\u0131l ba\u011flar\u0131m?<\/h4>\n<p>HTML formlar\u0131ndan gelen verileri ba\u011flamak i\u00e7in en iyi yol, <code>@ModelAttribute<\/code> annotasyonunu veya sadece metot parametresi olarak bir POJO (Plain Old Java Object) kullanmakt\u0131r. Spring, form alan adlar\u0131n\u0131 POJO'nun \u00f6zellik adlar\u0131yla e\u015fle\u015ftirerek otomatik olarak veri ba\u011flamay\u0131 yapar.<\/p>\n<h4>Hata y\u00f6netimini Controller'da nas\u0131l merkezi hale getirebilirim?<\/h4>\n<p>Hata y\u00f6netimini merkezi hale getirmek i\u00e7in <code>@ControllerAdvice<\/code> annotasyonunu kullanmal\u0131s\u0131n\u0131z. Bu annotasyonla i\u015faretlenmi\u015f bir s\u0131n\u0131f, uygulaman\u0131zdaki t\u00fcm Controller'lar i\u00e7in global istisna i\u015fleyicileri (<code>@ExceptionHandler<\/code>) tan\u0131mlaman\u0131za olanak tan\u0131r. Bu sayede, hata yan\u0131tlar\u0131n\u0131z tutarl\u0131 olur ve her Controller'da ayr\u0131 ayr\u0131 hata y\u00f6netimi yazmaktan kurtulursunuz.<\/p>\n<h4><code>ResponseEntity<\/code> kullanmak neden \u00f6nemlidir?<\/h4>\n<p><code>ResponseEntity<\/code> kullanmak, HTTP yan\u0131t\u0131n\u0131n t\u00fcm y\u00f6nlerini (durum kodu, ba\u015fl\u0131klar ve g\u00f6vde) tamamen kontrol etmenizi sa\u011flar. \u00d6zellikle RESTful API'lerde, iste\u011fin ba\u015far\u0131l\u0131 olup olmad\u0131\u011f\u0131n\u0131 (200 OK, 201 Created), bir hatan\u0131n olu\u015ftu\u011funu (400 Bad Request, 404 Not Found, 500 Internal Server Error) veya \u00f6zel ba\u015fl\u0131klar eklemek istedi\u011finizde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. Bu, istemciye daha anlaml\u0131 ve detayl\u0131 yan\u0131tlar g\u00f6ndermenizi sa\u011flar.<\/p>\n","protected":false},"excerpt":{"rendered":"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f\nSpring Boot, modern Java tabanl\u0131 web uygulamalar\u0131 geli\u015ftirmek i\u00e7in tercih edilen bi&#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-38545","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f\" \/>\n<meta property=\"og:description\" content=\"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f Spring Boot, modern Java tabanl\u0131 web uygulamalar\u0131 geli\u015ftirmek i\u00e7in tercih edilen bi...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-02T13:00:41+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f\",\"datePublished\":\"2026-02-02T13:00:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/\"},\"wordCount\":2284,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/\",\"name\":\"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-02T13:00:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/","og_locale":"tr_TR","og_type":"article","og_title":"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f","og_description":"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f Spring Boot, modern Java tabanl\u0131 web uygulamalar\u0131 geli\u015ftirmek i\u00e7in tercih edilen bi...","og_url":"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-02T13:00:41+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f","datePublished":"2026-02-02T13:00:41+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/"},"wordCount":2284,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/","url":"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/","name":"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-02T13:00:41+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-projelerinde-controller-kavramina-kapsamli-bir-bakis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Spring Boot Projelerinde Controller Kavram\u0131na Kapsaml\u0131 Bir Bak\u0131\u015f"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38545","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=38545"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38545\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38545"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38545"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38545"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}