{"id":32529,"date":"2025-10-22T23:01:45","date_gmt":"2025-10-22T20:01:45","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/"},"modified":"2025-10-22T23:01:45","modified_gmt":"2025-10-22T20:01:45","slug":"mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/","title":{"rendered":"Mikroservisler ve Spring Boot: Temel Kavramlar Nelerdir?"},"content":{"rendered":"<p><body><br \/>\n<span style=\"font-size: 2em; font-weight: bold; display: block; margin-bottom: 1em;\">A tiny Spring Boot &#8216;profile&#8217; microservice \u2014 Stage\u20110 HNG backend<\/span><\/p>\n<p>Modern uygulama geli\u015ftirmenin h\u0131zla de\u011fi\u015fen d\u00fcnyas\u0131nda, monolitik yap\u0131lardan mikroservis mimarilerine ge\u00e7i\u015f, geli\u015ftiricilere b\u00fcy\u00fck esneklik ve \u00f6l\u00e7eklenebilirlik sunmaktad\u0131r. Peki, bu karma\u015f\u0131k g\u00f6r\u00fcnen d\u00fcnyay\u0131 en basit haliyle nas\u0131l ke\u015ffedebiliriz? \u00d6zellikle HNG backend staj\u0131n\u0131n Stage-0 a\u015famas\u0131nda bir &#8220;profil&#8221; mikroservisi olu\u015fturmak, bu yolculu\u011fa ba\u015flamak i\u00e7in m\u00fckemmel bir f\u0131rsatt\u0131r. Bu makalede, Spring Boot kullanarak minik bir profil mikroservisini ad\u0131m ad\u0131m nas\u0131l geli\u015ftirece\u011finizi, temel kavramlardan ileri d\u00fczey ipu\u00e7lar\u0131na kadar her \u015feyi kapsayarak \u00f6\u011freneceksiniz. B\u00f6ylece hem modern backend mimarilerini anlayacak hem de pratik bir proje geli\u015ftirme deneyimi kazanacaks\u0131n\u0131z.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda, kullan\u0131c\u0131 beklentileri her zamankinden daha y\u00fcksek. Uygulamalar\u0131n h\u0131zl\u0131, esnek ve \u00f6l\u00e7eklenebilir olmas\u0131 art\u0131k bir l\u00fcks de\u011fil, bir gereklilik. \u0130\u015fte tam da bu noktada mikroservis mimarisi devreye giriyor. Geleneksel monolitik uygulamalar\u0131n aksine, mikroservisler bir uygulamay\u0131 k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z ve birbirleriyle ileti\u015fim kuran servisler b\u00fct\u00fcn\u00fc olarak tasarlar. Her servis, belirli bir i\u015f alan\u0131na odaklan\u0131r ve kendi veritaban\u0131na sahip olabilir. Bu yap\u0131, geli\u015ftiricilere belirli servisleri ba\u011f\u0131ms\u0131z olarak geli\u015ftirme, da\u011f\u0131tma ve \u00f6l\u00e7eklendirme \u00f6zg\u00fcrl\u00fc\u011f\u00fc tan\u0131r. \u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda, \u00fcr\u00fcn katalo\u011fu, kullan\u0131c\u0131 y\u00f6netimi ve \u00f6deme i\u015flemleri ayr\u0131 birer mikroservis olarak ele al\u0131nabilir. Bu sayede, \u00fcr\u00fcn katalo\u011funa gelen yo\u011fun talep, \u00f6deme servisini etkilemeden sadece \u00fcr\u00fcn servisi \u00f6l\u00e7eklendirilerek kar\u015f\u0131lanabilir. Ancak, mikroservislerin getirdi\u011fi avantajlar\u0131n yan\u0131 s\u0131ra, da\u011f\u0131t\u0131k sistemlerin y\u00f6netimi, servisler aras\u0131 ileti\u015fim ve hata ay\u0131klama gibi zorluklar\u0131 da beraberinde getirdi\u011fini unutmamak gerekir.<\/p>\n<p>Peki, bu mikroservisleri hayata ge\u00e7irmek i\u00e7in hangi teknolojiye ba\u015fvuraca\u011f\u0131z? Cevap: Spring Boot. Java ekosisteminin en g\u00fc\u00e7l\u00fc ve pop\u00fcler framework&#8217;lerinden biri olan Spring&#8217;in bir alt projesi olan Spring Boot, mikroservis geli\u015ftirmeyi inan\u0131lmaz derecede kolayla\u015ft\u0131r\u0131r. &#8220;Konfig\u00fcrasyondan \u00e7ok varsay\u0131m&#8221; felsefesiyle yola \u00e7\u0131kan Spring Boot, otomatik yap\u0131land\u0131rma, g\u00f6m\u00fcl\u00fc sunucu (Tomcat, Jetty, Undertow) ve \u00fcretim haz\u0131r ara\u00e7lar\u0131 sayesinde geli\u015ftiricilerin boilerplate kod yazma y\u00fck\u00fcn\u00fc hafifletir. Yani, uygulama geli\u015ftirmeye odaklan\u0131rken, altyap\u0131 detaylar\u0131yla bo\u011fu\u015fmak zorunda kalmazs\u0131n\u0131z. Birka\u00e7 ba\u011f\u0131ml\u0131l\u0131k ekleyerek h\u0131zl\u0131ca bir REST API aya\u011fa kald\u0131rabilir, veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 kolayca kurabilir ve hatta g\u00fcvenlik \u00f6zelliklerini saniyeler i\u00e7inde entegre edebilirsiniz. Bu da, \u00f6zellikle HNG backend gibi yo\u011fun ve h\u0131zl\u0131 projelerde geli\u015ftirme s\u00fcrecini ciddi anlamda h\u0131zland\u0131r\u0131r. Spring Boot&#8217;un sundu\u011fu bu kolayl\u0131klar sayesinde, karma\u015f\u0131k bir mikroservis mimarisini dahi nispeten basit ad\u0131mlarla in\u015fa etmek m\u00fcmk\u00fcn hale gelir.<\/p>\n<p>\u015eimdi gelelim bu makalenin ana oda\u011f\u0131na: &#8220;profil&#8221; mikroservisi. Bu, genellikle bir uygulaman\u0131n kullan\u0131c\u0131 bilgilerini (ad, soyad, e-posta, telefon numaras\u0131, profil resmi gibi) y\u00f6neten temel bir servistir. HNG Stage-0 ba\u011flam\u0131nda, bu t\u00fcr bir servis, temel bir kullan\u0131c\u0131 y\u00f6netim sisteminin ilk ad\u0131m\u0131 olarak d\u00fc\u015f\u00fcn\u00fclebilir. Basit bir profil mikroservisi, bir kullan\u0131c\u0131n\u0131n temel bilgilerini olu\u015fturma, okuma, g\u00fcncelleme ve silme (CRUD) i\u015flemlerini ger\u00e7ekle\u015ftiren bir REST API sunacakt\u0131r. Bu a\u015fama, mikroservis mimarisinin temel ta\u015flar\u0131n\u0131 anlaman\u0131za, REST prensiplerini uygulaman\u0131za ve Spring Boot&#8217;un g\u00fcc\u00fcn\u00fc ke\u015ffetmenize olanak tan\u0131r. HNG backend yolculu\u011funuzun bu ilk a\u015famas\u0131nda, bu &#8220;tiny&#8221; yani minik mikroservis, size sa\u011flam bir temel olu\u015fturacak ve ilerleyen a\u015famalardaki daha karma\u015f\u0131k g\u00f6revler i\u00e7in gerekli bilgi birikimini sa\u011flayacakt\u0131r. Bu sayede, hem pratik deneyim kazanacak hem de mikroservislerin ger\u00e7ek d\u00fcnyadaki yerini daha iyi anlayacaks\u0131n\u0131z. Dolay\u0131s\u0131yla, bu ad\u0131mlar sadece bir proje g\u00f6revi de\u011fil, ayn\u0131 zamanda kapsaml\u0131 bir \u00f6\u011frenme s\u00fcrecinin ba\u015flang\u0131c\u0131d\u0131r.<\/p>\n<h2>\u0130lk Spring Boot Mikroservisimizi Nas\u0131l Kurar\u0131z?<\/h2>\n<p>Spring Boot ile bir mikroservis geli\u015ftirmeye ba\u015flamadan \u00f6nce, gerekli ara\u00e7lara sahip oldu\u011fumuzdan emin olmal\u0131y\u0131z. \u00d6ncelikle, Java Geli\u015ftirme Kiti&#8217;ne (JDK) ihtiyac\u0131m\u0131z var. Genellikle JDK 11 veya \u00fcst\u00fc versiyonlar tercih edilir; zira Spring Boot&#8217;un modern versiyonlar\u0131 bu s\u00fcr\u00fcmleri destekler. \u0130kinci olarak, projemizin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek ve derlemek i\u00e7in bir yap\u0131 arac\u0131 (build tool) se\u00e7meliyiz. Bu ba\u011flamda, Maven veya Gradle en pop\u00fcler se\u00e7eneklerdir. Her ikisi de g\u00fc\u00e7l\u00fcd\u00fcr, ancak bu makalede yayg\u0131n kullan\u0131m\u0131 nedeniyle Maven&#8217;a odaklanaca\u011f\u0131z. Son olarak, kod yazmak ve projenizi y\u00f6netmek i\u00e7in bir Entegre Geli\u015ftirme Ortam\u0131 (IDE) gereklidir. IntelliJ IDEA (Community veya Ultimate s\u00fcr\u00fcm\u00fc), Visual Studio Code (Java uzant\u0131lar\u0131yla) veya Eclipse, bu i\u015f i\u00e7in harika se\u00e7eneklerdir. Bu \u00f6nko\u015fullar\u0131 tamamlad\u0131ktan sonra, Spring Boot&#8217;un sihirli d\u00fcnyas\u0131na ad\u0131m atmaya haz\u0131r\u0131z demektir. Bu ad\u0131mlar, herhangi bir Java projesi i\u00e7in temel te\u015fkil etti\u011finden, sa\u011flam bir ba\u015flang\u0131\u00e7 yapmak ad\u0131na kritik \u00f6neme sahiptir.<\/p>\n<p>Projemizi olu\u015fturman\u0131n en kolay yolu, Spring Initializr kullanmakt\u0131r. Bu web tabanl\u0131 ara\u00e7 (start.spring.io), ihtiyac\u0131n\u0131z olan t\u00fcm temel yap\u0131land\u0131rmalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 i\u00e7eren bir Spring Boot projesi iskeleti olu\u015fturman\u0131za olanak tan\u0131r. Taray\u0131c\u0131n\u0131zda start.spring.io adresine gidin. Burada, projenizin temel \u00f6zelliklerini belirleyeceksiniz: Maven veya Gradle, Java versiyonu, Spring Boot versiyonu ve proje meta verileri (Group, Artifact, Name, Description, Package Name). Ba\u011f\u0131ml\u0131l\u0131klar k\u0131sm\u0131nda ise \u015funlar\u0131 eklemeniz \u00f6nemlidir: &#8220;Spring Web&#8221; (REST API&#8217;ler geli\u015ftirmek i\u00e7in), &#8220;H2 Database&#8221; (geli\u015ftirme a\u015famas\u0131nda bellek i\u00e7i veritaban\u0131 olarak kullanaca\u011f\u0131z), ve &#8220;Lombok&#8221; (boilerplate kod miktar\u0131n\u0131 azaltmak i\u00e7in). Bu ba\u011f\u0131ml\u0131l\u0131klar, profil mikroservisimizin temelini olu\u015fturacak bile\u015fenlerdir. Se\u00e7imlerinizi yapt\u0131ktan sonra &#8220;Generate&#8221; butonuna t\u0131klay\u0131n, proje s\u0131k\u0131\u015ft\u0131r\u0131lm\u0131\u015f bir dosya olarak inecek ve bu dosyay\u0131 \u00e7al\u0131\u015fma dizininize \u00e7\u0131karabilirsiniz. Ard\u0131ndan, IDE&#8217;nizle projeyi a\u00e7t\u0131\u011f\u0131n\u0131zda, t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar otomatik olarak indirilecek ve projeniz kullan\u0131ma haz\u0131r hale gelecektir.<\/p>\n<p>Olu\u015fturulan projenin yap\u0131s\u0131na k\u0131saca g\u00f6z atal\u0131m. Proje klas\u00f6r\u00fcn\u00fczde, <code>src\/main\/java<\/code> alt\u0131nda ana uygulama s\u0131n\u0131f\u0131n\u0131z\u0131 (<code>[ProjeAd\u0131]Application.java<\/code>) ve <code>src\/main\/resources<\/code> alt\u0131nda yap\u0131land\u0131rma dosyalar\u0131n\u0131z\u0131 (<code>application.properties<\/code> veya <code>application.yml<\/code>) bulacaks\u0131n\u0131z. <code>pom.xml<\/code> dosyas\u0131 ise Maven ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 ve proje ayarlar\u0131n\u0131z\u0131 i\u00e7erir. \u0130lk olarak, <code>application.properties<\/code> dosyas\u0131nda baz\u0131 temel ayarlar yapabiliriz. \u00d6rne\u011fin, servisimizin hangi porttan \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirleyebiliriz: <code>server.port=8080<\/code>. Ayr\u0131ca, H2 veritaban\u0131 i\u00e7in baz\u0131 temel ayarlar\u0131 da buraya ekleyebiliriz: <code>spring.h2.console.enabled=true<\/code> (H2 konsolunu etkinle\u015ftirir) ve <code>spring.datasource.url=jdbc:h2:mem:profiledb<\/code> (bellek i\u00e7i veritaban\u0131 ad\u0131). Bu basit yap\u0131land\u0131rmalarla bile, Spring Boot uygulaman\u0131z\u0131n temel \u00e7al\u0131\u015fma prensiplerini anlamaya ba\u015flayabilirsiniz. \u015eimdi, uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in basit bir &#8220;Merhaba D\u00fcnya&#8221; REST endpoint&#8217;i ekleyelim. Ana uygulama s\u0131n\u0131f\u0131n\u0131z\u0131n yan\u0131na bir <code>controller<\/code> paketi olu\u015fturun ve i\u00e7ine <code>HelloController<\/code> ad\u0131nda bir s\u0131n\u0131f ekleyin:<\/p>\n<pre><code>\npackage com.example.profilemicroservice.controller;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HelloController {\n\n    @GetMapping(\"\/hello\")\n    public String sayHello() {\n        return \"Merhaba, HNG Backend D\u00fcnyas\u0131!\";\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Uygulaman\u0131z\u0131 IDE'nizden veya Maven komutuyla (<code>mvn spring-boot:run<\/code>) ba\u015flatt\u0131ktan sonra, taray\u0131c\u0131n\u0131zdan veya Postman gibi bir ara\u00e7la <code>http:\/\/localhost:8080\/hello<\/code> adresine giderek \"Merhaba, HNG Backend D\u00fcnyas\u0131!\" mesaj\u0131n\u0131 g\u00f6rmelisiniz. Bu ad\u0131m, Spring Boot uygulaman\u0131z\u0131n ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve temel bir REST endpoint'ine sahip oldu\u011funuzu do\u011frular. Bu temel kurulum, daha karma\u015f\u0131k profil servisimizi geli\u015ftirmek i\u00e7in sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 sunmaktad\u0131r. Ayr\u0131ca, geli\u015ftirme s\u00fcrecinizi daha verimli hale getirmek i\u00e7in IDE'nizin sundu\u011fu k\u0131sayollar\u0131 ve hata ay\u0131klama ara\u00e7lar\u0131n\u0131 kullanmay\u0131 da ihmal etmeyin. Bu k\u00fc\u00e7\u00fck ad\u0131mlar, b\u00fcy\u00fck bir mikroservis mimarisinin ilk ve en kritik yap\u0131 ta\u015flar\u0131n\u0131 olu\u015fturur.<\/p>\n<h2>Basit Bir Profil Mikroservisi Nas\u0131l Geli\u015ftirilir?<\/h2>\n<p>\u015eimdi s\u0131ra, HNG Stage-0 i\u00e7in gerekli olan temel profil mikroservisimizi geli\u015ftirmeye geldi. Bu a\u015famada, kullan\u0131c\u0131 profil bilgilerini depolayacak bir veri modeli tan\u0131mlayacak, bu verilere eri\u015fimi sa\u011flayacak bir repository olu\u015fturacak ve son olarak bu i\u015flemleri bir REST API \u00fczerinden sunacak bir kontrolc\u00fc geli\u015ftirece\u011fiz. Bu bile\u015fenler, bir mikroservisin temel katmanlar\u0131n\u0131 olu\u015fturur: Veri Katman\u0131 (Entity), Veri Eri\u015fim Katman\u0131 (Repository) ve API Katman\u0131 (Controller & Service). Her bir katman\u0131n belirli bir sorumlulu\u011fu vard\u0131r ve bu katmanlar\u0131n ayr\u0131m\u0131, kodun okunabilirli\u011fini, bak\u0131m\u0131n\u0131 ve test edilebilirli\u011fini art\u0131r\u0131r. Bu mod\u00fcler yap\u0131 sayesinde, ileride yap\u0131lacak de\u011fi\u015fiklikler veya eklemeler \u00e7ok daha kolay bir \u015fekilde y\u00f6netilebilir. Ayr\u0131ca, bu yakla\u015f\u0131m, Spring Boot'un katmanl\u0131 mimarisini benimsemenize yard\u0131mc\u0131 olacak ve daha karma\u015f\u0131k projelerde de benzer prensipleri uygulaman\u0131z\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>Veri Modeli ve Depolama: <code>Profile<\/code> Entity'si Nas\u0131l Tan\u0131mlan\u0131r?<\/h3>\n<p>Profil mikroservisimizin kalbinde, kullan\u0131c\u0131 profil bilgilerini temsil eden bir Java s\u0131n\u0131f\u0131, yani bir \"Entity\" bulunur. Bu s\u0131n\u0131f, veritaban\u0131ndaki bir tabloya kar\u015f\u0131l\u0131k gelecek ve her nesnesi bir veritaban\u0131 kayd\u0131n\u0131 temsil edecektir. <code>Profile<\/code> s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015fturmak i\u00e7in JPA (Java Persistence API) anotasyonlar\u0131n\u0131 kullanaca\u011f\u0131z. Lombok ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 sayesinde ise getter, setter, constructor gibi standart metotlar\u0131 otomatik olarak olu\u015fturarak kod kalabal\u0131\u011f\u0131n\u0131 azaltabiliriz. \u0130lk olarak, <code>com.example.profilemicroservice.model<\/code> paketini olu\u015fturun ve i\u00e7ine <code>Profile<\/code> s\u0131n\u0131f\u0131n\u0131 a\u015fa\u011f\u0131daki gibi ekleyin:<\/p>\n<pre><code>\npackage com.example.profilemicroservice.model;\n\nimport lombok.Data;\nimport lombok.NoArgsConstructor;\nimport lombok.AllArgsConstructor;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.GenerationType;\nimport javax.persistence.Id;\nimport javax.validation.constraints.Email;\nimport javax.validation.constraints.NotBlank;\nimport javax.validation.constraints.Size;\n\n@Entity\n@Data\n@NoArgsConstructor\n@AllArgsConstructor\npublic class Profile {\n\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n\n    @NotBlank(message = \"Ad bo\u015f olamaz\")\n    @Size(min = 2, max = 50, message = \"Ad 2 ile 50 karakter aras\u0131nda olmal\u0131\")\n    private String firstName;\n\n    @NotBlank(message = \"Soyad bo\u015f olamaz\")\n    @Size(min = 2, max = 50, message = \"Soyad 2 ile 50 karakter aras\u0131nda olmal\u0131\")\n    private String lastName;\n\n    @NotBlank(message = \"E-posta bo\u015f olamaz\")\n    @Email(message = \"Ge\u00e7erli bir e-posta adresi giriniz\")\n    private String email;\n\n    @Size(max = 20, message = \"Telefon numaras\u0131 en fazla 20 karakter olabilir\")\n    private String phoneNumber;\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kodda:<\/p>\n<ul>\n<li><code>@Entity<\/code>: Bu s\u0131n\u0131f\u0131n bir JPA varl\u0131\u011f\u0131 oldu\u011funu ve veritaban\u0131 tablosuyla e\u015fle\u015fece\u011fini belirtir.<\/li>\n<li><code>@Data<\/code>, <code>@NoArgsConstructor<\/code>, <code>@AllArgsConstructor<\/code>: Lombok anotasyonlar\u0131d\u0131r. S\u0131ras\u0131yla getter\/setter, <code>toString<\/code>, <code>equals<\/code>, <code>hashCode<\/code> metotlar\u0131n\u0131; parametresiz ve t\u00fcm parametreleri i\u00e7eren kurucular\u0131 otomatik olu\u015fturur.<\/li>\n<li><code>@Id<\/code>: <code>id<\/code> alan\u0131n\u0131n birincil anahtar oldu\u011funu g\u00f6sterir.<\/li>\n<li><code>@GeneratedValue(strategy = GenerationType.IDENTITY)<\/code>: <code>id<\/code> de\u011ferinin veritaban\u0131 taraf\u0131ndan otomatik olarak art\u0131r\u0131laca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><code>@NotBlank<\/code>, <code>@Email<\/code>, <code>@Size<\/code>: Bean Validation API anotasyonlar\u0131d\u0131r. Gelen verinin do\u011frulu\u011funu kontrol etmek i\u00e7in kullan\u0131l\u0131r. Bu, API katman\u0131nda veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak i\u00e7in kritik bir ad\u0131md\u0131r. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n e-posta adresini bo\u015f b\u0131rakmas\u0131n\u0131 veya ge\u00e7ersiz bir format girmesini engelleriz.<\/li>\n<\/ul>\n<p>Bu <code>Profile<\/code> entity'si, kullan\u0131c\u0131lar\u0131m\u0131z\u0131n ad, soyad, e-posta ve telefon numaras\u0131 gibi temel bilgilerini tutacakt\u0131r. \u015eimdi, bu entity'yi y\u00f6netmek i\u00e7in bir repository aray\u00fcz\u00fcne ihtiyac\u0131m\u0131z var.<\/p>\n<h3>REST API ve \u0130\u015f Mant\u0131\u011f\u0131: <code>ProfileController<\/code> ve <code>ProfileService<\/code> Nas\u0131l Olu\u015fturulur?<\/h3>\n<p>Veri modelimizi tan\u0131mlad\u0131ktan sonra, bu verilere eri\u015fmek ve \u00fczerinde CRUD operasyonlar\u0131 yapmak i\u00e7in Spring Data JPA'n\u0131n g\u00fcc\u00fcn\u00fc kullanaca\u011f\u0131z. <code>ProfileRepository<\/code> aray\u00fcz\u00fc, bizim i\u00e7in standart veritaban\u0131 i\u015flemlerini (kaydetme, bulma, silme) otomatik olarak sa\u011flayacakt\u0131r. <code>com.example.profilemicroservice.repository<\/code> paketini olu\u015fturun ve <code>ProfileRepository<\/code> aray\u00fcz\u00fcn\u00fc tan\u0131mlay\u0131n:<\/p>\n<pre><code>\npackage com.example.profilemicroservice.repository;\n\nimport com.example.profilemicroservice.model.Profile;\nimport org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.stereotype.Repository;\n\n@Repository\npublic interface ProfileRepository extends JpaRepository<Profile, Long> {\n    \/\/ \u00d6zel sorgular buraya eklenebilir, \u00f6rne\u011fin:\n    \/\/ Optional<Profile> findByEmail(String email);\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>JpaRepository<\/code>'den t\u00fcreyerek, <code>save()<\/code>, <code>findById()<\/code>, <code>findAll()<\/code>, <code>deleteById()<\/code> gibi metotlara otomatik olarak sahip oluruz. Bu sayede, veritaban\u0131 etkile\u015fim kodunu yazmak zorunda kalmay\u0131z. \u015eimdi ise i\u015f mant\u0131\u011f\u0131m\u0131z\u0131 y\u00f6netecek bir servis katman\u0131 (<code>ProfileService<\/code>) ve bu servisi bir REST API \u00fczerinden d\u0131\u015f d\u00fcnyaya sunacak bir kontrolc\u00fc (<code>ProfileController<\/code>) olu\u015ftural\u0131m. <code>com.example.profilemicroservice.service<\/code> ve <code>com.example.profilemicroservice.controller<\/code> paketlerini olu\u015fturun.<\/p>\n<p>\u0130lk olarak, <code>ProfileService<\/code> s\u0131n\u0131f\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>\npackage com.example.profilemicroservice.service;\n\nimport com.example.profilemicroservice.model.Profile;\nimport com.example.profilemicroservice.repository.ProfileRepository;\nimport org.springframework.stereotype.Service;\nimport java.util.List;\nimport java.util.Optional;\n\n@Service\npublic class ProfileService {\n\n    private final ProfileRepository profileRepository;\n\n    public ProfileService(ProfileRepository profileRepository) {\n        this.profileRepository = profileRepository;\n    }\n\n    public List<Profile> getAllProfiles() {\n        return profileRepository.findAll();\n    }\n\n    public Optional<Profile> getProfileById(Long id) {\n        return profileRepository.findById(id);\n    }\n\n    public Profile createProfile(Profile profile) {\n        return profileRepository.save(profile);\n    }\n\n    public Optional<Profile> updateProfile(Long id, Profile updatedProfile) {\n        return profileRepository.findById(id).map(profile -> {\n            profile.setFirstName(updatedProfile.getFirstName());\n            profile.setLastName(updatedProfile.getLastName());\n            profile.setEmail(updatedProfile.getEmail());\n            profile.setPhoneNumber(updatedProfile.getPhoneNumber());\n            return profileRepository.save(profile);\n        });\n    }\n\n    public boolean deleteProfile(Long id) {\n        if (profileRepository.existsById(id)) {\n            profileRepository.deleteById(id);\n            return true;\n        }\n        return false;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu servis s\u0131n\u0131f\u0131, <code>ProfileRepository<\/code>'yi kullanarak temel CRUD i\u015flemlerini yapar. <code>@Service<\/code> anotasyonu, bu s\u0131n\u0131f\u0131n bir servis katman\u0131 bile\u015feni oldu\u011funu Spring'e bildirir. Metotlar <code>Optional<\/code> kullanarak bir profilin bulunup bulunmad\u0131\u011f\u0131n\u0131 g\u00fcvenli bir \u015fekilde ifade eder, bu da null pointer exception'lar\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur. Son olarak, bu servisi d\u0131\u015f d\u00fcnyaya a\u00e7acak olan <code>ProfileController<\/code> s\u0131n\u0131f\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code>\npackage com.example.profilemicroservice.controller;\n\nimport com.example.profilemicroservice.model.Profile;\nimport com.example.profilemicroservice.service.ProfileService;\nimport org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.validation.Valid;\nimport java.util.List;\n\n@RestController\n@RequestMapping(\"\/api\/profiles\")\npublic class ProfileController {\n\n    private final ProfileService profileService;\n\n    public ProfileController(ProfileService profileService) {\n        this.profileService = profileService;\n    }\n\n    @GetMapping\n    public ResponseEntity<List<Profile>> getAllProfiles() {\n        List<Profile> profiles = profileService.getAllProfiles();\n        return ResponseEntity.ok(profiles);\n    }\n\n    @GetMapping(\"\/{id}\")\n    public ResponseEntity<Profile> getProfileById(@PathVariable Long id) {\n        return profileService.getProfileById(id)\n                .map(ResponseEntity::ok)\n                .orElse(ResponseEntity.notFound().build());\n    }\n\n    @PostMapping\n    public ResponseEntity<Profile> createProfile(@Valid @RequestBody Profile profile) {\n        Profile createdProfile = profileService.createProfile(profile);\n        return new ResponseEntity<>(createdProfile, HttpStatus.CREATED);\n    }\n\n    @PutMapping(\"\/{id}\")\n    public ResponseEntity<Profile> updateProfile(@PathVariable Long id, @Valid @RequestBody Profile profile) {\n        return profileService.updateProfile(id, profile)\n                .map(ResponseEntity::ok)\n                .orElse(ResponseEntity.notFound().build());\n    }\n\n    @DeleteMapping(\"\/{id}\")\n    public ResponseEntity<Void> deleteProfile(@PathVariable Long id) {\n        if (profileService.deleteProfile(id)) {\n            return ResponseEntity.noContent().build();\n        }\n        return ResponseEntity.notFound().build();\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>@RestController<\/code> ve <code>@RequestMapping(\"\/api\/profiles\")<\/code> anotasyonlar\u0131, bu s\u0131n\u0131f\u0131n <code>\/api\/profiles<\/code> yolu alt\u0131ndaki REST isteklerini y\u00f6netece\u011fini belirtir. Her bir metot (<code>@GetMapping<\/code>, <code>@PostMapping<\/code>, <code>@PutMapping<\/code>, <code>@DeleteMapping<\/code>), HTTP metotlar\u0131na ve URL kal\u0131plar\u0131na g\u00f6re gelen istekleri kar\u015f\u0131lar. <code>@Valid<\/code> anotasyonu, <code>Profile<\/code> nesnesindeki Bean Validation kurallar\u0131n\u0131n tetiklenmesini sa\u011flar. <code>ResponseEntity<\/code> kullanarak HTTP durum kodlar\u0131n\u0131 (200 OK, 201 CREATED, 404 NOT FOUND, 204 NO CONTENT) daha esnek bir \u015fekilde d\u00f6nd\u00fcrebiliriz. Bu katmanlar sayesinde, basit ama i\u015flevsel bir profil mikroservisini ba\u015far\u0131yla tamamlam\u0131\u015f olursunuz. Art\u0131k bu servisi test etmeye ve geli\u015ftirmeye haz\u0131rs\u0131n\u0131z.<\/p>\n<h2>Profil Servisini Test Etme ve G\u00fcvenli Hale Getirme \u0130pu\u00e7lar\u0131 Nelerdir?<\/h2>\n<p>Bir mikroservisi geli\u015ftirmek kadar, onun do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak da b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Test a\u015famas\u0131, hem geli\u015ftirme s\u00fcrecinin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r hem de uygulaman\u0131n \u00fcretim ortam\u0131nda kar\u015f\u0131la\u015fabilece\u011fi sorunlar\u0131 \u00f6nceden tespit etmeye yard\u0131mc\u0131 olur. Ayr\u0131ca, modern uygulamalar\u0131n en kritik y\u00f6nlerinden biri olan g\u00fcvenlik, ba\u015flang\u0131\u00e7tan itibaren g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r. Basit bir profil mikroservisi bile temel g\u00fcvenlik ad\u0131mlar\u0131yla g\u00fc\u00e7lendirilebilir. Son olarak, servisin performans\u0131n\u0131 ve \u00f6l\u00e7eklenebilirli\u011fini art\u0131rmak i\u00e7in baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131, gelecekteki b\u00fcy\u00fcme ve daha karma\u015f\u0131k senaryolar i\u00e7in bir temel olu\u015fturacakt\u0131r. Bu b\u00f6l\u00fcmde, geli\u015ftirilen profil servisini nas\u0131l test edece\u011finizi, temel g\u00fcvenlik \u00f6nlemlerini ve performans\u0131 art\u0131racak stratejileri ele alaca\u011f\u0131z. Bu ad\u0131mlar, projenizin sa\u011flaml\u0131\u011f\u0131n\u0131 ve g\u00fcvenilirli\u011fini art\u0131rmak ad\u0131na hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<h3>API U\u00e7 Noktalar\u0131n\u0131 Test Etme: Postman ve <code>curl<\/code> Kullan\u0131m\u0131<\/h3>\n<p>Geli\u015ftirdi\u011fimiz REST API u\u00e7 noktalar\u0131n\u0131 test etmenin en kolay yollar\u0131ndan biri Postman gibi grafik aray\u00fcze sahip ara\u00e7lar veya komut sat\u0131r\u0131 arac\u0131 <code>curl<\/code> kullanmakt\u0131r. Bu ara\u00e7lar sayesinde, HTTP istekleri g\u00f6ndererek API'nin beklenen yan\u0131tlar\u0131 verip vermedi\u011fini kontrol edebiliriz. Uygulaman\u0131z\u0131 ba\u015flatt\u0131ktan sonra, a\u015fa\u011f\u0131daki \u00f6rnek <code>curl<\/code> komutlar\u0131yla testlerinizi ger\u00e7ekle\u015ftirebilirsiniz:<\/p>\n<pre><code>\n<span style=\"color: green;\"># Yeni bir profil olu\u015fturma (POST iste\u011fi)<\/span>\ncurl -X POST http:\/\/localhost:8080\/api\/profiles \\\n-H \"Content-Type: application\/json\" \\\n-d '{\n    \"firstName\": \"John\",\n    \"lastName\": \"Doe\",\n    \"email\": \"john.doe@example.com\",\n    \"phoneNumber\": \"123-456-7890\"\n}'\n\n<span style=\"color: green;\"># T\u00fcm profilleri listeleme (GET iste\u011fi)<\/span>\ncurl http:\/\/localhost:8080\/api\/profiles\n\n<span style=\"color: green;\"># Belirli bir profili ID ile alma (GET iste\u011fi) - ID'yi yukar\u0131daki POST yan\u0131t\u0131ndan almal\u0131s\u0131n\u0131z<\/span>\ncurl http:\/\/localhost:8080\/api\/profiles\/1\n\n<span style=\"color: green;\"># Bir profili g\u00fcncelleme (PUT iste\u011fi)<\/span>\ncurl -X PUT http:\/\/localhost:8080\/api\/profiles\/1 \\\n-H \"Content-Type: application\/json\" \\\n-d '{\n    \"firstName\": \"Jane\",\n    \"lastName\": \"Doe\",\n    \"email\": \"jane.doe@example.com\",\n    \"phoneNumber\": \"098-765-4321\"\n}'\n\n<span style=\"color: green;\"># Bir profili silme (DELETE iste\u011fi)<\/span>\ncurl -X DELETE http:\/\/localhost:8080\/api\/profiles\/1\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komutlar\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, API'nizin beklenen \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. Postman kullan\u0131yorsan\u0131z, daha g\u00f6rsel bir aray\u00fczle isteklerinizi g\u00f6nderebilir ve yan\u0131tlar\u0131 kolayca inceleyebilirsiniz. Ayr\u0131ca, birim (unit) testleri ve entegrasyon (integration) testleri yazmak, uygulaman\u0131z\u0131n kalitesini art\u0131rmak i\u00e7in \u00f6nemlidir. Spring Boot Test framework'\u00fc, bu t\u00fcr testleri yazmay\u0131 olduk\u00e7a kolayla\u015ft\u0131r\u0131r. \u00d6zellikle <code>@WebMvcTest<\/code> veya <code>@SpringBootTest<\/code> anotasyonlar\u0131 ile controller ve service katmanlar\u0131n\u0131z\u0131 ba\u011f\u0131ms\u0131z olarak test edebilirsiniz. Bu testler, kodunuzun her par\u00e7as\u0131n\u0131n do\u011fru davrand\u0131\u011f\u0131ndan emin olman\u0131z\u0131 sa\u011flar ve gelecekteki de\u011fi\u015fikliklerin mevcut i\u015flevselli\u011fi bozmad\u0131\u011f\u0131n\u0131 garanti eder.<\/p>\n<h3>Mikroservis G\u00fcvenli\u011fi: Temel Ad\u0131mlar<\/h3>\n<p>G\u00fcvenlik, herhangi bir uygulama i\u00e7in asla g\u00f6z ard\u0131 edilmemesi gereken bir konudur. HNG Stage-0 projenizde bile temel g\u00fcvenlik ad\u0131mlar\u0131n\u0131 atmak, iyi bir pratik geli\u015ftirmek i\u00e7in \u00f6nemlidir. Spring Security, Spring ekosisteminin g\u00fc\u00e7l\u00fc bir g\u00fcvenlik \u00e7\u00f6z\u00fcm\u00fcd\u00fcr ve bir\u00e7ok kimlik do\u011frulama (authentication) ve yetkilendirme (authorization) senaryosunu destekler. Basit bir ba\u015flang\u0131\u00e7 i\u00e7in, projenize Spring Security ba\u011f\u0131ml\u0131l\u0131\u011f\u0131n\u0131 ekleyerek (<code>pom.xml<\/code> dosyan\u0131za <code>spring-boot-starter-security<\/code> ekleyin), uygulamaya eri\u015fimi temel HTTP Basic kimlik do\u011frulamas\u0131 ile koruyabilirsiniz. Bu, her API iste\u011fi i\u00e7in kullan\u0131c\u0131 ad\u0131 ve \u015fifre gerektirecektir. Elbette, bu sadece bir ba\u015flang\u0131\u00e7t\u0131r; ger\u00e7ek d\u00fcnya uygulamalar\u0131nda JWT (JSON Web Token) tabanl\u0131 kimlik do\u011frulama veya OAuth 2.0 gibi daha geli\u015fmi\u015f mekanizmalar kullan\u0131l\u0131r. Ancak, Stage-0 i\u00e7in bile, kullan\u0131c\u0131 giri\u015fi do\u011frulamas\u0131 (\u00f6rne\u011fin, e-posta format\u0131, \u015fifre uzunlu\u011fu gibi) ve API'lere eri\u015fimin k\u0131s\u0131tlanmas\u0131 gibi konular\u0131 d\u00fc\u015f\u00fcnmek \u00f6nemlidir. Ayr\u0131ca, HTTP isteklerinde SSL\/TLS kullanarak veri ileti\u015fimini \u015fifrelemek de standart bir g\u00fcvenlik \u00f6nlemidir. Input validation (giri\u015f do\u011frulamas\u0131) ile zararl\u0131 verilerin sisteme girmesini engellemek de pasif ama etkili bir g\u00fcvenlik katman\u0131d\u0131r. Geli\u015ftirme a\u015famas\u0131nda bile, hassas verileri loglamaktan ka\u00e7\u0131nmak ve hata mesajlar\u0131nda \u00e7ok fazla detay vermemek gibi iyi g\u00fcvenlik al\u0131\u015fkanl\u0131klar\u0131 edinmelisiniz.<\/p>\n<h3>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131: Performans ve \u00d6l\u00e7eklenebilirlik<\/h3>\n<p>Bir mikroservis k\u00fc\u00e7\u00fck olabilir ama yine de performans ve \u00f6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan dikkatli tasar\u0131m gerektirir. K\u00fc\u00e7\u00fck bir \"profil\" servisi i\u00e7in bile bu konulara de\u011finmek, gelecekte daha b\u00fcy\u00fck ve karma\u015f\u0131k sistemler geli\u015ftirece\u011finizde size yol g\u00f6sterecektir. \u0130lk olarak, \u00f6nbellekleme (caching) stratejilerini d\u00fc\u015f\u00fcn\u00fcn. S\u0131k\u00e7a eri\u015filen ancak nadiren de\u011fi\u015fen profil bilgilerini \u00f6nbellekte tutmak, veritaban\u0131 y\u00fck\u00fcn\u00fc azaltarak yan\u0131t s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131rabilir. Spring Cache, bu i\u015fi kolayca yapman\u0131z\u0131 sa\u011flar. \u0130kinci olarak, veritaban\u0131 sorgular\u0131n\u0131z\u0131 optimize edin. N+1 sorgu sorunlar\u0131 gibi performans d\u00fc\u015f\u00fc\u015flerine neden olan durumlar\u0131 tespit etmek ve uygun indeksler kullanmak, servisin genel performans\u0131n\u0131 art\u0131racakt\u0131r. \u00dc\u00e7\u00fcnc\u00fc olarak, asenkron i\u015flemleri de\u011ferlendirin. Baz\u0131 i\u015flemler (\u00f6rne\u011fin, profil g\u00fcncellemesi sonras\u0131 bildirim g\u00f6nderme) hemen yan\u0131t gerektirmeyebilir. Bu t\u00fcr i\u015flemleri ayr\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131nda (thread) veya bir mesaj kuyru\u011fu (message queue) arac\u0131l\u0131\u011f\u0131yla asenkron olarak y\u00fcr\u00fctmek, API yan\u0131t s\u00fcrelerini k\u0131saltabilir ve kullan\u0131c\u0131 deneyimini iyile\u015ftirebilir. Son olarak, Spring Boot Actuator'\u0131 kullanarak uygulaman\u0131z\u0131n sa\u011fl\u0131k durumunu, metriklerini ve di\u011fer operasyonel bilgilerini izleyin. Bu, sorunlar\u0131 h\u0131zl\u0131ca tespit etmenize ve performans darbo\u011fazlar\u0131n\u0131 gidermenize yard\u0131mc\u0131 olur. Mikroservisinizin bulut ortam\u0131nda (\u00f6rne\u011fin AWS, Azure, GCP) nas\u0131l da\u011f\u0131t\u0131laca\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnerek, performans ve maliyet optimizasyonlar\u0131 i\u00e7in uygun bulut servislerini (\u00f6rne\u011fin y\u00f6netilen veritaban\u0131 servisleri) de\u011ferlendirmek de \u00f6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan kritik bir ad\u0131md\u0131r.<\/p>\n<p><span>Uzman \u0130pucu: Mikroservisler aras\u0131 ileti\u015fimde olu\u015fan gecikmeleri minimize etmek i\u00e7in uygun bir ileti\u015fim protokol\u00fc (\u00f6rne\u011fin gRPC yerine HTTP\/1.1) se\u00e7imi veya API Gateway kullan\u0131m\u0131 gibi stratejileri de ara\u015ft\u0131rabilirsiniz.<\/span><\/p>\n<h2>Mobil Uyumluluk ve API Tasar\u0131m\u0131: Backend'den Frontend'e Uzanan K\u00f6pr\u00fc<\/h2>\n<p>Bir backend mikroservisi geli\u015ftirirken, s\u0131kl\u0131kla sadece kendi kodumuza odaklan\u0131r\u0131z. Ancak, modern uygulamalar\u0131n b\u00fcy\u00fck \u00e7o\u011funlu\u011fu, API'lerimizi t\u00fcketen mobil uygulamalar, web siteleri veya di\u011fer servislerle etkile\u015fim halindedir. Dolay\u0131s\u0131yla, backend API'lerimizi tasarlarken frontend'in ve \u00f6zellikle mobil cihazlar\u0131n ihtiya\u00e7lar\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak hayati \u00f6nem ta\u015f\u0131r. Profil mikroservisimizden gelen verilerin mobil bir uygulamada veya responsive bir web sitesinde nas\u0131l g\u00f6r\u00fcnt\u00fclenece\u011fi, API tasar\u0131m\u0131m\u0131z\u0131 do\u011frudan etkileyebilir. Mobil kullan\u0131c\u0131lar, genellikle daha d\u00fc\u015f\u00fck bant geni\u015fli\u011fine ve daha k\u0131s\u0131tl\u0131 i\u015flem g\u00fcc\u00fcne sahip cihazlar kullan\u0131r; bu da API'den gelen yan\u0131tlar\u0131n hafif, verimli ve h\u0131zl\u0131 olmas\u0131n\u0131 gerektirir. API'nin birincil amac\u0131, farkl\u0131 istemcilerin (web, mobil, masa\u00fcst\u00fc) ihtiya\u00e7 duydu\u011fu verileri g\u00fcvenilir ve tutarl\u0131 bir \u015fekilde sa\u011flamakt\u0131r. Bu nedenle, bir backend geli\u015ftiricisi olarak, mobil uyumluluk ve responsive tasar\u0131m\u0131n temel prensiplerini anlamak, daha iyi API'ler geli\u015ftirmenize ve entegrasyon s\u00fcre\u00e7lerini kolayla\u015ft\u0131rman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Bu b\u00f6l\u00fcm, backend perspektifinden mobil uyumlulu\u011fun ne anlama geldi\u011fini ve API tasar\u0131m\u0131nda nelere dikkat etmemiz gerekti\u011fini vurgulayacakt\u0131r.<\/p>\n<p>API tasar\u0131m\u0131nda mobil ihtiya\u00e7lar\u0131 g\u00f6zetmek, genellikle \"minimal payload\" ve \"verimli sorgular\" prensipleriyle \u00f6zetlenebilir. Minimal payload, API yan\u0131tlar\u0131n\u0131n sadece gerekli verileri i\u00e7ermesi gerekti\u011fi anlam\u0131na gelir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n profilini \u00e7ekerken, mobil bir uygulaman\u0131n sadece ad\u0131n\u0131 ve profil resmini g\u00f6stermesi gerekiyorsa, API'nin yan\u0131t\u0131nda gereksiz t\u00fcm alanlar\u0131 g\u00f6ndermek bant geni\u015fli\u011fi israf\u0131na yol a\u00e7ar. Geli\u015ftiriciler, <code>fields<\/code> veya <code>include<\/code> gibi sorgu parametreleriyle istemcilerin hangi alanlar\u0131 almak istediklerini belirtmelerine olanak tan\u0131yarak bu sorunu \u00e7\u00f6zebilirler. Verimli sorgular ise, mobil cihazlar\u0131n ekran boyutlar\u0131na veya a\u011f ko\u015fullar\u0131na g\u00f6re farkl\u0131 veri setleri sunabilen API'ler anlam\u0131na gelebilir, ancak bu genellikle daha karma\u015f\u0131k bir yakla\u015f\u0131md\u0131r. Daha yayg\u0131n olarak, mobil uygulamalar\u0131n kendileri, API'den al\u0131nan veriyi dinamik olarak adapte eder. Bu adaptasyon, frontend taraf\u0131nda responsive tasar\u0131m teknikleriyle sa\u011flan\u0131r. Yani, backend, mobil uygulamaya veya web aray\u00fcz\u00fcne standart bir veri seti sunar ve bu aray\u00fczler, cihaz\u0131n \u00f6zelliklerine g\u00f6re veriyi farkl\u0131 \u015fekillerde sunar. Bir backend geli\u015ftiricisi, bu frontend adaptasyonunun sorunsuz \u00e7al\u0131\u015fabilmesi i\u00e7in API'nin \u00f6ng\u00f6r\u00fclebilir, iyi belgelenmi\u015f ve performans\u0131 y\u00fcksek olmas\u0131n\u0131 sa\u011flamal\u0131d\u0131r.<\/p>\n<p>\u00d6zellikle bir web tabanl\u0131 aray\u00fcz, profil mikroservisimizden gelen veriyi g\u00f6stermek i\u00e7in HTML ve CSS kullan\u0131r. Bu noktada, mobil uyumlulu\u011fu sa\u011flamak i\u00e7in CSS Media Queries devreye girer. Media query'ler, web sitelerinin farkl\u0131 ekran boyutlar\u0131na ve cihazlara (mobil, tablet, masa\u00fcst\u00fc) otomatik olarak uyum sa\u011flamas\u0131n\u0131 sa\u011flayan CSS kurallar\u0131d\u0131r. Bir backend geli\u015ftiricisi do\u011frudan media query yazmasa da, API'sinin t\u00fcketicilerinin (frontend geli\u015ftiricileri) bu t\u00fcr teknikleri kullanarak kullan\u0131c\u0131 deneyimini iyile\u015ftirdi\u011fini bilmesi, API tasar\u0131mlar\u0131n\u0131 daha bilin\u00e7li yapmas\u0131na olanak tan\u0131r. \u00d6rne\u011fin, bir profil listesi API'si sunarken, mobil g\u00f6r\u00fcn\u00fcmde sadece isim ve foto\u011fraf\u0131n, masa\u00fcst\u00fcnde ise t\u00fcm detaylar\u0131n g\u00f6sterilebilece\u011fini varsayarak API yan\u0131t\u0131n\u0131 buna g\u00f6re tasarlamak (\u00f6rne\u011fin, gerekli t\u00fcm alanlar\u0131 i\u00e7eren ama ayn\u0131 zamanda hafif olan bir yan\u0131t) mant\u0131kl\u0131 olacakt\u0131r. A\u015fa\u011f\u0131da, mobil uyumlu bir web sayfas\u0131 \u00f6rne\u011fi i\u00e7in basit bir HTML ve CSS snippet'i g\u00f6sterilmektedir:<\/p>\n<pre><code>\n<span style=\"color: green;\"><!-- index.html --><\/span>\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Mobil Uyumlu Profil Sayfas\u0131<\/title>\n    <style>\n        body { font-family: Arial, sans-serif; margin: 20px; }\n        .profile-container {\n            border: 1px solid #ccc;\n            padding: 15px;\n            max-width: 600px;\n            margin: 0 auto;\n        }\n        .profile-info {\n            display: flex;\n            flex-direction: column;\n        }\n        .profile-item {\n            margin-bottom: 10px;\n        }\n\n        <span style=\"color: green;\">\/* Mobil cihazlar i\u00e7in stil - ekran geni\u015fli\u011fi 768px veya daha az oldu\u011funda *\/<\/span>\n        @media (max-width: 768px) {\n            .profile-container {\n                max-width: 90%;\n                padding: 10px;\n            }\n            .profile-info {\n                flex-direction: column; <span style=\"color: green;\">\/* Mobil'de dikey s\u0131ralama *\/<\/span>\n            }\n            .profile-item {\n                font-size: 0.9em;\n            }\n        }\n\n        <span style=\"color: green;\">\/* Masa\u00fcst\u00fc cihazlar i\u00e7in stil - ekran geni\u015fli\u011fi 769px veya daha fazla oldu\u011funda *\/<\/span>\n        @media (min-width: 769px) {\n            .profile-info {\n                flex-direction: row; <span style=\"color: green;\">\/* Masa\u00fcst\u00fcnde yatay s\u0131ralama *\/<\/span>\n                justify-content: space-between;\n            }\n            .profile-item {\n                flex: 1;\n                margin-right: 20px;\n            }\n            .profile-item:last-child {\n                margin-right: 0;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"profile-container\">\n        <h2>Kullan\u0131c\u0131 Profili<\/h2>\n        <div class=\"profile-info\">\n            <div class=\"profile-item\"><strong>Ad:<\/strong> John<\/div>\n            <div class=\"profile-item\"><strong>Soyad:<\/strong> Doe<\/div>\n            <div class=\"profile-item\"><strong>E-posta:<\/strong> john.doe@example.com<\/div>\n        <\/div>\n    <\/div>\n<\/body>\n<\/html>\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, bir frontend'in profil verilerini nas\u0131l al\u0131p farkl\u0131 ekran boyutlar\u0131na g\u00f6re d\u00fczenleyebilece\u011fini g\u00f6sterir. Backend geli\u015ftiricisi olarak, API'nizin bu t\u00fcr esnek frontend tasar\u0131mlar\u0131n\u0131 destekleyecek \u015fekilde tasarlanm\u0131\u015f olmas\u0131 \u00f6nemlidir. Unutmay\u0131n, API sadece bir k\u00f6pr\u00fcd\u00fcr; bu k\u00f6pr\u00fcn\u00fcn sa\u011flam ve verimli olmas\u0131, iki taraf aras\u0131ndaki ileti\u015fimin kalitesini do\u011frudan belirler. Mobil \u00f6ncelikli d\u00fc\u015f\u00fcnmek, API'nizin daha geni\u015f bir kitleye ula\u015fmas\u0131n\u0131 ve daha iyi bir kullan\u0131c\u0131 deneyimi sunmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makale boyunca, HNG backend staj\u0131n\u0131n Stage-0 a\u015famas\u0131 i\u00e7in Spring Boot kullanarak basit ama i\u015flevsel bir \"profil\" mikroservisini nas\u0131l geli\u015ftirece\u011fimizi ad\u0131m ad\u0131m ele ald\u0131k. Mikroservis mimarisinin temel avantajlar\u0131n\u0131 ve Spring Boot'un bu mimariyi ne kadar kolayla\u015ft\u0131rd\u0131\u011f\u0131n\u0131 ke\u015ffettik. Projemizi Spring Initializr ile olu\u015fturmaktan, temel veri modelini (<code>Profile<\/code> entity) tan\u0131mlamaya, Spring Data JPA ile veritaban\u0131 etkile\u015fimini y\u00f6netmeye (<code>ProfileRepository<\/code>) ve son olarak bu i\u015flemleri bir REST API \u00fczerinden sunmaya (<code>ProfileService<\/code>, <code>ProfileController<\/code>) kadar her ad\u0131m\u0131 ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceledik. Ayr\u0131ca, geli\u015ftirilen API'nin nas\u0131l test edilece\u011fine dair pratik bilgiler payla\u015ft\u0131k, <code>curl<\/code> komutlar\u0131yla \u00f6rnekler verdik. G\u00fcvenlik ve performans gibi ileri d\u00fczey konulara de\u011finerek, basit bir mikroservis geli\u015ftirmenin \u00f6tesinde, sa\u011flam ve \u00f6l\u00e7eklenebilir uygulamalar i\u00e7in temel prensipleri anlama f\u0131rsat\u0131 bulduk. Mobil uyumluluk ve API tasar\u0131m\u0131n\u0131n frontend ile olan etkile\u015fimini vurgulayarak, backend geli\u015ftiricilerinin geni\u015f resme nas\u0131l bakmas\u0131 gerekti\u011fini g\u00f6sterdik. Bu yolculuk, HNG backend staj\u0131n\u0131z i\u00e7in yaln\u0131zca bir ba\u015flang\u0131\u00e7 noktas\u0131 de\u011fil, ayn\u0131 zamanda modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131na dair kapsaml\u0131 bir bak\u0131\u015f a\u00e7\u0131s\u0131 sunmaktad\u0131r.<\/p>\n<p>\u00d6n\u00fcm\u00fczdeki ad\u0131mlar, bu temel profil mikroservisini daha da geli\u015ftirmek ve daha karma\u015f\u0131k mikroservis mimarilerine entegre etmektir. \u00d6rne\u011fin, Docker kullanarak servisinizi konteynerle\u015ftirebilir, Kubernetes ile da\u011f\u0131t\u0131m\u0131n\u0131 y\u00f6netebilir veya API Gateway kullanarak birden fazla mikroservisi tek bir giri\u015f noktas\u0131ndan y\u00f6netebilirsiniz. Bu s\u00fcre\u00e7, sadece kod yazmakla kalmay\u0131p, ayn\u0131 zamanda sistem tasar\u0131m\u0131, da\u011f\u0131t\u0131m ve operasyonel m\u00fckemmellik konular\u0131nda da becerilerinizi geli\u015ftirmenizi sa\u011flayacakt\u0131r. Unutmay\u0131n, her b\u00fcy\u00fck sistem, temel yap\u0131 ta\u015flar\u0131n\u0131n sa\u011flaml\u0131\u011f\u0131 \u00fczerine kuruludur ve bu \"tiny\" profil mikroservisi, sizin i\u00e7in bu sa\u011flam temeli olu\u015fturmu\u015ftur. Art\u0131k elinizde, \u00f6\u011frendi\u011finiz bilgileri pratik projelere d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in g\u00fc\u00e7l\u00fc bir ara\u00e7 seti var.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n        <strong>S1: Mikroservis geli\u015ftirirken en \u00e7ok dikkat etmemiz gereken nedir?<\/strong><br \/>\n        <strong>C1:<\/strong> Mikroservis geli\u015ftirirken en \u00e7ok dikkat etmeniz gerekenler aras\u0131nda servisler aras\u0131 ba\u011f\u0131ms\u0131zl\u0131k, tekil sorumluluk ilkesi, g\u00fc\u00e7l\u00fc API s\u00f6zle\u015fmeleri, uygun hata y\u00f6netimi ve da\u011f\u0131t\u0131k sistemlerin getirdi\u011fi karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netme (loglama, izleme, hata ay\u0131klama) yer al\u0131r. Ayr\u0131ca, veri tutarl\u0131l\u0131\u011f\u0131 ve servisler aras\u0131 ileti\u015fim desenleri de \u00f6nemlidir.\n    <\/li>\n<li>\n        <strong>S2: HNG Stage-0 i\u00e7in hangi teknolojileri bilmeliyim?<\/strong><br \/>\n        <strong>C2:<\/strong> HNG Stage-0 genellikle temel backend geli\u015ftirme becerilerini \u00f6l\u00e7er. Bu ba\u011flamda, Java (veya tercih edilen ba\u015fka bir dil), Spring Boot, REST API prensipleri, basit veritaban\u0131 bilgisi (SQL, JPA), git versiyon kontrol sistemi ve Postman\/curl gibi API test ara\u00e7lar\u0131 hakk\u0131nda temel bilgiye sahip olman\u0131z beklenir.\n    <\/li>\n<li>\n        <strong>S3: Spring Boot'ta performans sorunlar\u0131n\u0131 nas\u0131l gideririm?<\/strong><br \/>\n        <strong>C3:<\/strong> Performans sorunlar\u0131n\u0131 gidermek i\u00e7in \u00f6ncelikle Spring Boot Actuator ile uygulama metriklerini izleyin. Daha sonra, veritaban\u0131 sorgular\u0131n\u0131z\u0131 optimize edin, uygun indeksler kullan\u0131n, \u00f6nbellekleme (caching) stratejileri uygulay\u0131n, asenkron i\u015flemleri de\u011ferlendirin ve gereksiz ba\u011f\u0131ml\u0131l\u0131klar\u0131 veya a\u015f\u0131r\u0131 kaynak t\u00fcketen kodlar\u0131 tespit edip iyile\u015ftirin.\n    <\/li>\n<li>\n        <strong>S4: Profil mikroservisini daha b\u00fcy\u00fck bir sisteme nas\u0131l entegre ederim?<\/strong><br \/>\n        <strong>C4:<\/strong> Profil mikroservisini daha b\u00fcy\u00fck bir sisteme entegre etmek i\u00e7in bir API Gateway kullanabilirsiniz. Bu, t\u00fcm istemci istekleri i\u00e7in tek bir giri\u015f noktas\u0131 sa\u011flar ve servis ke\u015ffi, y\u00fck dengeleme, kimlik do\u011frulama gibi g\u00f6revleri merkezi olarak y\u00f6netir. Ayr\u0131ca, di\u011fer mikroservislerle ileti\u015fim i\u00e7in mesaj kuyruklar\u0131 (\u00f6rne\u011fin RabbitMQ, Kafka) veya do\u011frudan HTTP\/gRPC \u00e7a\u011fr\u0131lar\u0131 kullan\u0131labilir.\n    <\/li>\n<li>\n        <strong>S5: Veritaban\u0131 olarak H2 yerine ne kullanmal\u0131y\u0131m?<\/strong><br \/>\n        <strong>C5:<\/strong> H2, geli\u015ftirme ve test ortamlar\u0131 i\u00e7in harika bir bellek i\u00e7i veritaban\u0131d\u0131r. \u00dcretim ortamlar\u0131nda ise genellikle daha dayan\u0131kl\u0131 ve \u00f6l\u00e7eklenebilir veritabanlar\u0131 tercih edilir. Bunlar aras\u0131nda PostgreSQL, MySQL, Oracle veya MongoDB gibi NoSQL veritabanlar\u0131 (kullan\u0131m senaryosuna g\u00f6re) yer al\u0131r. Bu veritabanlar\u0131, veri kal\u0131c\u0131l\u0131\u011f\u0131, yedekleme, replikasyon ve daha y\u00fcksek performans sunar.\n    <\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"A tiny Spring Boot &#8216;profile&#8217; microservice \u2014 Stage\u20110 HNG backend Modern uygulama geli\u015ftirmenin h\u0131zla de\u011fi\u015fen d\u00fcnyas\u0131nda, monolitik yap\u0131lardan&hellip;","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-32529","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>Mikroservisler ve Spring Boot: Temel Kavramlar Nelerdir?<\/title>\n<meta name=\"description\" content=\"Modern uygulama geli\u015ftirmenin h\u0131zla de\u011fi\u015fen d\u00fcnyas\u0131nda, monolitik yap\u0131lardan mikroservis mimarilerine ge\u00e7i\u015f, geli\u015ftiricilere b\u00fcy\u00fck esneklik ve \u00f6l\u00e7eklenebilirlik sunmaktad\u0131r. Peki, bu karma\u015f\u0131k g\u00f6r\u00fcnen d\u00fcnyay\u0131 en basit haliyle nas\u0131l ke\u015ffedebiliriz? \u00d6zellikle HNG backend staj\u0131n\u0131n Stage-0 a\u015famas\u0131nda bir &quot;profil&quot; mikroservisi olu\u015fturmak, bu yolculu\u011fa ba\u015flamak i\u00e7in m\u00fckemmel bir f\u0131rsatt\u0131r. Bu makalede, Spring Boot kullanarak minik bir profil mikroservisini ad\u0131m ad\u0131m nas\u0131l geli\u015ftirece\u011finizi, temel kavramlardan ileri d\u00fczey ipu\u00e7lar\u0131na kadar her \u015feyi kapsayarak \u00f6\u011freneceksiniz. B\u00f6ylece hem modern backend mimarilerini anlayacak hem de pratik bir proje geli\u015ftirme deneyimi kazanacaks\u0131n\u0131z.\" \/>\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\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mikroservisler ve Spring Boot: Temel Kavramlar Nelerdir?\" \/>\n<meta property=\"og:description\" content=\"Modern uygulama geli\u015ftirmenin h\u0131zla de\u011fi\u015fen d\u00fcnyas\u0131nda, monolitik yap\u0131lardan mikroservis mimarilerine ge\u00e7i\u015f, geli\u015ftiricilere b\u00fcy\u00fck esneklik ve \u00f6l\u00e7eklenebilirlik sunmaktad\u0131r. Peki, bu karma\u015f\u0131k g\u00f6r\u00fcnen d\u00fcnyay\u0131 en basit haliyle nas\u0131l ke\u015ffedebiliriz? \u00d6zellikle HNG backend staj\u0131n\u0131n Stage-0 a\u015famas\u0131nda bir &quot;profil&quot; mikroservisi olu\u015fturmak, bu yolculu\u011fa ba\u015flamak i\u00e7in m\u00fckemmel bir f\u0131rsatt\u0131r. Bu makalede, Spring Boot kullanarak minik bir profil mikroservisini ad\u0131m ad\u0131m nas\u0131l geli\u015ftirece\u011finizi, temel kavramlardan ileri d\u00fczey ipu\u00e7lar\u0131na kadar her \u015feyi kapsayarak \u00f6\u011freneceksiniz. B\u00f6ylece hem modern backend mimarilerini anlayacak hem de pratik bir proje geli\u015ftirme deneyimi kazanacaks\u0131n\u0131z.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-22T20:01:45+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=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Mikroservisler ve Spring Boot: Temel Kavramlar Nelerdir?\",\"datePublished\":\"2025-10-22T20:01:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/\"},\"wordCount\":4403,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/\",\"name\":\"Mikroservisler ve Spring Boot: Temel Kavramlar Nelerdir?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-22T20:01:45+00:00\",\"description\":\"Modern uygulama geli\u015ftirmenin h\u0131zla de\u011fi\u015fen d\u00fcnyas\u0131nda, monolitik yap\u0131lardan mikroservis mimarilerine ge\u00e7i\u015f, geli\u015ftiricilere b\u00fcy\u00fck esneklik ve \u00f6l\u00e7eklenebilirlik sunmaktad\u0131r. Peki, bu karma\u015f\u0131k g\u00f6r\u00fcnen d\u00fcnyay\u0131 en basit haliyle nas\u0131l ke\u015ffedebiliriz? \u00d6zellikle HNG backend staj\u0131n\u0131n Stage-0 a\u015famas\u0131nda bir \\\"profil\\\" mikroservisi olu\u015fturmak, bu yolculu\u011fa ba\u015flamak i\u00e7in m\u00fckemmel bir f\u0131rsatt\u0131r. Bu makalede, Spring Boot kullanarak minik bir profil mikroservisini ad\u0131m ad\u0131m nas\u0131l geli\u015ftirece\u011finizi, temel kavramlardan ileri d\u00fczey ipu\u00e7lar\u0131na kadar her \u015feyi kapsayarak \u00f6\u011freneceksiniz. B\u00f6ylece hem modern backend mimarilerini anlayacak hem de pratik bir proje geli\u015ftirme deneyimi kazanacaks\u0131n\u0131z.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mikroservisler ve Spring Boot: Temel Kavramlar Nelerdir?\"}]},{\"@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":"Mikroservisler ve Spring Boot: Temel Kavramlar Nelerdir?","description":"Modern uygulama geli\u015ftirmenin h\u0131zla de\u011fi\u015fen d\u00fcnyas\u0131nda, monolitik yap\u0131lardan mikroservis mimarilerine ge\u00e7i\u015f, geli\u015ftiricilere b\u00fcy\u00fck esneklik ve \u00f6l\u00e7eklenebilirlik sunmaktad\u0131r. Peki, bu karma\u015f\u0131k g\u00f6r\u00fcnen d\u00fcnyay\u0131 en basit haliyle nas\u0131l ke\u015ffedebiliriz? \u00d6zellikle HNG backend staj\u0131n\u0131n Stage-0 a\u015famas\u0131nda bir \"profil\" mikroservisi olu\u015fturmak, bu yolculu\u011fa ba\u015flamak i\u00e7in m\u00fckemmel bir f\u0131rsatt\u0131r. Bu makalede, Spring Boot kullanarak minik bir profil mikroservisini ad\u0131m ad\u0131m nas\u0131l geli\u015ftirece\u011finizi, temel kavramlardan ileri d\u00fczey ipu\u00e7lar\u0131na kadar her \u015feyi kapsayarak \u00f6\u011freneceksiniz. B\u00f6ylece hem modern backend mimarilerini anlayacak hem de pratik bir proje geli\u015ftirme deneyimi kazanacaks\u0131n\u0131z.","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\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/","og_locale":"tr_TR","og_type":"article","og_title":"Mikroservisler ve Spring Boot: Temel Kavramlar Nelerdir?","og_description":"Modern uygulama geli\u015ftirmenin h\u0131zla de\u011fi\u015fen d\u00fcnyas\u0131nda, monolitik yap\u0131lardan mikroservis mimarilerine ge\u00e7i\u015f, geli\u015ftiricilere b\u00fcy\u00fck esneklik ve \u00f6l\u00e7eklenebilirlik sunmaktad\u0131r. Peki, bu karma\u015f\u0131k g\u00f6r\u00fcnen d\u00fcnyay\u0131 en basit haliyle nas\u0131l ke\u015ffedebiliriz? \u00d6zellikle HNG backend staj\u0131n\u0131n Stage-0 a\u015famas\u0131nda bir \"profil\" mikroservisi olu\u015fturmak, bu yolculu\u011fa ba\u015flamak i\u00e7in m\u00fckemmel bir f\u0131rsatt\u0131r. Bu makalede, Spring Boot kullanarak minik bir profil mikroservisini ad\u0131m ad\u0131m nas\u0131l geli\u015ftirece\u011finizi, temel kavramlardan ileri d\u00fczey ipu\u00e7lar\u0131na kadar her \u015feyi kapsayarak \u00f6\u011freneceksiniz. B\u00f6ylece hem modern backend mimarilerini anlayacak hem de pratik bir proje geli\u015ftirme deneyimi kazanacaks\u0131n\u0131z.","og_url":"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-22T20:01:45+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Mikroservisler ve Spring Boot: Temel Kavramlar Nelerdir?","datePublished":"2025-10-22T20:01:45+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/"},"wordCount":4403,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/","url":"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/","name":"Mikroservisler ve Spring Boot: Temel Kavramlar Nelerdir?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-22T20:01:45+00:00","description":"Modern uygulama geli\u015ftirmenin h\u0131zla de\u011fi\u015fen d\u00fcnyas\u0131nda, monolitik yap\u0131lardan mikroservis mimarilerine ge\u00e7i\u015f, geli\u015ftiricilere b\u00fcy\u00fck esneklik ve \u00f6l\u00e7eklenebilirlik sunmaktad\u0131r. Peki, bu karma\u015f\u0131k g\u00f6r\u00fcnen d\u00fcnyay\u0131 en basit haliyle nas\u0131l ke\u015ffedebiliriz? \u00d6zellikle HNG backend staj\u0131n\u0131n Stage-0 a\u015famas\u0131nda bir \"profil\" mikroservisi olu\u015fturmak, bu yolculu\u011fa ba\u015flamak i\u00e7in m\u00fckemmel bir f\u0131rsatt\u0131r. Bu makalede, Spring Boot kullanarak minik bir profil mikroservisini ad\u0131m ad\u0131m nas\u0131l geli\u015ftirece\u011finizi, temel kavramlardan ileri d\u00fczey ipu\u00e7lar\u0131na kadar her \u015feyi kapsayarak \u00f6\u011freneceksiniz. B\u00f6ylece hem modern backend mimarilerini anlayacak hem de pratik bir proje geli\u015ftirme deneyimi kazanacaks\u0131n\u0131z.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mikroservisler-ve-spring-boot-temel-kavramlar-nelerdir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Mikroservisler ve Spring Boot: Temel Kavramlar Nelerdir?"}]},{"@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\/32529","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=32529"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32529\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32529"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32529"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32529"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}