{"id":36273,"date":"2025-12-12T04:40:55","date_gmt":"2025-12-12T01:40:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36273"},"modified":"2025-12-12T04:40:55","modified_gmt":"2025-12-12T01:40:55","slug":"spring-boot-mulakat-sorulari-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/","title":{"rendered":"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Spring Boot, modern Java geli\u015ftirme d\u00fcnyas\u0131nda vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir. H\u0131zl\u0131 uygulama geli\u015ftirme, kolay konfig\u00fcrasyon ve \u00fcretim ortam\u0131na haz\u0131r \u00e7\u00f6z\u00fcmler sunmas\u0131yla \u00f6ne \u00e7\u0131kar. Bu nedenle, Spring Boot bilgisi, Java geli\u015ftiricisi m\u00fclakatlar\u0131nda en \u00e7ok aranan yetkinliklerden biridir. Bu makale, Spring Boot m\u00fclakatlar\u0131nda kar\u015f\u0131la\u015fabilece\u011finiz temelden ileri seviyeye kadar \u00e7e\u015fitli sorular\u0131 ve kapsaml\u0131 yan\u0131tlar\u0131n\u0131 ele almaktad\u0131r. Amac\u0131m\u0131z, hem teorik bilginizi peki\u015ftirmek hem de pratik uygulamalarla ilgili i\u00e7g\u00f6r\u00fc kazanman\u0131z\u0131 sa\u011flamakt\u0131r.<\/p>\n<h3>Spring Boot Temelleri<\/h3>\n<p>Spring Boot&#8217;un ne oldu\u011funu ve neden bu kadar pop\u00fcler oldu\u011funu anlamak, m\u00fclakatlar\u0131n ilk ad\u0131m\u0131d\u0131r.<\/p>\n<h4>Spring Boot Nedir ve Temel Avantajlar\u0131 Nelerdir?<\/h4>\n<p>Spring Boot, Spring ekosisteminin bir par\u00e7as\u0131 olarak, \u00fcretim seviyesinde, ba\u011f\u0131ms\u0131z ve kolayca \u00e7al\u0131\u015ft\u0131r\u0131labilir Spring uygulamalar\u0131 olu\u015fturmay\u0131 basitle\u015ftiren bir projedir. Spring tabanl\u0131 uygulamalar\u0131 yap\u0131land\u0131rma ve da\u011f\u0131tma s\u00fcrecini h\u0131zland\u0131rmak i\u00e7in tasarlanm\u0131\u015ft\u0131r.<\/p>\n<p><strong>Temel Avantajlar\u0131:<\/strong><\/p>\n<p>*   <strong>Otomatik Konfig\u00fcrasyon (Auto-configuration):<\/strong> Spring Boot, classpath&#8217;inizdeki jar dosyalar\u0131na ve tan\u0131mlad\u0131\u011f\u0131n\u0131z bean&#8217;lere g\u00f6re uygulaman\u0131z\u0131 otomatik olarak yap\u0131land\u0131r\u0131r. Bu, manuel konfig\u00fcrasyon ihtiyac\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r. \u00d6rne\u011fin, bir veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fc ekledi\u011finizde, Spring Boot otomatik olarak bir <code>DataSource<\/code> bean&#8217;i yap\u0131land\u0131rmaya \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <strong>Starter Ba\u011f\u0131ml\u0131l\u0131klar\u0131 (Starter Dependencies):<\/strong> Yayg\u0131n kullan\u0131lan fonksiyonellikler (web, JPA, g\u00fcvenlik vb.) i\u00e7in \u00f6nceden tan\u0131mlanm\u0131\u015f ba\u011f\u0131ml\u0131l\u0131k setleri sunar. Bu &#8220;starter&#8221;lar, ilgili t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 tek bir pakette toplayarak <code>pom.xml<\/code> veya <code>build.gradle<\/code> dosyas\u0131n\u0131 sadele\u015ftirir. \u00d6rne\u011fin, <code>spring-boot-starter-web<\/code> ekledi\u011finizde, Tomcat, Spring MVC ve JSON i\u015fleme i\u00e7in gerekli t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar otomatik olarak gelir.<br \/>\n*   <strong>G\u00f6m\u00fcl\u00fc Sunucular (Embedded Servers):<\/strong> Tomcat, Jetty veya Undertow gibi sunucular\u0131 do\u011frudan uygulaman\u0131n i\u00e7ine g\u00f6merek, <code>.war<\/code> dosyalar\u0131 olu\u015fturma ve harici bir uygulama sunucusuna da\u011f\u0131tma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r. Bu, uygulamalar\u0131n tek bir <code>java -jar<\/code> komutuyla \u00e7al\u0131\u015ft\u0131r\u0131labilmesini sa\u011flar.<br \/>\n*   <strong>\u00dcretim Ortam\u0131na Haz\u0131r \u00d6zellikler (Production-ready Features):<\/strong> Sa\u011fl\u0131k kontrolleri (health checks), metrikler, harici konfig\u00fcrasyon ve g\u00fcvenlik gibi \u00fcretim ortam\u0131 i\u00e7in kritik \u00f6zellikleri kolayca entegre etme imkan\u0131 sunar (Spring Boot Actuator arac\u0131l\u0131\u011f\u0131yla).<br \/>\n*   <strong>Daha Az XML Konfig\u00fcrasyonu:<\/strong> Geleneksel Spring uygulamalar\u0131n\u0131n aksine, Spring Boot \u00e7ok az veya hi\u00e7 XML konfig\u00fcrasyonu gerektirmez. \u00c7o\u011funlukla Java tabanl\u0131 konfig\u00fcrasyon ve anotasyonlar kullan\u0131l\u0131r.<br \/>\n*   <strong>CLI (Command Line Interface):<\/strong> Spring Boot CLI, Groovy ile Spring Boot uygulamalar\u0131n\u0131 h\u0131zl\u0131ca prototiplemek i\u00e7in komut sat\u0131r\u0131 ara\u00e7lar\u0131 sa\u011flar.<\/p>\n<h4><code>@SpringBootApplication<\/code> Anotasyonu Ne \u0130\u015fe Yarar?<\/h4>\n<p><code>@SpringBootApplication<\/code> anotasyonu, bir Spring Boot uygulamas\u0131n\u0131n ana s\u0131n\u0131f\u0131 \u00fczerinde kullan\u0131lan bir kolayl\u0131k anotasyonudur. Asl\u0131nda \u00fc\u00e7 temel anotasyonun birle\u015fimidir:<\/p>\n<p>*   <strong><code>@Configuration<\/code>:<\/strong> Bu s\u0131n\u0131f\u0131n, Spring IoC konteyneri i\u00e7in bean tan\u0131mlamalar\u0131 sa\u011flayabilece\u011fini belirtir.<br \/>\n*   <strong><code>@EnableAutoConfiguration<\/code>:<\/strong> Spring Boot&#8217;un otomatik konfig\u00fcrasyon mekanizmas\u0131n\u0131 tetikler. Classpath&#8217;teki jar dosyalar\u0131na ve tan\u0131mlanm\u0131\u015f bean&#8217;lere g\u00f6re uygulaman\u0131n otomatik olarak yap\u0131land\u0131r\u0131lmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong><code>@ComponentScan<\/code>:<\/strong> Spring bile\u015fenlerini (\u00f6rne\u011fin <code>@Component<\/code>, <code>@Service<\/code>, <code>@Repository<\/code>, <code>@Controller<\/code> ile i\u015faretlenmi\u015f s\u0131n\u0131flar) otomatik olarak tarar ve Spring konteynerine bean olarak kaydeder. Varsay\u0131lan olarak, anotasyonun bulundu\u011fu paketten ve alt paketlerinden tarama yapar.<\/p>\n<p>Bu anotasyon sayesinde, tek bir anotasyonla bir Spring Boot uygulamas\u0131n\u0131 ba\u015flatmak i\u00e7in gerekli t\u00fcm temel konfig\u00fcrasyonlar\u0131 sa\u011flam\u0131\u015f olursunuz.<\/p>\n<h4>Spring Boot Auto-configuration (Otomatik Konfig\u00fcrasyon) Mekanizmas\u0131n\u0131 A\u00e7\u0131klay\u0131n.<\/h4>\n<p>Spring Boot&#8217;un en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri olan otomatik konfig\u00fcrasyon, geli\u015ftiricilerin manuel konfig\u00fcrasyon y\u00fck\u00fcn\u00fc azaltarak daha h\u0131zl\u0131 uygulama geli\u015ftirmesine olanak tan\u0131r. \u00c7al\u0131\u015fma prensibi \u015f\u00f6yledir:<\/p>\n<p>1.  <strong>Classpath Tarama:<\/strong> Spring Boot, uygulaman\u0131n classpath&#8217;inde bulunan jar dosyalar\u0131n\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 tarar.<br \/>\n2.  <strong>Ko\u015fullu Bean Olu\u015fturma:<\/strong> <code>@Conditional<\/code> anotasyonlar\u0131 (\u00f6rne\u011fin <code>@ConditionalOnClass<\/code>, <code>@ConditionalOnMissingBean<\/code>, <code>@ConditionalOnProperty<\/code>) kullan\u0131larak, belirli ko\u015fullar alt\u0131nda bean&#8217;lerin olu\u015fturulup olu\u015fturulmayaca\u011f\u0131na karar verilir. \u00d6rne\u011fin, <code>spring-data-jpa<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 classpath&#8217;te mevcutsa ve hen\u00fcz bir <code>DataSource<\/code> bean&#8217;i tan\u0131mlanmam\u0131\u015fsa, Spring Boot varsay\u0131lan bir <code>DataSource<\/code> bean&#8217;i otomatik olarak yap\u0131land\u0131r\u0131r.<br \/>\n3.  <strong><code>spring.factories<\/code> Dosyas\u0131:<\/strong> Otomatik konfig\u00fcrasyon s\u0131n\u0131flar\u0131, <code>META-INF\/spring.factories<\/code> dosyas\u0131nda listelenir. Spring Boot, bu dosyalar\u0131 okuyarak hangi otomatik konfig\u00fcrasyonlar\u0131n etkinle\u015ftirilebilece\u011fini belirler.<br \/>\n4.  <strong>S\u0131ralama:<\/strong> Otomatik konfig\u00fcrasyonlar, <code>@AutoConfigureBefore<\/code>, <code>@AutoConfigureAfter<\/code> gibi anotasyonlarla belirli bir s\u0131raya g\u00f6re uygulan\u0131r.<\/p>\n<p>Bu mekanizma sayesinde, geli\u015ftiriciler sadece ihtiya\u00e7 duyduklar\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekler ve Spring Boot gerisini halleder. \u0130stenirse, <code>application.properties<\/code> veya <code>application.yml<\/code> dosyalar\u0131nda veya \u00f6zel <code>@Configuration<\/code> s\u0131n\u0131flar\u0131yla otomatik konfig\u00fcrasyonlar ge\u00e7ersiz k\u0131l\u0131nabilir veya devre d\u0131\u015f\u0131 b\u0131rak\u0131labilir.<\/p>\n<h4>Starter Ba\u011f\u0131ml\u0131l\u0131klar\u0131 (Starter Dependencies) Nelerdir ve Neden Kullan\u0131l\u0131rlar?<\/h4>\n<p>Starter ba\u011f\u0131ml\u0131l\u0131klar\u0131, Spring Boot&#8217;un &#8220;starter&#8221; mod\u00fclleri olarak bilinir. Bunlar, belirli bir i\u015flevsellik (\u00f6rne\u011fin web uygulamalar\u0131, JPA, g\u00fcvenlik, test) i\u00e7in gerekli olan t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 i\u00e7eren \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f Maven veya Gradle ba\u011f\u0131ml\u0131l\u0131klar\u0131d\u0131r.<\/p>\n<p><strong>\u00d6rnekler:<\/strong><\/p>\n<p>*   <code>spring-boot-starter-web<\/code>: RESTful uygulamalar i\u00e7in Spring MVC, Tomcat ve Jackson (JSON i\u015fleme) i\u00e7erir.<br \/>\n*   <code>spring-boot-starter-data-jpa<\/code>: JPA tabanl\u0131 veritaban\u0131 eri\u015fimi i\u00e7in Spring Data JPA, Hibernate ve JDBC i\u00e7erir.<br \/>\n*   <code>spring-boot-starter-test<\/code>: Test yazmak i\u00e7in JUnit, Mockito, Spring Test ve Hamcrest gibi k\u00fct\u00fcphaneleri i\u00e7erir.<br \/>\n*   <code>spring-boot-starter-security<\/code>: Spring Security entegrasyonu sa\u011flar.<\/p>\n<p><strong>Kullan\u0131m Nedenleri:<\/strong><\/p>\n<p>*   <strong>Basitlik:<\/strong> Geli\u015ftiricilerin, bir \u00f6zellik i\u00e7in gereken her ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 manuel olarak eklemesi ve versiyon \u00e7ak\u0131\u015fmalar\u0131yla u\u011fra\u015fmas\u0131 yerine, tek bir &#8220;starter&#8221; ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 eklemesi yeterlidir.<br \/>\n*   <strong>Tutarl\u0131l\u0131k:<\/strong> Starter&#8217;lar, uyumlu ba\u011f\u0131ml\u0131l\u0131k versiyonlar\u0131n\u0131 otomatik olarak getirir, b\u00f6ylece ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131 riski azal\u0131r.<br \/>\n*   <strong>H\u0131z:<\/strong> Uygulama geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r, \u00e7\u00fcnk\u00fc temel konfig\u00fcrasyon ve ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi basitle\u015fir.<br \/>\n*   <strong>Best Practices:<\/strong> Spring Boot ekibi taraf\u0131ndan belirlenen en iyi uygulamalar\u0131 ve yayg\u0131n kullan\u0131m senaryolar\u0131n\u0131 yans\u0131tan ba\u011f\u0131ml\u0131l\u0131k setleri sunar.<\/p>\n<h4>Spring Boot&#8217;ta G\u00f6m\u00fcl\u00fc Sunucular (Embedded Servers) Ne Anlama Gelir?<\/h4>\n<p>G\u00f6m\u00fcl\u00fc sunucular, Spring Boot uygulamalar\u0131n\u0131n kendi web sunucular\u0131n\u0131 (\u00f6rne\u011fin Tomcat, Jetty veya Undertow) do\u011frudan uygulama i\u00e7inde bar\u0131nd\u0131rmas\u0131 anlam\u0131na gelir. Geleneksel Java web uygulamalar\u0131nda, <code>.war<\/code> dosyas\u0131 harici bir uygulama sunucusuna (Apache Tomcat, JBoss, WebLogic gibi) da\u011f\u0131t\u0131l\u0131r. Spring Boot ile bu durum de\u011fi\u015fir:<\/p>\n<p>*   <strong>Tek Y\u00fcr\u00fct\u00fclebilir Jar:<\/strong> Uygulama, <code>java -jar your-app.jar<\/code> komutuyla do\u011frudan \u00e7al\u0131\u015ft\u0131r\u0131labilen tek bir <code>.jar<\/code> dosyas\u0131 olarak paketlenir. Bu <code>.jar<\/code> dosyas\u0131, hem uygulaman\u0131n kodunu hem de g\u00f6m\u00fcl\u00fc web sunucusunu i\u00e7erir.<br \/>\n*   <strong>Ba\u011f\u0131ms\u0131z Uygulamalar:<\/strong> Uygulamalar, harici bir sunucuya ihtiya\u00e7 duymadan tamamen ba\u011f\u0131ms\u0131zd\u0131r. Bu, da\u011f\u0131t\u0131m\u0131 ve operasyonu b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir.<br \/>\n*   <strong>H\u0131zl\u0131 Ba\u015flang\u0131\u00e7:<\/strong> G\u00f6m\u00fcl\u00fc sunucular, uygulaman\u0131n \u00e7ok daha h\u0131zl\u0131 ba\u015flamas\u0131n\u0131 sa\u011flar, \u00e7\u00fcnk\u00fc harici bir sunucunun ba\u015flat\u0131lmas\u0131 ve uygulaman\u0131n ona da\u011f\u0131t\u0131lmas\u0131 gibi ek ad\u0131mlar yoktur.<br \/>\n*   <strong>Mikroservisler \u0130\u00e7in \u0130deal:<\/strong> Mikroservis mimarilerinde, her servisin kendi ba\u011f\u0131ms\u0131z ya\u015fam d\u00f6ng\u00fcs\u00fcne sahip olmas\u0131 ve kolayca da\u011f\u0131t\u0131labilir olmas\u0131 gerekti\u011fi i\u00e7in g\u00f6m\u00fcl\u00fc sunucular b\u00fcy\u00fck bir avantaj sa\u011flar.<\/p>\n<p>Varsay\u0131lan olarak <code>spring-boot-starter-web<\/code>, Apache Tomcat&#8217;i g\u00f6m\u00fcl\u00fc sunucu olarak getirir. \u0130stenirse, Maven veya Gradle ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 d\u0131\u015flayarak veya ekleyerek ba\u015fka sunucular kullan\u0131labilir (\u00f6rne\u011fin Jetty veya Undertow).<\/p>\n<h4>Spring Boot Actuator Nedir ve Ne Ama\u00e7la Kullan\u0131l\u0131r?<\/h4>\n<p>Spring Boot Actuator, Spring Boot uygulamalar\u0131na \u00fcretim ortam\u0131nda uygulamay\u0131 izleme ve y\u00f6netme yetenekleri ekleyen bir mod\u00fcld\u00fcr. Uygulaman\u0131n durumunu, performans\u0131n\u0131 ve sa\u011fl\u0131\u011f\u0131n\u0131 anlamak i\u00e7in \u00e7e\u015fitli &#8220;endpoint&#8221;ler (u\u00e7 noktalar) sa\u011flar.<\/p>\n<p><strong>Ba\u015fl\u0131ca Endpoint&#8217;ler:<\/strong><\/p>\n<p>*   <strong><code>\/health<\/code>:<\/strong> Uygulaman\u0131n sa\u011fl\u0131k durumunu g\u00f6sterir (UP\/DOWN). Veritaban\u0131 ba\u011flant\u0131s\u0131, disk alan\u0131 gibi kritik bile\u015fenlerin durumunu kontrol eder.<br \/>\n*   <strong><code>\/info<\/code>:<\/strong> Uygulama hakk\u0131nda genel bilgiler (versiyon, a\u00e7\u0131klama vb.) sa\u011flar. Bu bilgiler <code>application.properties<\/code> veya <code>application.yml<\/code>&#8216;den al\u0131nabilir.<br \/>\n*   <strong><code>\/metrics<\/code>:<\/strong> Uygulaman\u0131n performans metriklerini (bellek kullan\u0131m\u0131, CPU kullan\u0131m\u0131, HTTP istek say\u0131s\u0131 ve s\u00fcresi vb.) sunar. Prometheus, Micrometer gibi izleme ara\u00e7lar\u0131yla entegre edilebilir.<br \/>\n*   <strong><code>\/env<\/code>:<\/strong> Spring Environment&#8217;\u0131ndaki t\u00fcm konfig\u00fcrasyon \u00f6zelliklerini g\u00f6sterir.<br \/>\n*   <strong><code>\/beans<\/code>:<\/strong> Uygulamadaki t\u00fcm Spring bean&#8217;lerini ve bunlar\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 listeler.<br \/>\n*   <strong><code>\/mappings<\/code>:<\/strong> T\u00fcm <code>@RequestMapping<\/code> yollar\u0131n\u0131 listeler.<br \/>\n*   <strong><code>\/shutdown<\/code>:<\/strong> Uygulamay\u0131 g\u00fcvenli bir \u015fekilde kapat\u0131r (varsay\u0131lan olarak devre d\u0131\u015f\u0131d\u0131r ve manuel olarak etkinle\u015ftirilmesi gerekir).<\/p>\n<p><strong>Kullan\u0131m Ama\u00e7lar\u0131:<\/strong><\/p>\n<p>*   <strong>\u0130zleme (Monitoring):<\/strong> Uygulaman\u0131n canl\u0131 durumunu ve performans\u0131n\u0131 takip etmek.<br \/>\n*   <strong>Y\u00f6netim (Management):<\/strong> Uygulama \u00f6zelliklerini (\u00f6rne\u011fin log seviyelerini) \u00e7al\u0131\u015fma zaman\u0131nda de\u011fi\u015ftirmek.<br \/>\n*   <strong>Sorun Giderme (Troubleshooting):<\/strong> Hatalar\u0131 ve performans sorunlar\u0131n\u0131 te\u015fhis etmek.<br \/>\n*   <strong>Otomasyon (Automation):<\/strong> Otomatik da\u011f\u0131t\u0131m ve \u00f6l\u00e7eklendirme sistemleri taraf\u0131ndan uygulaman\u0131n durumunu kontrol etmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>Actuator endpoint&#8217;leri varsay\u0131lan olarak <code>management.endpoints.web.exposure.include<\/code> \u00f6zelli\u011fi ile yap\u0131land\u0131r\u0131labilir (\u00f6rne\u011fin <code>management.endpoints.web.exposure.include=*<\/code> ile t\u00fcm endpoint&#8217;ler a\u00e7\u0131l\u0131r). G\u00fcvenlik nedeniyle, bu endpoint&#8217;lere eri\u015fim genellikle Spring Security ile korunur.<\/p>\n<h4>Spring Boot Profilleri (Profiles) Ne \u0130\u015fe Yarar?<\/h4>\n<p>Spring Boot profilleri, uygulaman\u0131n farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim vb.) farkl\u0131 konfig\u00fcrasyonlarla \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayan g\u00fc\u00e7l\u00fc bir \u00f6zelliktir. Tek bir kod taban\u0131n\u0131 korurken, veritaban\u0131 ba\u011flant\u0131 bilgileri, log seviyeleri, harici servis URL&#8217;leri gibi ortama \u00f6zg\u00fc ayarlar\u0131 kolayca y\u00f6netmeye olanak tan\u0131r.<\/p>\n<p><strong>Nas\u0131l Kullan\u0131l\u0131r:<\/strong><\/p>\n<p>1.  <strong>Profil Tan\u0131mlama:<\/strong> <code>application.properties<\/code> yerine <code>application-{profile-name}.properties<\/code> (veya <code>.yml<\/code>) dosyalar\u0131 olu\u015fturulur. \u00d6rne\u011fin:<br \/>\n    *   <code>application-dev.properties<\/code> (geli\u015ftirme ortam\u0131 i\u00e7in)<br \/>\n    *   <code>application-prod.properties<\/code> (\u00fcretim ortam\u0131 i\u00e7in)<br \/>\n    *   <code>application-test.properties<\/code> (test ortam\u0131 i\u00e7in)<br \/>\n    Genel ayarlar <code>application.properties<\/code> dosyas\u0131nda kal\u0131rken, profile \u00f6zg\u00fc ayarlar ilgili dosyada tan\u0131mlan\u0131r ve genel ayarlar\u0131 ge\u00e7ersiz k\u0131lar.<\/p>\n<p>2.  <strong>Bean&#8217;leri Profile G\u00f6re Aktif Etme:<\/strong> <code>@Profile<\/code> anotasyonu kullan\u0131larak belirli bean&#8217;ler veya konfig\u00fcrasyon s\u0131n\u0131flar\u0131 yaln\u0131zca belirli bir profil aktif oldu\u011funda etkinle\u015ftirilebilir.<\/p>\n<pre><code class=\"language-java\">@Configuration\n    @Profile(\"dev\")\n    public class DevConfig {\n        \/\/ Dev ortam\u0131na \u00f6zg\u00fc bean'ler\n    }\n\n    @Service\n    @Profile(\"prod\")\n    public class ProdUserService implements UserService {\n        \/\/ \u00dcretim ortam\u0131na \u00f6zg\u00fc servis implementasyonu\n    }<\/code><\/pre>\n<p>3.  <strong>Profil Aktifle\u015ftirme:<\/strong> Bir profil, \u00e7e\u015fitli yollarla aktifle\u015ftirilebilir:<br \/>\n    *   <strong><code>application.properties<\/code>:<\/strong> <code>spring.profiles.active=dev<\/code><br \/>\n    *   <strong>Komut Sat\u0131r\u0131:<\/strong> <code>java -jar myapp.jar --spring.profiles.active=prod<\/code><br \/>\n    *   <strong>Ortam De\u011fi\u015fkeni:<\/strong> <code>SPRING_PROFILES_ACTIVE=test<\/code><br \/>\n    *   <strong>IDE:<\/strong> Geli\u015ftirme ortam\u0131n\u0131zda (IntelliJ, Eclipse) \u00e7al\u0131\u015fma konfig\u00fcrasyonlar\u0131na ekleyerek.<\/p>\n<p><strong>Faydalar\u0131:<\/strong><\/p>\n<p>*   <strong>Ortam Ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131:<\/strong> Uygulaman\u0131n farkl\u0131 ortamlara kolayca uyarlanmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Kod Tekrar\u0131 Azaltma:<\/strong> Ayn\u0131 i\u015flevsellik i\u00e7in farkl\u0131 ortamlar i\u00e7in ayr\u0131 kod tabanlar\u0131 tutma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r.<br \/>\n*   <strong>G\u00fcvenlik:<\/strong> Hassas bilgilerin (veritaban\u0131 \u015fifreleri) farkl\u0131 profillerde g\u00fcvenli bir \u015fekilde y\u00f6netilmesine yard\u0131mc\u0131 olur.<\/p>\n<h4><code>application.properties<\/code> ve <code>application.yml<\/code> Dosyalar\u0131 Aras\u0131ndaki Fark Nedir?<\/h4>\n<p>Her iki dosya da Spring Boot uygulamalar\u0131nda harici konfig\u00fcrasyon sa\u011flamak i\u00e7in kullan\u0131l\u0131r. Temel fark, kulland\u0131klar\u0131 s\u00f6z dizimindedir:<\/p>\n<p>*   <strong><code>application.properties<\/code>:<\/strong><br \/>\n    *   Anahtar-de\u011fer \u00e7iftleri kullan\u0131r.<br \/>\n    *   Her \u00f6zellik ayr\u0131 bir sat\u0131rda tan\u0131mlan\u0131r: <code>server.port=8080<\/code><br \/>\n    *   Yorum sat\u0131rlar\u0131 <code>#<\/code> ile ba\u015flar.<br \/>\n    *   Geleneksel ve yayg\u0131n kullan\u0131lan bir formatt\u0131r.<\/p>\n<p>*   <strong><code>application.yml<\/code> (YAML &#8211; YAML Ain&#8217;t Markup Language):<\/strong><br \/>\n    *   Hiyerar\u015fik bir yap\u0131 kullan\u0131r.<br \/>\n    *   Girintileme (indentation) \u00f6nemlidir ve yap\u0131y\u0131 tan\u0131mlar.<br \/>\n    *   Daha okunabilir ve d\u00fczenli bir yap\u0131 sunar, \u00f6zellikle \u00e7ok say\u0131da konfig\u00fcrasyon \u00f6zelli\u011fi oldu\u011funda.<br \/>\n    *   \u00d6rnek:<\/p>\n<pre><code class=\"language-yaml\">server:\n          port: 8080\n        spring:\n          datasource:\n            url: jdbc:mysql:\/\/localhost:3306\/mydb\n            username: user\n            password: pass<\/code><\/pre>\n<p>    *   Yorum sat\u0131rlar\u0131 <code>#<\/code> ile ba\u015flar.<br \/>\n    *   Listeleri ve haritalar\u0131 daha kolay tan\u0131mlama imkan\u0131 sunar.<\/p>\n<p><strong>Se\u00e7im Kriterleri:<\/strong><\/p>\n<p>*   <strong>Tercih:<\/strong> \u00c7o\u011funlukla ki\u015fisel veya tak\u0131m tercihi meselesidir.<br \/>\n*   <strong>Okunabilirlik:<\/strong> YAML, \u00f6zellikle karma\u015f\u0131k ve \u00e7ok seviyeli konfig\u00fcrasyonlar i\u00e7in daha okunabilir kabul edilir.<br \/>\n*   <strong>Ara\u00e7 Deste\u011fi:<\/strong> Her iki format da Spring Boot ve \u00e7o\u011fu IDE taraf\u0131ndan tam olarak desteklenir.<br \/>\n*   <strong>Ge\u00e7erlilik:<\/strong> Spring Boot, hem <code>.properties<\/code> hem de <code>.yml<\/code> dosyalar\u0131n\u0131 ayn\u0131 anda bulursa, her ikisini de y\u00fckler ve <code>.yml<\/code> dosyalar\u0131 genellikle <code>.properties<\/code> dosyalar\u0131n\u0131 ge\u00e7ersiz k\u0131lar (ayn\u0131 \u00f6zellikler i\u00e7in). Genellikle <code>application.yml<\/code> tercih edilir.<\/p>\n<h3>Spring Boot ile Veri Eri\u015fimi ve Web Geli\u015ftirme<\/h3>\n<p>Spring Boot, veri eri\u015fimi ve web uygulamalar\u0131 geli\u015ftirmeyi de basitle\u015ftirir.<\/p>\n<h4>Spring Data JPA Nedir ve Spring Boot ile Nas\u0131l Kullan\u0131l\u0131r?<\/h4>\n<p>Spring Data JPA, Java Persistence API (JPA) tabanl\u0131 veri eri\u015fim katmanlar\u0131n\u0131 uygulamay\u0131 basitle\u015ftiren bir Spring projesidir. Tekrarlayan kod yazma ihtiyac\u0131n\u0131 ortadan kald\u0131rarak geli\u015ftiricilerin daha h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<p><strong>Spring Boot ile Kullan\u0131m\u0131:<\/strong><\/p>\n<p>1.  <strong>Ba\u011f\u0131ml\u0131l\u0131k Ekleme:<\/strong> <code>spring-boot-starter-data-jpa<\/code> ve veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fc (\u00f6rne\u011fin <code>mysql-connector-java<\/code> veya <code>h2<\/code>) ba\u011f\u0131ml\u0131l\u0131klar\u0131 <code>pom.xml<\/code>&#8216;e eklenir.<br \/>\n2.  <strong>Konfig\u00fcrasyon:<\/strong> <code>application.properties<\/code> veya <code>application.yml<\/code> dosyas\u0131nda veritaban\u0131 ba\u011flant\u0131 bilgileri (URL, kullan\u0131c\u0131 ad\u0131, \u015fifre) ve Hibernate ayarlar\u0131 (DDL modu gibi) tan\u0131mlan\u0131r.<\/p>\n<pre><code class=\"language-yaml\">spring:\n      datasource:\n        url: jdbc:h2:mem:testdb\n        driverClassName: org.h2.Driver\n        username: sa\n        password: password\n      jpa:\n        hibernate:\n          ddl-auto: update # veya create, create-drop, none\n        show-sql: true<\/code><\/pre>\n<p>3.  <strong>Entity Tan\u0131mlama:<\/strong> JPA <code>@Entity<\/code> anotasyonu ile veritaban\u0131 tablolar\u0131na kar\u015f\u0131l\u0131k gelen Java s\u0131n\u0131flar\u0131 olu\u015fturulur.<\/p>\n<pre><code class=\"language-java\">@Entity\n    public class User {\n        @Id\n        @GeneratedValue(strategy = GenerationType.IDENTITY)\n        private Long id;\n        private String name;\n        private String email;\n        \/\/ Getter ve Setter'lar\n    }<\/code><\/pre>\n<p>4.  <strong>Repository Interface&#8217;leri:<\/strong> <code>JpaRepository<\/code> aray\u00fcz\u00fcn\u00fc geni\u015fleterek, CRUD (Create, Read, Update, Delete) i\u015flemleri i\u00e7in otomatik olarak methodlar sa\u011flan\u0131r. \u00d6zel sorgular i\u00e7in method isimleri kurallar\u0131na uyarak veya <code>@Query<\/code> anotasyonu ile methodlar tan\u0131mlanabilir.<\/p>\n<pre><code class=\"language-java\">@Repository\n    public interface UserRepository extends JpaRepository<User, Long> {\n        Optional<User> findByEmail(String email); \/\/ \u00d6zel sorgu\n    }<\/code><\/pre>\n<p>5.  <strong>Servis Katman\u0131:<\/strong> Repository&#8217;ler servis katman\u0131nda enjekte edilerek kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-java\">@Service\n    public class UserService {\n        @Autowired\n        private UserRepository userRepository;\n\n        public User saveUser(User user) {\n            return userRepository.save(user);\n        }\n\n        public Optional<User> findUserById(Long id) {\n            return userRepository.findById(id);\n        }\n        \/\/ Di\u011fer i\u015f mant\u0131\u011f\u0131\n    }<\/code><\/pre>\n<p>Spring Data JPA, veritaban\u0131 etkile\u015fimlerini soyutlayarak ve standartla\u015ft\u0131rarak geli\u015ftirme s\u00fcrecini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<\/p>\n<h4>RESTful Web Servisleri Geli\u015ftirmek \u0130\u00e7in Spring Boot&#8217;ta Hangi Anotasyonlar Kullan\u0131l\u0131r?<\/h4>\n<p>Spring Boot, RESTful web servisleri geli\u015ftirmek i\u00e7in Spring MVC&#8217;yi temel al\u0131r ve geli\u015ftirme s\u00fcrecini basitle\u015ftiren anotasyonlar sunar:<\/p>\n<p>*   <strong><code>@RestController<\/code>:<\/strong> Bu anotasyon, bir s\u0131n\u0131f\u0131n hem <code>@Controller<\/code> hem de <code>@ResponseBody<\/code> anotasyonlar\u0131n\u0131 birle\u015ftirdi\u011fini belirtir. Yani, bu s\u0131n\u0131ftaki t\u00fcm metodlar\u0131n d\u00f6n\u00fc\u015f de\u011ferleri do\u011frudan HTTP yan\u0131t g\u00f6vdesine yaz\u0131l\u0131r (genellikle JSON veya XML format\u0131nda). Bu, RESTful servisler i\u00e7in idealdir.<br \/>\n*   <strong><code>@RequestMapping<\/code>:<\/strong> Bir HTTP iste\u011fini belirli bir methoda veya s\u0131n\u0131fa e\u015flemek i\u00e7in kullan\u0131l\u0131r. Hem URL yolunu hem de HTTP metodunu (GET, POST, PUT, DELETE) belirtebilir.<br \/>\n    *   <code>@RequestMapping(\"\/api\/users\")<\/code> (s\u0131n\u0131f seviyesinde)<br \/>\n    *   <code>@RequestMapping(value = \"\/{id}\", method = RequestMethod.GET)<\/code> (metod seviyesinde)<br \/>\n*   <strong><code>@GetMapping<\/code>, <code>@PostMapping<\/code>, <code>@PutMapping<\/code>, <code>@DeleteMapping<\/code>, <code>@PatchMapping<\/code>:<\/strong> <code>@RequestMapping<\/code>&#8216;in daha spesifik ve okunabilir versiyonlar\u0131d\u0131r. Sadece belirli bir HTTP metodu i\u00e7in e\u015fleme yaparlar.<br \/>\n    *   <code>@GetMapping(\"\/api\/users\")<\/code> (GET iste\u011fi i\u00e7in)<br \/>\n    *   <code>@PostMapping(\"\/api\/users\")<\/code> (POST iste\u011fi i\u00e7in)<br \/>\n    *   <code>@PutMapping(\"\/api\/users\/{id}\")<\/code> (PUT iste\u011fi i\u00e7in)<br \/>\n    *   <code>@DeleteMapping(\"\/api\/users\/{id}\")<\/code> (DELETE iste\u011fi i\u00e7in)<br \/>\n*   <strong><code>@PathVariable<\/code>:<\/strong> URL yolundaki de\u011fi\u015fkenleri (\u00f6rne\u011fin <code>\/users\/{id}<\/code> i\u00e7indeki <code>id<\/code>) metod parametrelerine ba\u011flamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>@GetMapping(\"\/api\/users\/{id}\") public User getUserById(@PathVariable Long id) { ... }<\/code><br \/>\n*   <strong><code>@RequestParam<\/code>:<\/strong> HTTP iste\u011finin sorgu parametrelerini (query parameters) metod parametrelerine ba\u011flamak i\u00e7in kullan\u0131l\u0131r (\u00f6rne\u011fin <code>\/users?name=John<\/code>).<br \/>\n    *   <code>@GetMapping(\"\/api\/users\") public List<User> searchUsers(@RequestParam String name) { ... }<\/code><br \/>\n*   <strong><code>@RequestBody<\/code>:<\/strong> HTTP iste\u011finin g\u00f6vdesindeki (body) verileri (genellikle JSON veya XML) bir Java nesnesine d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in kullan\u0131l\u0131r. Genellikle POST ve PUT isteklerinde veri g\u00f6ndermek i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>@PostMapping(\"\/api\/users\") public User createUser(@RequestBody User user) { ... }<\/code><br \/>\n*   <strong><code>@ResponseBody<\/code>:<\/strong> (Genellikle <code>@RestController<\/code> ile \u00f6rt\u00fcl\u00fcd\u00fcr) Bir metodun d\u00f6n\u00fc\u015f de\u011ferinin do\u011frudan HTTP yan\u0131t g\u00f6vdesine yaz\u0131laca\u011f\u0131n\u0131 belirtir.<br \/>\n*   <strong><code>@ResponseStatus<\/code>:<\/strong> Bir metodun ba\u015far\u0131l\u0131 veya ba\u015far\u0131s\u0131z bir \u015fekilde tamamlanmas\u0131 durumunda d\u00f6nd\u00fcr\u00fclecek HTTP durum kodunu belirtir (\u00f6rne\u011fin <code>HttpStatus.CREATED<\/code>).<br \/>\n    *   <code>@PostMapping public ResponseEntity<User> createUser(@RequestBody User user) { return new ResponseEntity<>(userService.save(user), HttpStatus.CREATED); }<\/code> (ResponseEntity ile de durum kodu ayarlanabilir)<\/p>\n<p>Bu anotasyonlar, Spring Boot ile h\u0131zl\u0131 ve etkin bir \u015fekilde RESTful API&#8217;ler geli\u015ftirmek i\u00e7in temel yap\u0131 ta\u015flar\u0131d\u0131r.<\/p>\n<h4>Spring Boot Uygulamalar\u0131nda Hata Y\u00f6netimi Nas\u0131l Yap\u0131l\u0131r?<\/h4>\n<p>Spring Boot uygulamalar\u0131nda hata y\u00f6netimi, kullan\u0131c\u0131ya anlaml\u0131 hata mesajlar\u0131 sunmak ve uygulaman\u0131n beklenmedik durumlar\u0131 zarif bir \u015fekilde ele almas\u0131n\u0131 sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir. Spring Boot, bu konuda birka\u00e7 g\u00fc\u00e7l\u00fc mekanizma sunar:<\/p>\n<p>1.  <strong><code>@ExceptionHandler<\/code> Anotasyonu:<\/strong> Bir Controller s\u0131n\u0131f\u0131 i\u00e7inde belirli istisna t\u00fcrlerini yakalamak i\u00e7in kullan\u0131l\u0131r. Metodun, yakalamak istedi\u011fi istisna t\u00fcr\u00fcn\u00fc parametre olarak al\u0131r ve bir <code>ResponseEntity<\/code> d\u00f6nd\u00fcrerek HTTP durum kodu ve hata mesaj\u0131 sa\u011flayabilir.<\/p>\n<pre><code class=\"language-java\">@RestController\n    @RequestMapping(\"\/api\/users\")\n    public class UserController {\n        \/\/ ...\n        @ExceptionHandler(UserNotFoundException.class)\n        @ResponseStatus(HttpStatus.NOT_FOUND)\n        public ErrorResponse handleUserNotFoundException(UserNotFoundException ex) {\n            return new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());\n        }\n    }<\/code><\/pre>\n<p>2.  <strong><code>@ControllerAdvice<\/code> Anotasyonu:<\/strong> Uygulama genelinde (global) hata y\u00f6netimi sa\u011flamak i\u00e7in kullan\u0131l\u0131r. <code>@ExceptionHandler<\/code> anotasyonu ile birlikte kullan\u0131ld\u0131\u011f\u0131nda, t\u00fcm Controller&#8217;lar taraf\u0131ndan f\u0131rlat\u0131lan belirli istisnalar\u0131 merkezi bir yerden yakalamay\u0131 sa\u011flar. Bu, hata y\u00f6netim kodunun tekrar\u0131n\u0131 \u00f6nler ve daha temiz bir yap\u0131 sunar.<\/p>\n<pre><code class=\"language-java\">@ControllerAdvice\n    public class GlobalExceptionHandler {\n\n        @ExceptionHandler(UserNotFoundException.class)\n        @ResponseStatus(HttpStatus.NOT_FOUND)\n        public ErrorResponse handleUserNotFound(UserNotFoundException ex) {\n            return new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());\n        }\n\n        @ExceptionHandler(MethodArgumentNotValidException.class)\n        @ResponseStatus(HttpStatus.BAD_REQUEST)\n        public ErrorResponse handleValidationExceptions(MethodArgumentNotValidException ex) {\n            List<String> errors = ex.getBindingResult().getFieldErrors().stream()\n                    .map(error -> error.getField() + \": \" + error.getDefaultMessage())\n                    .collect(Collectors.toList());\n            return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), \"Validation failed: \" + String.join(\", \", errors));\n        }\n\n        @ExceptionHandler(Exception.class)\n        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)\n        public ErrorResponse handleAllExceptions(Exception ex) {\n            return new ErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR.value(), \"An unexpected error occurred: \" + ex.getMessage());\n        }\n    }<\/code><\/pre>\n<p>    Burada <code>ErrorResponse<\/code> \u00f6zel bir hata yan\u0131t\u0131 s\u0131n\u0131f\u0131 olabilir.<\/p>\n<p>3.  <strong><code>ProblemDetail<\/code> (Spring 6+):<\/strong> Spring 6 ile birlikte RFC 7807 standard\u0131n\u0131 uygulayan <code>ProblemDetail<\/code> s\u0131n\u0131f\u0131, API hata yan\u0131tlar\u0131 i\u00e7in daha yap\u0131land\u0131r\u0131lm\u0131\u015f ve standart bir yol sunar.<\/p>\n<p>4.  <strong><code>ErrorController<\/code>:<\/strong> Spring Boot, varsay\u0131lan olarak <code>\/error<\/code> yolunda bir <code>BasicErrorController<\/code> sa\u011flar. Bu kontrolc\u00fc, herhangi bir istisna f\u0131rlat\u0131ld\u0131\u011f\u0131nda ve di\u011fer <code>@ExceptionHandler<\/code>&#8216;lar taraf\u0131ndan yakalanmad\u0131\u011f\u0131nda devreye girer. <code>application.properties<\/code> dosyas\u0131nda <code>server.error.include-stacktrace=never<\/code> gibi ayarlar yap\u0131larak hata detaylar\u0131n\u0131n g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fc kontrol edilebilir.<\/p>\n<p>Etkili hata y\u00f6netimi, API&#8217;nizin g\u00fcvenilirli\u011fini ve kullan\u0131labilirli\u011fini art\u0131r\u0131r.<\/p>\n<h3>Spring Boot Uygulamalar\u0131n\u0131 Test Etme<\/h3>\n<p>Test, yaz\u0131l\u0131m geli\u015ftirme s\u00fcrecinin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r ve Spring Boot, test yazmay\u0131 kolayla\u015ft\u0131ran kapsaml\u0131 ara\u00e7lar sunar.<\/p>\n<h4>Spring Boot Uygulamalar\u0131n\u0131 Test Etmek \u0130\u00e7in Hangi Anotasyonlar Kullan\u0131l\u0131r?<\/h4>\n<p>Spring Boot, farkl\u0131 test senaryolar\u0131 i\u00e7in \u00f6zel test anotasyonlar\u0131 sa\u011flar:<\/p>\n<p>*   <strong><code>@SpringBootTest<\/code>:<\/strong> En kapsaml\u0131 test anotasyonudur. T\u00fcm Spring uygulamas\u0131n\u0131 y\u00fckler ve test etmenizi sa\u011flar. Genellikle entegrasyon testleri i\u00e7in kullan\u0131l\u0131r.<br \/>\n    *   <code>@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)<\/code> ile ger\u00e7ek bir web sunucusu (rastgele bir portta) ba\u015flat\u0131labilir ve HTTP istekleri g\u00f6nderilerek tam entegrasyon testleri yap\u0131labilir.<br \/>\n    *   <code>@SpringBootTest(classes = MySpringBootApplication.class)<\/code> ile belirli bir ana uygulama s\u0131n\u0131f\u0131 belirtilebilir.<br \/>\n    *   <code>@SpringBootTest(properties = {\"my.property=value\"})<\/code> ile test s\u0131ras\u0131nda \u00f6zel konfig\u00fcrasyon \u00f6zellikleri ayarlanabilir.<br \/>\n    *   <code>@SpringBootTest<\/code> ile <code>@Autowired<\/code> kullanarak uygulaman\u0131n herhangi bir bean&#8217;ini test s\u0131n\u0131f\u0131na enjekte edebilirsiniz.<\/p>\n<p>*   <strong><code>@WebMvcTest<\/code>:<\/strong> Yaln\u0131zca Spring MVC katman\u0131n\u0131 (Controller&#8217;lar) test etmek i\u00e7in kullan\u0131l\u0131r. Di\u011fer katmanlar (Servisler, Repository&#8217;ler) mock&#8217;lan\u0131r. Bu, daha hafif ve h\u0131zl\u0131 testler sa\u011flar.<br \/>\n    *   Genellikle <code>MockMvc<\/code> ile birlikte kullan\u0131l\u0131r.<br \/>\n    *   <code>@WebMvcTest(MyController.class)<\/code> ile test edilecek belirli bir Controller s\u0131n\u0131f\u0131 belirtilebilir.<br \/>\n    *   <code>@MockBean<\/code> ile servis veya repository ba\u011f\u0131ml\u0131l\u0131klar\u0131 mock&#8217;lanabilir.<\/p>\n<p>*   <strong><code>@DataJpaTest<\/code>:<\/strong> Yaln\u0131zca JPA katman\u0131n\u0131 (Repository&#8217;ler) test etmek i\u00e7in kullan\u0131l\u0131r. Bellek i\u00e7i bir veritaban\u0131 (\u00f6rne\u011fin H2) yap\u0131land\u0131r\u0131r ve her testten sonra veritaban\u0131n\u0131 temizler. Bu, veritaban\u0131 etkile\u015fimlerini h\u0131zl\u0131ca test etmek i\u00e7in idealdir.<br \/>\n    *   <code>@Autowired TestEntityManager<\/code> ile veritaban\u0131na do\u011frudan eri\u015fim sa\u011flanabilir.<\/p>\n<p>*   <strong><code>@JdbcTest<\/code>:<\/strong> JDBC tabanl\u0131 veri eri\u015fimini test etmek i\u00e7in kullan\u0131l\u0131r, <code>@DataJpaTest<\/code>&#8216;e benzer ancak do\u011frudan JDBC&#8217;ye odaklan\u0131r.<\/p>\n<p>*   <strong><code>@RestClientTest<\/code>:<\/strong> REST istemcilerini (\u00f6rne\u011fin <code>RestTemplate<\/code> veya <code>WebClient<\/code>) test etmek i\u00e7in kullan\u0131l\u0131r. Harici servis \u00e7a\u011fr\u0131lar\u0131n\u0131 mock&#8217;layarak istemci kodunun do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmay\u0131 sa\u011flar.<\/p>\n<p>*   <strong><code>@MockBean<\/code>:<\/strong> Spring uygulama ba\u011flam\u0131na sahte (mock) bean&#8217;ler eklemek veya mevcut bir bean&#8217;i sahte bir s\u00fcr\u00fcm\u00fcyle de\u011fi\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Genellikle <code>@WebMvcTest<\/code> veya <code>@SpringBootTest<\/code> ile birlikte kullan\u0131l\u0131r. Mockito ile entegre \u00e7al\u0131\u015f\u0131r.<\/p>\n<p>*   <strong><code>@SpyBean<\/code>:<\/strong> <code>@MockBean<\/code>&#8216;e benzer, ancak mevcut bir bean&#8217;in ger\u00e7ek metodlar\u0131n\u0131 \u00e7a\u011f\u0131r\u0131rken belirli metodlar\u0131 sahteleyebilir.<\/p>\n<p>Bu anotasyonlar, farkl\u0131 test seviyelerinde (unit, integration, slice) Spring Boot uygulamalar\u0131n\u0131 etkin bir \u015fekilde test etmeye olanak tan\u0131r.<\/p>\n<h3>\u0130leri D\u00fczey Konular ve En \u0130yi Uygulamalar<\/h3>\n<p>M\u00fclakatlarda sadece temel bilgileri bilmek de\u011fil, ayn\u0131 zamanda ileri d\u00fczey konulara hakim olmak ve en iyi uygulamalar\u0131 anlamak da \u00f6nemlidir.<\/p>\n<h4>Spring Boot ile Mikroservis Geli\u015ftirmenin Avantajlar\u0131 Nelerdir?<\/h4>\n<p>Spring Boot, mikroservis mimarileri i\u00e7in do\u011fal bir se\u00e7imdir ve bir\u00e7ok avantaj sunar:<\/p>\n<p>*   <strong>H\u0131zl\u0131 Geli\u015ftirme:<\/strong> Spring Boot&#8217;un otomatik konfig\u00fcrasyon ve starter ba\u011f\u0131ml\u0131l\u0131klar\u0131 sayesinde, her bir mikroservis h\u0131zl\u0131ca geli\u015ftirilebilir ve aya\u011fa kald\u0131r\u0131labilir.<br \/>\n*   <strong>Ba\u011f\u0131ms\u0131z Da\u011f\u0131t\u0131m:<\/strong> G\u00f6m\u00fcl\u00fc sunucular sayesinde her mikroservis, kendi ba\u015f\u0131na \u00e7al\u0131\u015ft\u0131r\u0131labilir bir JAR dosyas\u0131 olarak paketlenebilir ve ba\u011f\u0131ms\u0131z olarak da\u011f\u0131t\u0131labilir. Bu, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r ve basitle\u015ftirir.<br \/>\n*   <strong>Teknoloji \u00c7e\u015fitlili\u011fi:<\/strong> Her mikroservis, farkl\u0131 teknolojiler veya Spring Boot versiyonlar\u0131 ile geli\u015ftirilebilir. Bu, teknoloji se\u00e7imi konusunda esneklik sa\u011flar.<br \/>\n*   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Mikroservisler ba\u011f\u0131ms\u0131z oldu\u011fu i\u00e7in, ihtiya\u00e7 duyulan servisler di\u011ferlerinden ba\u011f\u0131ms\u0131z olarak yatayda \u00f6l\u00e7eklenebilir.<br \/>\n*   <strong>Hata \u0130zolasyonu:<\/strong> Bir serviste meydana gelen hata, di\u011fer servisleri do\u011frudan etkilemez, bu da sistemin genel direncini art\u0131r\u0131r.<br \/>\n*   <strong>Geli\u015ftirici Verimlili\u011fi:<\/strong> K\u00fc\u00e7\u00fck, odaklanm\u0131\u015f kod tabanlar\u0131 \u00fczerinde \u00e7al\u0131\u015fmak, geli\u015ftirici ekiplerinin daha verimli olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Spring Cloud Entegrasyonu:<\/strong> Spring Boot, mikroservis mimarisinde kar\u015f\u0131la\u015f\u0131lan zorluklar\u0131 (servis ke\u015ffi, API a\u011f ge\u00e7itleri, da\u011f\u0131t\u0131k konfig\u00fcrasyon, y\u00fck dengeleme, devre kesici) \u00e7\u00f6zmek i\u00e7in Spring Cloud projesiyle m\u00fckemmel bir uyum i\u00e7indedir.<\/p>\n<h4>Spring Boot Uygulamalar\u0131n\u0131 Dockerize Etmenin Ad\u0131mlar\u0131 Nelerdir?<\/h4>\n<p>Spring Boot uygulamalar\u0131n\u0131 Docker konteynerlerine d\u00f6n\u00fc\u015ft\u00fcrmek, da\u011f\u0131t\u0131m, \u00f6l\u00e7ekleme ve ortam tutarl\u0131l\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck avantajlar sa\u011flar. Temel ad\u0131mlar \u015funlard\u0131r:<\/p>\n<p>1.  <strong>Uygulamay\u0131 Paketleme:<\/strong> Spring Boot uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131labilir bir JAR dosyas\u0131 olarak paketleyin. Bu genellikle <code>mvn package<\/code> veya <code>gradle bootJar<\/code> komutuyla yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-bash\">mvn clean package<\/code><\/pre>\n<p>2.  <strong><code>Dockerfile<\/code> Olu\u015fturma:<\/strong> Uygulaman\u0131n k\u00f6k dizinine bir <code>Dockerfile<\/code> olu\u015fturun. Bu dosya, Docker imaj\u0131n\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 tan\u0131mlar.<\/p>\n<pre><code class=\"language-dockerfile\"># Temel imaj olarak OpenJDK kullan\u0131n. \u00dcretim i\u00e7in daha hafif bir JRE imaj\u0131 tercih edilebilir.\n    FROM openjdk:17-jdk-slim\n\n    # \u0130maj i\u00e7inde \u00e7al\u0131\u015facak uygulaman\u0131n JAR dosyas\u0131n\u0131 kopyalamadan \u00f6nce \u00e7al\u0131\u015fma dizinini belirleyin.\n    WORKDIR \/app\n\n    # Uygulaman\u0131n JAR dosyas\u0131n\u0131 Docker imaj\u0131na kopyalay\u0131n.\n    # \u00d6rne\u011fin: target\/my-spring-boot-app-0.0.1-SNAPSHOT.jar\n    COPY target\/*.jar app.jar\n\n    # Uygulaman\u0131n \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131 portu belirtin. (Opsiyonel ama iyi bir pratik)\n    EXPOSE 8080\n\n    # Uygulamay\u0131 ba\u015flatmak i\u00e7in ENTRYPOINT komutunu kullan\u0131n.\n    # Bu, kapsay\u0131c\u0131 her ba\u015flat\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lacak varsay\u0131lan komuttur.\n    ENTRYPOINT [\"java\", \"-jar\", \"app.jar\"]\n\n    # Alternatif olarak, JVM arg\u00fcmanlar\u0131 eklemek i\u00e7in:\n    # ENTRYPOINT [\"java\", \"-Dspring.profiles.active=prod\", \"-jar\", \"app.jar\"]<\/code><\/pre>\n<p>3.  <strong>Docker \u0130maj\u0131n\u0131 Olu\u015fturma:<\/strong> <code>Dockerfile<\/code>&#8216;\u0131n bulundu\u011fu dizinde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak Docker imaj\u0131n\u0131 olu\u015fturun.<\/p>\n<pre><code class=\"language-bash\">docker build -t my-spring-boot-app .<\/code><\/pre>\n<p>    *   <code>-t my-spring-boot-app<\/code>: \u0130maja <code>my-spring-boot-app<\/code> ad\u0131n\u0131 verir.<br \/>\n    *   <code>.<\/code>: <code>Dockerfile<\/code>&#8216;\u0131n mevcut dizinde oldu\u011funu belirtir.<\/p>\n<p>4.  <strong>Docker Konteynerini \u00c7al\u0131\u015ft\u0131rma:<\/strong> Olu\u015fturulan imajdan bir Docker konteyneri ba\u015flat\u0131n.<\/p>\n<pre><code class=\"language-bash\">docker run -p 8080:8080 my-spring-boot-app<\/code><\/pre>\n<p>    *   <code>-p 8080:8080<\/code>: Host makinenin 8080 portunu konteynerin 8080 portuna e\u015fler.<br \/>\n    *   <code>my-spring-boot-app<\/code>: \u00c7al\u0131\u015ft\u0131r\u0131lacak imaj\u0131n ad\u0131d\u0131r.<\/p>\n<p>5.  <strong>Geli\u015fmi\u015f Optimizasyonlar:<\/strong><br \/>\n    *   <strong>\u00c7ok A\u015famal\u0131 Derleme (Multi-stage Builds):<\/strong> Daha k\u00fc\u00e7\u00fck imajlar olu\u015fturmak i\u00e7in derleme ortam\u0131n\u0131 \u00e7al\u0131\u015fma ortam\u0131ndan ay\u0131r\u0131n.<br \/>\n    *   <strong>Jib:<\/strong> Google&#8217;\u0131n Jib arac\u0131, <code>Dockerfile<\/code> yazmaya gerek kalmadan Spring Boot uygulamalar\u0131n\u0131 Docker imajlar\u0131na d\u00f6n\u00fc\u015ft\u00fcrmeyi otomatikle\u015ftirir.<br \/>\n    *   <strong>Layered JARs (Spring Boot 2.3+):<\/strong> Spring Boot&#8217;un katmanl\u0131 JAR \u00f6zelli\u011fi, Docker imajlar\u0131n\u0131n daha verimli bir \u015fekilde katmanlanmas\u0131n\u0131 sa\u011flar, bu da de\u011fi\u015fikliklerde daha h\u0131zl\u0131 imaj olu\u015fturma ve indirme s\u00fcreleri anlam\u0131na gelir.<\/p>\n<p>Dockerize etmek, Spring Boot uygulamalar\u0131n\u0131z\u0131n tutarl\u0131 bir \u015fekilde farkl\u0131 ortamlarda \u00e7al\u0131\u015fmas\u0131n\u0131 ve modern DevOps s\u00fcre\u00e7lerine entegre olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Spring Boot DevTools Nedir ve Ne Ama\u00e7la Kullan\u0131l\u0131r?<\/h4>\n<p>Spring Boot DevTools, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131rmak ve kolayla\u015ft\u0131rmak i\u00e7in tasarlanm\u0131\u015f bir dizi ara\u00e7 i\u00e7eren bir mod\u00fcld\u00fcr. Sadece geli\u015ftirme ortam\u0131nda kullan\u0131lmal\u0131 ve \u00fcretim ortam\u0131 paketlerine dahil edilmemelidir.<\/p>\n<p><strong>Ba\u015fl\u0131ca \u00d6zellikleri:<\/strong><\/p>\n<p>*   <strong>Otomatik Yeniden Ba\u015flatma (Automatic Restart):<\/strong> Uygulama classpath&#8217;indeki dosyalar de\u011fi\u015fti\u011finde (\u00f6rne\u011fin bir Java s\u0131n\u0131f\u0131n\u0131 kaydetti\u011finizde), DevTools uygulamay\u0131 otomatik olarak yeniden ba\u015flat\u0131r. Bu, geli\u015ftiricilerin de\u011fi\u015fiklikleri an\u0131nda g\u00f6rmesini sa\u011flar.<br \/>\n*   <strong>Taray\u0131c\u0131da Canl\u0131 Yeniden Y\u00fckleme (Live Reload):<\/strong> Taray\u0131c\u0131ya \u00f6zel bir eklenti ile kullan\u0131ld\u0131\u011f\u0131nda, uygulaman\u0131n yeniden ba\u015flat\u0131lmas\u0131n\u0131n ard\u0131ndan taray\u0131c\u0131y\u0131 otomatik olarak yeniler.<br \/>\n*   <strong>Varsay\u0131lan Konfig\u00fcrasyonlar:<\/strong> Geli\u015ftirme dostu varsay\u0131lan konfig\u00fcrasyonlar sa\u011flar. \u00d6rne\u011fin, Thymeleaf \u00f6nbelle\u011fini devre d\u0131\u015f\u0131 b\u0131rak\u0131r, H2 veritaban\u0131 konsolunu etkinle\u015ftirir.<br \/>\n*   <strong>Global Ayarlar:<\/strong> <code>~\/.spring-boot-devtools.properties<\/code> dosyas\u0131nda global DevTools ayarlar\u0131 yap\u0131labilir.<br \/>\n*   <strong>Uzaktan Debugging Deste\u011fi:<\/strong> G\u00fcvenlik \u00f6nlemleriyle birlikte uzaktan debug yapma imkan\u0131 sunar.<\/p>\n<p><strong>Nas\u0131l Kullan\u0131l\u0131r:<\/strong><\/p>\n<p>1.  <strong>Ba\u011f\u0131ml\u0131l\u0131k Ekleme:<\/strong> <code>spring-boot-devtools<\/code> ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 <code>pom.xml<\/code> veya <code>build.gradle<\/code> dosyas\u0131na eklenir. <code>scope=runtime<\/code> olarak belirtilmesi, \u00fcretim paketine dahil edilmemesini sa\u011flar.<\/p>\n<pre><code class=\"language-xml\"><dependency>\n        <groupId>org.springframework.boot<\/groupId>\n        <artifactId>spring-boot-devtools<\/artifactId>\n        <scope>runtime<\/scope>\n        <optional>true<\/optional>\n    <\/dependency><\/code><\/pre>\n<p><strong>\u00d6nemli Notlar:<\/strong><\/p>\n<p>*   <strong>G\u00fcvenlik:<\/strong> DevTools&#8217;un \u00fcretim ortam\u0131nda kullan\u0131lmas\u0131 g\u00fcvenlik riskleri ta\u015f\u0131yabilir, bu nedenle <code>spring.devtools.restart.enabled=false<\/code> gibi \u00f6zelliklerle devre d\u0131\u015f\u0131 b\u0131rak\u0131lmas\u0131 veya \u00fcretim ortam\u0131 paketlerinden hari\u00e7 tutulmas\u0131 \u00f6nerilir.<br \/>\n*   <strong>H\u0131z:<\/strong> Otomatik yeniden ba\u015flatma, b\u00fcy\u00fck uygulamalar i\u00e7in biraz zaman alabilir, ancak genellikle manuel yeniden ba\u015flatmadan daha h\u0131zl\u0131d\u0131r.<\/p>\n<p>DevTools, geli\u015ftiricilerin &#8220;kodla, kaydet, g\u00f6r&#8221; d\u00f6ng\u00fcs\u00fcn\u00fc h\u0131zland\u0131rarak genel \u00fcretkenli\u011fi art\u0131r\u0131r.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Spring Boot, modern Java geli\u015ftirme i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir \u00e7er\u00e7evedir. Bu makalede ele al\u0131nan m\u00fclakat sorular\u0131, Spring Boot&#8217;un temel prensiplerinden ileri d\u00fczey kullan\u0131m senaryolar\u0131na kadar geni\u015f bir yelpazeyi kapsamaktad\u0131r. Otomatik konfig\u00fcrasyon, starter ba\u011f\u0131ml\u0131l\u0131klar\u0131, g\u00f6m\u00fcl\u00fc sunucular gibi temel kavramlar\u0131 anlamak, veri eri\u015fimi ve web geli\u015ftirme i\u00e7in kullan\u0131lan anotasyonlara hakim olmak, hata y\u00f6netimini ve test stratejilerini bilmek, bir Spring Boot geli\u015ftiricisi olarak yetkinli\u011finizi g\u00f6sterecektir. Ayr\u0131ca, mikroservisler, Docker entegrasyonu ve geli\u015ftirici ara\u00e7lar\u0131 gibi ileri d\u00fczey konulara olan a\u015final\u0131\u011f\u0131n\u0131z, sizi di\u011fer adaylardan ay\u0131racakt\u0131r. M\u00fclakatlara haz\u0131rlan\u0131rken bu konular\u0131 derinlemesine incelemeniz ve pratik \u00f6rneklerle peki\u015ftirmeniz, ba\u015far\u0131 \u015fans\u0131n\u0131z\u0131 art\u0131racakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber\nSpring Boot, modern Java geli\u015ftirme d\u00fcnyas\u0131nda vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir. H\u0131z","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-36273","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 M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber - 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-mulakat-sorulari-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber Spring Boot, modern Java geli\u015ftirme d\u00fcnyas\u0131nda vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir. H\u0131z\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-12T01:40:55+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=\"23 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-mulakat-sorulari-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-12-12T01:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/\"},\"wordCount\":4061,\"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-mulakat-sorulari-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/\",\"name\":\"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-12T01:40:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber\"}]},{\"@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 M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber - 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-mulakat-sorulari-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber","og_description":"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber Spring Boot, modern Java geli\u015ftirme d\u00fcnyas\u0131nda vazge\u00e7ilmez bir ara\u00e7 haline gelmi\u015ftir. H\u0131z","og_url":"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-12T01:40:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber","datePublished":"2025-12-12T01:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/"},"wordCount":4061,"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-mulakat-sorulari-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/","name":"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-12T01:40:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/spring-boot-mulakat-sorulari-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Spring Boot M\u00fclakat Sorular\u0131: Kapsaml\u0131 Bir Rehber"}]},{"@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\/36273","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=36273"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36273\/revisions"}],"predecessor-version":[{"id":36274,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36273\/revisions\/36274"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}