{"id":32957,"date":"2025-10-27T21:32:11","date_gmt":"2025-10-27T18:32:11","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/"},"modified":"2025-10-27T21:32:11","modified_gmt":"2025-10-27T18:32:11","slug":"flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/","title":{"rendered":"Flutter ve Serverpod: Sunucu Kurulumu ve \u0130lk Ad\u0131mlar"},"content":{"rendered":"<p><body><\/p>\n<p>Full-stack mobil geli\u015ftirme s\u00fcrecinde h\u0131z ve verimlilik arayanlar i\u00e7in Flutter ve Serverpod ideal bir ikili. Bu makalede Serverpod kurulumu ve ilk proje ad\u0131mlar\u0131n\u0131 \u00f6\u011frenerek g\u00fc\u00e7l\u00fc bir backend olu\u015fturacaks\u0131n\u0131z.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda mobil uygulamalar hayat\u0131m\u0131z\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 haline geldi. Kullan\u0131c\u0131lar, h\u0131zl\u0131, ak\u0131c\u0131 ve g\u00fcvenilir deneyimler beklerken, geli\u015ftiriciler de bu beklentileri kar\u015f\u0131layacak modern ara\u00e7lara ihtiya\u00e7 duyuyor. Full-stack mobil geli\u015ftirme, hem kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc (frontend) hem de sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 (backend) kapsayan karma\u015f\u0131k bir s\u00fcre\u00e7tir. Geleneksel yakla\u015f\u0131mlar genellikle farkl\u0131 teknolojilerin bir araya getirilmesini gerektirir, bu da geli\u015ftirme s\u00fcresini uzatabilir ve entegrasyon zorluklar\u0131 yaratabilir. Peki, bu s\u00fcreci nas\u0131l daha verimli, daha h\u0131zl\u0131 ve daha keyifli hale getirebiliriz?<\/p>\n<p>\u0130\u015fte tam bu noktada, Flutter ve Serverpod ikilisi devreye giriyor. Flutter, Google taraf\u0131ndan geli\u015ftirilen, tek bir kod taban\u0131yla iOS, Android, Web ve masa\u00fcst\u00fc platformlar\u0131nda \u00e7al\u0131\u015fan uygulamalar olu\u015fturman\u0131z\u0131 sa\u011flayan pop\u00fcler bir UI \u00e7er\u00e7evesidir. Serverpod ise, Flutter uygulamalar\u0131 i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015f, tip g\u00fcvenli bir a\u00e7\u0131k kaynakl\u0131 backend \u00e7er\u00e7evesidir. Dart dilini kullanarak hem frontend hem de backend geli\u015ftirebilme yetene\u011fi sunarak, tam anlam\u0131yla &#8220;full-stack Dart&#8221; deneyimi sa\u011flar. Bu g\u00fc\u00e7l\u00fc kombinasyon, geli\u015ftirme s\u00fcrecini basitle\u015ftirir, hatalar\u0131 azalt\u0131r ve genel uygulama performans\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<p>Bu makalede, Serverpod&#8217;un ne oldu\u011funu, neden bu kadar \u00f6nemli oldu\u011funu ve geli\u015ftirme ortam\u0131n\u0131z\u0131 nas\u0131l haz\u0131rlayaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Ard\u0131ndan, Serverpod&#8217;u nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, ilk projenizi nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ve Flutter uygulaman\u0131zla nas\u0131l entegre edece\u011finizi pratik \u00f6rneklerle g\u00f6sterece\u011fiz. Amac\u0131m\u0131z, s\u0131f\u0131rdan ba\u015flayan bir geli\u015ftiricinin bile Serverpod ile full-stack mobil geli\u015ftirme d\u00fcnyas\u0131na kolayca ad\u0131m atmas\u0131n\u0131 sa\u011flamakt\u0131r. Haz\u0131rsan\u0131z, Serverpod ile modern ve performansl\u0131 bir backend kurman\u0131n detaylar\u0131na dalal\u0131m!<\/p>\n<p>Serverpod, Flutter uygulamalar\u0131yla sorunsuz bir \u015fekilde entegre olmak \u00fczere \u00f6zel olarak tasarlanm\u0131\u015f, a\u00e7\u0131k kaynakl\u0131 bir backend \u00e7er\u00e7evesidir. Peki, piyasada bu kadar \u00e7ok backend \u00e7\u00f6z\u00fcm\u00fc varken neden Serverpod&#8217;u tercih etmelisiniz? Cevap olduk\u00e7a basit: Dart tabanl\u0131 olmas\u0131, tip g\u00fcvenli\u011fi, y\u00fcksek performans ve geli\u015ftirme h\u0131z\u0131n\u0131 \u00f6n planda tutan bir mimari sunmas\u0131d\u0131r. Geleneksel full-stack geli\u015ftirme s\u00fcre\u00e7lerinde, genellikle frontend i\u00e7in JavaScript\/TypeScript tabanl\u0131 bir \u00e7er\u00e7eve (React, Vue, Angular) ve backend i\u00e7in farkl\u0131 bir dil (Node.js, Python, Go, Java) kullan\u0131l\u0131r. Bu durum, iki farkl\u0131 dil \u00f6\u011frenmeyi, iki farkl\u0131 ekosistemi y\u00f6netmeyi ve aralar\u0131ndaki ileti\u015fimi sa\u011flamak i\u00e7in karma\u015f\u0131k API s\u00f6zle\u015fmeleri olu\u015fturmay\u0131 gerektirir. Serverpod bu karma\u015f\u0131kl\u0131\u011f\u0131 ortadan kald\u0131r\u0131r.<\/p>\n<p>Serverpod&#8217;un temel amac\u0131, backend ve frontend aras\u0131ndaki s\u00fcrt\u00fcnmeyi en aza indirmektir. Dart dilini kullanarak hem Flutter uygulaman\u0131z\u0131 hem de Serverpod backend&#8217;inizi yazabilirsiniz. Bu &#8220;full-stack Dart&#8221; yakla\u015f\u0131m\u0131, kod taban\u0131nda tutarl\u0131l\u0131k sa\u011flar, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve hatalar\u0131n \u00f6n\u00fcne ge\u00e7meye yard\u0131mc\u0131 olur. \u00d6rne\u011fin, frontend&#8217;de bir veri modelini de\u011fi\u015ftirdi\u011finizde, Serverpod otomatik olarak backend taraf\u0131ndaki ilgili kodu g\u00fcncelleyebilir. Bu tip g\u00fcvenli jenerasyon mekanizmas\u0131, geleneksel REST API&#8217;lerde s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan veri uyumsuzlu\u011fu sorunlar\u0131n\u0131 ortadan kald\u0131r\u0131r. B\u00f6ylece, geli\u015ftiriciler veritaban\u0131 \u015femas\u0131ndan API endpoint&#8217;lerine ve istemci taraf\u0131ndaki veri modellerine kadar t\u00fcm katmanlarda tutarl\u0131 bir geli\u015ftirme deneyimi ya\u015far.<\/p>\n<p>Serverpod ayr\u0131ca, yerle\u015fik olarak WebSocket deste\u011fi, dosya y\u00fckleme, kimlik do\u011frulama, g\u00f6r\u00fcnt\u00fc i\u015fleme ve hatta bir ORM (Object-Relational Mapping) ile birlikte gelir. Bu \u00f6zellikler, bir uygulaman\u0131n backend ihtiya\u00e7lar\u0131n\u0131n b\u00fcy\u00fck bir k\u0131sm\u0131n\u0131 tek bir \u00e7er\u00e7eve i\u00e7inde kar\u015f\u0131layarak, geli\u015ftiricilerin farkl\u0131 k\u00fct\u00fcphaneler ve servisler aras\u0131nda ge\u00e7i\u015f yapma ihtiyac\u0131n\u0131 azalt\u0131r. Performans a\u00e7\u0131s\u0131ndan bak\u0131ld\u0131\u011f\u0131nda, Serverpod C++&#8217;a derlenen ve bu sayede olduk\u00e7a h\u0131zl\u0131 \u00e7al\u0131\u015fan DartVM \u00fczerinde \u00e7al\u0131\u015f\u0131r. Bu, \u00f6zellikle ger\u00e7ek zamanl\u0131 uygulamalar ve y\u00fcksek trafikli servisler i\u00e7in \u00f6nemli bir avantaj sa\u011flar. Ayr\u0131ca, Serverpod&#8217;un \u00f6l\u00e7eklenebilirlik yetenekleri, uygulaman\u0131z\u0131n b\u00fcy\u00fcd\u00fck\u00e7e performans\u0131n\u0131 koruyabilmesini sa\u011flar.<\/p>\n<p>\u00d6zetle, Serverpod, modern mobil uygulama geli\u015ftiricileri i\u00e7in tasarlanm\u0131\u015f bir g\u00fc\u00e7 merkezidir. Geli\u015ftirme s\u00fcrecini basitle\u015ftirir, h\u0131zland\u0131r\u0131r ve tip g\u00fcvenli\u011fi sayesinde daha az hataya yol a\u00e7ar. Flutter ile m\u00fckemmel bir uyum i\u00e7inde \u00e7al\u0131\u015farak, geli\u015ftiricilerin tek bir dil ve ekosistemde tam te\u015fekk\u00fcll\u00fc, performansl\u0131 ve \u00f6l\u00e7eklenebilir full-stack uygulamalar olu\u015fturmas\u0131na olanak tan\u0131r. Bu sayede, geli\u015ftiriciler backend entegrasyonuyla bo\u011fu\u015fmak yerine, kullan\u0131c\u0131 deneyimine ve i\u015f mant\u0131\u011f\u0131na odaklanabilirler. Gelin, bu g\u00fc\u00e7l\u00fc arac\u0131 yak\u0131ndan inceleyelim ve kurulum s\u00fcrecine ba\u015flayal\u0131m.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Serverpod&#8217;un Dart tabanl\u0131 olmas\u0131, ekibinizde Dart\/Flutter bilgisi olan geli\u015ftiriciler i\u00e7in \u00f6\u011frenme e\u011frisini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Yeni bir backend dili \u00f6\u011frenme ihtiyac\u0131n\u0131 ortadan kald\u0131rarak projenin ba\u015flang\u0131\u00e7 h\u0131z\u0131n\u0131 art\u0131rabilirsiniz.\n    <\/div>\n<h2>Geli\u015ftirme Ortam\u0131 Nas\u0131l Haz\u0131rlan\u0131r: Serverpod Kurulumunun \u00d6n Ko\u015fullar\u0131 Nelerdir?<\/h2>\n<p>Serverpod ile \u00e7al\u0131\u015fmaya ba\u015flamadan \u00f6nce, sisteminizde belirli ara\u00e7lar\u0131n kurulu oldu\u011fundan emin olman\u0131z gerekir. Bu \u00f6n ko\u015fullar, Serverpod projenizi ba\u015far\u0131yla olu\u015fturman\u0131z, \u00e7al\u0131\u015ft\u0131rman\u0131z ve y\u00f6netmeniz i\u00e7in hayati \u00f6neme sahiptir. Endi\u015felenmeyin, bu ad\u0131mlar genellikle basit ve takip etmesi kolayd\u0131r. Gelin, ad\u0131m ad\u0131m hangi ara\u00e7lara ihtiyac\u0131m\u0131z oldu\u011funu ve bunlar\u0131 nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 inceleyelim.<\/p>\n<h3>Dart SDK ve Flutter SDK Kurulumu<\/h3>\n<p>Serverpod ve Flutter, Dart dilini kulland\u0131\u011f\u0131 i\u00e7in, sisteminizde Dart SDK&#8217;n\u0131n ve Flutter SDK&#8217;n\u0131n kurulu ve do\u011fru \u015fekilde yap\u0131land\u0131r\u0131lm\u0131\u015f olmas\u0131 \u015fartt\u0131r. Flutter SDK, Dart SDK&#8217;y\u0131 kendi i\u00e7inde bar\u0131nd\u0131rd\u0131\u011f\u0131 i\u00e7in genellikle sadece Flutter SDK&#8217;y\u0131 kurmak yeterli olacakt\u0131r. E\u011fer hen\u00fcz kurulu de\u011filse, <a href=\"https:\/\/flutter.dev\/docs\/get-started\/install\" target=\"_blank\">Flutter resmi web sitesindeki kurulum talimatlar\u0131n\u0131<\/a> takip etmelisiniz. Kurulumdan sonra, terminalinizde a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak her \u015feyin yolunda olup olmad\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz:<\/p>\n<pre><code>\nflutter doctor\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, eksik ba\u011f\u0131ml\u0131l\u0131klar\u0131 veya yap\u0131land\u0131rma sorunlar\u0131n\u0131 size bildirecektir. Gerekli t\u00fcm tik i\u015faretlerini g\u00f6rene kadar \u00f6nerilen d\u00fczeltmeleri uygulad\u0131\u011f\u0131n\u0131zdan emin olun. <code>flutter doctor<\/code> komutunun \u00e7\u0131kt\u0131s\u0131, iOS, Android, Web geli\u015ftirme i\u00e7in gerekli bile\u015fenlerin yan\u0131 s\u0131ra Dart SDK's\u0131n\u0131n da durumunu g\u00f6sterecektir.<\/p>\n<h3>Docker Kurulumu<\/h3>\n<p>Serverpod, varsay\u0131lan olarak veritaban\u0131 (PostgreSQL) ve Redis gibi arka plan servislerini Docker konteynerleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netir. Bu, geli\u015ftirme ortam\u0131n\u0131z\u0131 h\u0131zl\u0131 ve tutarl\u0131 bir \u015fekilde kurman\u0131za olanak tan\u0131r. E\u011fer Docker sisteminizde kurulu de\u011filse, <a href=\"https:\/\/docs.docker.com\/get-docker\/\" target=\"_blank\">Docker resmi web sitesinden<\/a> i\u015fletim sisteminize uygun s\u00fcr\u00fcm\u00fc indirip kurman\u0131z gerekmektedir. Docker Desktop, Windows ve macOS kullan\u0131c\u0131lar\u0131 i\u00e7in en kolay se\u00e7enektir. Kurulumdan sonra, Docker'\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak i\u00e7in terminalinizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code>\ndocker --version\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, Docker s\u00fcr\u00fcm\u00fcn\u00fc g\u00f6stermelidir. Ayr\u0131ca, Docker Desktop uygulamas\u0131n\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve arka planda konteynerleri y\u00f6netmeye haz\u0131r oldu\u011fundan emin olun.<\/p>\n<h3>PostgreSQL ve Redis (\u0130ste\u011fe Ba\u011fl\u0131 ama \u00d6nerilir)<\/h3>\n<p>Serverpod'un temel kurulumu, Docker arac\u0131l\u0131\u011f\u0131yla bir PostgreSQL veritaban\u0131 ve Redis \u00f6nbellek sunucusu kurman\u0131z\u0131 sa\u011flar. Bu servisleri manuel olarak kurmak zorunda kalmazs\u0131n\u0131z, ancak Serverpod'un bunlar\u0131 kullanabilmesi i\u00e7in Docker'\u0131n do\u011fru \u015fekilde \u00e7al\u0131\u015f\u0131yor olmas\u0131 \u00f6nemlidir. Docker konteynerleri, Serverpod projenizin ilk ba\u015flat\u0131lmas\u0131nda otomatik olarak aya\u011fa kalkacakt\u0131r. Geli\u015ftirme ortam\u0131n\u0131z i\u00e7in bu iki servisin ayr\u0131 ayr\u0131 manuel kurulumuna gerek yoktur, Serverpod sizin i\u00e7in halledecektir.<\/p>\n<h3>Geli\u015ftirme Ortam\u0131 (IDE) Se\u00e7imi<\/h3>\n<p>Flutter ve Serverpod geli\u015ftirme i\u00e7in Visual Studio Code (VS Code) veya IntelliJ IDEA gibi g\u00fc\u00e7l\u00fc bir IDE'ye ihtiyac\u0131n\u0131z olacakt\u0131r. Her iki IDE de Dart ve Flutter i\u00e7in m\u00fckemmel eklentilere sahiptir. VS Code, genellikle daha hafif ve h\u0131zl\u0131 olmas\u0131 nedeniyle tercih edilirken, IntelliJ IDEA'n\u0131n \u00fccretli Ultimate s\u00fcr\u00fcm\u00fc daha kapsaml\u0131 \u00f6zellikler sunar. Se\u00e7im sizin ki\u015fisel tercihinize ba\u011fl\u0131d\u0131r. \u0130lgili eklentileri kurdu\u011funuzdan emin olun (\u00f6rne\u011fin, VS Code i\u00e7in \"Dart\" ve \"Flutter\" eklentileri). Bu eklentiler, kod tamamlama, hata ay\u0131klama, kod bi\u00e7imlendirme ve di\u011fer bir\u00e7ok \u00fcretkenlik \u00f6zelli\u011fini sa\u011flar.<\/p>\n<p>T\u00fcm bu \u00f6n ko\u015fullar yerine getirildi\u011finde, Serverpod kurulumuna ve ilk projemizi olu\u015fturmaya haz\u0131r\u0131z. Bu haz\u0131rl\u0131k ad\u0131mlar\u0131, sorunsuz bir geli\u015ftirme deneyimi i\u00e7in temel olu\u015fturur ve Serverpod'un t\u00fcm \u00f6zelliklerinden tam olarak yararlanman\u0131z\u0131 sa\u011flar. \u015eimdi, Serverpod'u sistemimize kurma ve projemizi ba\u015flatma zaman\u0131!<\/p>\n<h2>Serverpod Kurulumu ve \u0130lk Projeyi Ba\u015flatma: Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>Geli\u015ftirme ortam\u0131m\u0131z\u0131 ba\u015far\u0131yla haz\u0131rlad\u0131\u011f\u0131m\u0131za g\u00f6re, art\u0131k Serverpod'u kurmaya ve ilk projemizi hayata ge\u00e7irmeye haz\u0131r\u0131z. Bu s\u00fcre\u00e7 olduk\u00e7a basittir ve birka\u00e7 temel komutla tamamlanabilir. Serverpod, geli\u015ftirme ak\u0131\u015f\u0131n\u0131 kolayla\u015ft\u0131rmak i\u00e7in g\u00fc\u00e7l\u00fc bir CLI (Command Line Interface) arac\u0131 sunar. Bu CLI, proje olu\u015fturmaktan veritaban\u0131 y\u00f6netimine kadar bir\u00e7ok g\u00f6revi yerine getirmemizi sa\u011flar.<\/p>\n<h3>Serverpod CLI Kurulumu<\/h3>\n<p>Serverpod'u sistemimize kurman\u0131n ilk ad\u0131m\u0131, <code>serverpod_cli<\/code> paketini k\u00fcresel olarak aktif etmektir. Bu sayede terminalinizden <code>serverpod<\/code> komutunu do\u011frudan \u00e7a\u011f\u0131rabilirsiniz. Terminalinizi a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\ndart pub global activate serverpod_cli\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>serverpod_cli<\/code> paketini indirip sisteminizde kullan\u0131labilir hale getirecektir. Kurulumun ba\u015far\u0131yla tamamland\u0131\u011f\u0131ndan emin olmak i\u00e7in a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak Serverpod CLI s\u00fcr\u00fcm\u00fcn\u00fc kontrol edebilirsiniz:<\/p>\n<pre><code>\nserverpod --version\n    <\/pre>\n<p><\/code><\/p>\n<p>E\u011fer bir s\u00fcr\u00fcm numaras\u0131 g\u00f6r\u00fcyorsan\u0131z, <code>serverpod_cli<\/code> ba\u015far\u0131yla kurulmu\u015f demektir. Herhangi bir hata al\u0131rsan\u0131z, genellikle PATH de\u011fi\u015fkeninizde bir sorun olabilir veya Dart SDK kurulumunuzu tekrar kontrol etmeniz gerekebilir.<\/p>\n<h3>Yeni Bir Serverpod Projesi Olu\u015fturma<\/h3>\n<p>CLI arac\u0131m\u0131z haz\u0131r oldu\u011funa g\u00f6re, \u015fimdi ilk Serverpod projemizi olu\u015ftural\u0131m. Yeni bir proje olu\u015fturmak i\u00e7in <code>serverpod create<\/code> komutunu kullan\u0131r\u0131z. Bu komut, Serverpod i\u00e7in gerekli t\u00fcm temel proje yap\u0131lar\u0131n\u0131 ve dosyalar\u0131n\u0131 otomatik olarak sizin i\u00e7in olu\u015fturacakt\u0131r. Terminalinizde projenizi olu\u015fturmak istedi\u011finiz dizine gidin ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\nserverpod create my_serverpod_project\n    <\/pre>\n<p><\/code><\/p>\n<p>Burada <code>my_serverpod_project<\/code>, projenizin ad\u0131d\u0131r. Kendi projeniz i\u00e7in anlaml\u0131 bir isim se\u00e7melisiniz. Bu komut \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, Serverpod \u00fc\u00e7 ana proje paketi i\u00e7eren bir dizin yap\u0131s\u0131 olu\u015fturacakt\u0131r:<\/p>\n<ul>\n<li><code>my_serverpod_project_server<\/code>: Backend mant\u0131\u011f\u0131n\u0131, API endpoint'lerini, veritaban\u0131 modellerini ve di\u011fer sunucu taraf\u0131 kodlar\u0131n\u0131 bar\u0131nd\u0131r\u0131r.<\/li>\n<li><code>my_serverpod_project_client<\/code>: Frontend uygulaman\u0131z\u0131n (Flutter) backend ile ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan tip g\u00fcvenli API istemcisini i\u00e7erir. Bu paket otomatik olarak generate edilir.<\/li>\n<li><code>my_serverpod_project_flutter<\/code>: Temel bir Flutter uygulamas\u0131 \u015fablonunu ve Serverpod client'\u0131 ile entegrasyonu bar\u0131nd\u0131r\u0131r.<\/li>\n<\/ul>\n<p>Proje olu\u015fturma i\u015flemi tamamland\u0131ktan sonra, Serverpod size bir sonraki ad\u0131mlar hakk\u0131nda bilgi verecektir. Genellikle, yeni olu\u015fturulan projenin ana dizinine ge\u00e7meniz ve gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 indirmeniz istenir.<\/p>\n<pre><code>\ncd my_serverpod_project\nflutter pub get\n    <\/pre>\n<p><\/code><\/p>\n<p><code>flutter pub get<\/code> komutu, hem Flutter uygulamas\u0131n\u0131n hem de Serverpod server ve client paketlerinin t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 indirir. Bu, projenizin t\u00fcm par\u00e7alar\u0131n\u0131n do\u011fru bir \u015fekilde \u00e7al\u0131\u015fabilmesi i\u00e7in kritik bir ad\u0131md\u0131r. Ba\u011f\u0131ml\u0131l\u0131klar indirildikten sonra, art\u0131k Serverpod projenizi \u00e7al\u0131\u015ft\u0131rmaya haz\u0131rs\u0131n\u0131z.<\/p>\n<h3>Serverpod Projesini \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p>Serverpod projesini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in, <code>my_serverpod_project_server<\/code> dizinine gidip <code>dart bin\/main.dart<\/code> komutunu kullanabiliriz. Ancak Serverpod, Docker konteynerleri arac\u0131l\u0131\u011f\u0131yla veritaban\u0131 ve di\u011fer servisleri y\u00f6netti\u011fi i\u00e7in, daha kolay bir yol sunar. <code>serverpod generate<\/code> komutu, backend kodunuzda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fiklikleri (\u00f6zellikle veritaban\u0131 modelleri ve endpoint'ler) otomatik olarak alg\u0131lar ve client kodunu g\u00fcnceller. \u0130lk \u00e7al\u0131\u015ft\u0131rma i\u00e7in ise, genellikle sadece server dizininde ba\u015flatma komutunu kullanmak yeterlidir:<\/p>\n<pre><code>\ncd my_serverpod_project\/my_serverpod_project_server\ndocker compose up --build --detach\ndart bin\/main.dart\n    <\/pre>\n<p><\/code><\/p>\n<p>\u0130lk komut, Docker konteynerlerini (PostgreSQL ve Redis) arka planda ba\u015flat\u0131r. <code>--build<\/code> konteyner imajlar\u0131n\u0131 in\u015fa eder, <code>--detach<\/code> ise konteynerleri arka planda \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flar. \u0130kinci komut ise Serverpod sunucusunu ba\u015flat\u0131r. Sunucu ba\u015far\u0131yla ba\u015flat\u0131ld\u0131\u011f\u0131nda, terminalinizde \"Serverpod listening on port 8080\" gibi bir \u00e7\u0131kt\u0131 g\u00f6rmelisiniz. Bu, backend'inizin art\u0131k istekleri dinlemeye haz\u0131r oldu\u011fu anlam\u0131na gelir.<\/p>\n<p>Bu ad\u0131mlarla, Serverpod CLI'yi kurmu\u015f, ilk projenizi olu\u015fturmu\u015f ve sunucuyu ba\u015far\u0131yla ba\u015flatm\u0131\u015f olursunuz. Art\u0131k, Flutter uygulaman\u0131z\u0131n bu backend ile nas\u0131l konu\u015faca\u011f\u0131n\u0131 ve temel API endpoint'lerini nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 ke\u015ffetmeye ge\u00e7ebiliriz.<\/p>\n<h2>\u0130lk Serverpod Projesi: Temel Bir API Nas\u0131l Olu\u015fturulur ve Test Edilir?<\/h2>\n<p>Serverpod kurulumunu tamamlad\u0131k ve ilk projemizi ba\u015far\u0131yla ba\u015flatt\u0131k. \u015eimdi s\u0131ra, Serverpod backend'imizin ger\u00e7ek bir i\u015f yapmas\u0131n\u0131 sa\u011flamakta: temel bir API endpoint'i olu\u015fturmak ve bunu test etmek. Serverpod'da API endpoint'leri, <code>lib\/src\/endpoints<\/code> klas\u00f6r\u00fcnde yer alan Dart s\u0131n\u0131flar\u0131 arac\u0131l\u0131\u011f\u0131yla tan\u0131mlan\u0131r. Bu s\u0131n\u0131flar, client taraf\u0131ndan \u00e7a\u011fr\u0131labilecek metodlar\u0131 i\u00e7erir.<\/p>\n<h3>Yeni Bir Endpoint Olu\u015fturma<\/h3>\n<p>Varsay\u0131lan olarak, Serverpod projeniz <code>lib\/src\/endpoints\/example_endpoint.dart<\/code> ad\u0131nda bir \u00f6rnek endpoint ile gelir. Bu dosyay\u0131 a\u00e7arak nas\u0131l bir yap\u0131ya sahip oldu\u011funu inceleyelim:<\/p>\n<pre><code>\n\/\/ lib\/src\/endpoints\/example_endpoint.dart\nimport 'package:serverpod\/serverpod.dart';\n\nclass ExampleEndpoint extends Endpoint {\n  Future<String> hello(Session session, String name) async {\n    return 'Merhaba, $name!';\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011fu, <code>ExampleEndpoint<\/code> ad\u0131nda bir s\u0131n\u0131f tan\u0131mlar ve bu s\u0131n\u0131f <code>Endpoint<\/code> s\u0131n\u0131f\u0131ndan t\u00fcretilir. <code>hello<\/code> metodu, client taraf\u0131ndan \u00e7a\u011fr\u0131labilecek bir API endpoint'idir. Bu metod, bir <code>Session<\/code> nesnesi (ba\u011flam bilgileri i\u00e7in) ve bir <code>name<\/code> parametresi al\u0131r ve \"Merhaba, [name]!\" \u015feklinde bir string d\u00f6nd\u00fcr\u00fcr. Bu, bir kullan\u0131c\u0131n\u0131n ad\u0131n\u0131 al\u0131p ona \u00f6zel bir kar\u015f\u0131lama mesaj\u0131 g\u00f6nderebilece\u011finiz basit bir \u00f6rnektir.<\/p>\n<p>\u015eimdi, bu endpoint'i kendimiz \u00e7al\u0131\u015f\u0131r hale getirelim. \u00d6ncelikle, sunucumuzun \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmal\u0131y\u0131z. E\u011fer Serverpod sunucunuzu kapatm\u0131\u015fsan\u0131z, <code>my_serverpod_project\/my_serverpod_project_server<\/code> dizininde a\u015fa\u011f\u0131daki komutlarla yeniden ba\u015flat\u0131n:<\/p>\n<pre><code>\ndocker compose up --detach\ndart bin\/main.dart\n    <\/pre>\n<p><\/code><\/p>\n<h3>Client Taraf\u0131ndan Endpoint \u00c7a\u011f\u0131rma<\/h3>\n<p>Serverpod'un en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biri, client kodunun otomatik olarak generate edilmesidir. Backend'inizdeki bir endpoint'i her de\u011fi\u015ftirdi\u011finizde veya yeni bir endpoint ekledi\u011finizde, <code>serverpod generate<\/code> komutunu \u00e7al\u0131\u015ft\u0131rman\u0131z gerekir. Bu komut, <code>my_serverpod_project_client<\/code> paketini g\u00fcncelleyecek ve client uygulaman\u0131z\u0131n (Flutter) backend ile tip g\u00fcvenli bir \u015fekilde ileti\u015fim kurmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<pre><code>\ncd my_serverpod_project\nserverpod generate\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, Serverpod projenizin ana dizininde (<code>my_serverpod_project<\/code>) \u00e7al\u0131\u015ft\u0131r\u0131lmal\u0131d\u0131r. Ba\u015far\u0131l\u0131 bir \u015fekilde \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, <code>my_serverpod_project_client\/lib\/src\/protocol.dart<\/code> ve <code>my_serverpod_project_client\/lib\/src\/client.dart<\/code> dosyalar\u0131 g\u00fcncellenecektir. \u015eimdi Flutter uygulamam\u0131zdan bu endpoint'i nas\u0131l \u00e7a\u011f\u0131raca\u011f\u0131m\u0131za bakal\u0131m.<\/p>\n<p><code>my_serverpod_project_flutter<\/code> dizinine gidin ve <code>lib\/main.dart<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n. Burada, varsay\u0131lan bir Flutter uygulamas\u0131 bulacaks\u0131n\u0131z. Serverpod client'\u0131n\u0131 kullanarak <code>hello<\/code> endpoint'ini \u00e7a\u011f\u0131rmak i\u00e7in baz\u0131 de\u011fi\u015fiklikler yapmam\u0131z gerekecek. <code>main.dart<\/code> dosyas\u0131n\u0131 a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim:<\/p>\n<pre><code>\n\/\/ my_serverpod_project\/my_serverpod_project_flutter\/lib\/main.dart\nimport 'package:flutter\/material.dart';\nimport 'package:my_serverpod_project_client\/my_serverpod_project_client.dart';\nimport 'package:serverpod_flutter\/serverpod_flutter.dart';\n\nvar client = Client(\n  'http:\/\/localhost:8080\/',\n)\n  ..connectivityMonitor = ServerpodConnectivityMonitor();\n\nvoid main() {\n  runApp(const MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n  const MyApp({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Flutter Demo',\n      theme: ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: const MyHomePage(title: 'Flutter Serverpod Demo'),\n    );\n  }\n}\n\nclass MyHomePage extends StatefulWidget {\n  const MyHomePage({Key? key, required this.title}) : super(key: key);\n  final String title;\n\n  @override\n  State<MyHomePage> createState() => _MyHomePageState();\n}\n\nclass _MyHomePageState extends State<MyHomePage> {\n  String _helloMessage = 'Hen\u00fcz mesaj yok';\n  final TextEditingController _nameController = TextEditingController();\n\n  void _callHelloEndpoint() async {\n    try {\n      final response = await client.example.hello(_nameController.text);\n      setState(() {\n        _helloMessage = response;\n      });\n    } catch (e) {\n      setState(() {\n        _helloMessage = 'Hata: $e';\n      });\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: Text(widget.title),\n      ),\n      body: Center(\n        child: Padding(\n          padding: const EdgeInsets.all(16.0),\n          child: Column(\n            mainAxisAlignment: MainAxisAlignment.center,\n            children: <Widget>[\n              TextField(\n                controller: _nameController,\n                decoration: const InputDecoration(\n                  labelText: 'Ad\u0131n\u0131z',\n                  border: OutlineInputBorder(),\n                ),\n              ),\n              const SizedBox(height: 20),\n              ElevatedButton(\n                onPressed: _callHelloEndpoint,\n                child: const Text('Selamla!'),\n              ),\n              const SizedBox(height: 20),\n              Text(\n                _helloMessage,\n                style: Theme.of(context).textTheme.headlineMedium,\n              ),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu kod, basit bir giri\u015f alan\u0131 ve bir buton i\u00e7eren bir Flutter uygulamas\u0131 olu\u015fturur. Butona bas\u0131ld\u0131\u011f\u0131nda, <code>_callHelloEndpoint<\/code> metodu <code>client.example.hello()<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131 yapar ve Serverpod backend'imizdeki <code>hello<\/code> endpoint'ini tetikler. Gelen cevap (<code>\"Merhaba, [ad\u0131n\u0131z]!\"<\/code>) ekranda g\u00f6sterilir. Bu \u00f6rnek, Serverpod'un tip g\u00fcvenli client-server ileti\u015fimini ne kadar kolayla\u015ft\u0131rd\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a g\u00f6stermektedir.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Geli\u015ftirme s\u0131ras\u0131nda backend kodunuzda (server dizini alt\u0131nda) herhangi bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda, client kodunun senkronize olmas\u0131 i\u00e7in <code>serverpod generate<\/code> komutunu \u00e7al\u0131\u015ft\u0131rmay\u0131 unutmay\u0131n. Aksi takdirde, Flutter uygulaman\u0131z eski client kodunu kullanmaya devam edebilir ve hatalara yol a\u00e7abilir.\n    <\/div>\n<h2>Veritaban\u0131 Entegrasyonu: PostgreSQL ile Serverpod Nas\u0131l Konu\u015fur?<\/h2>\n<p>Modern uygulamalar\u0131n \u00e7o\u011fu, verileri kal\u0131c\u0131 olarak depolamak i\u00e7in bir veritaban\u0131na ihtiya\u00e7 duyar. Serverpod, PostgreSQL ile m\u00fckemmel bir entegrasyon sunar ve bir ORM (Object-Relational Mapping) arac\u0131 arac\u0131l\u0131\u011f\u0131yla veritaban\u0131 i\u015flemlerini basitle\u015ftirir. Bu b\u00f6l\u00fcmde, Serverpod ile nas\u0131l veritaban\u0131 modelleri olu\u015fturaca\u011f\u0131m\u0131z\u0131, bu modelleri veritaban\u0131na nas\u0131l migrate edece\u011fimizi ve veritaban\u0131 i\u015flemlerini nas\u0131l ger\u00e7ekle\u015ftirece\u011fimizi inceleyece\u011fiz.<\/p>\n<h3>Veritaban\u0131 Modeli Tan\u0131mlama<\/h3>\n<p>Serverpod'da veritaban\u0131 modelleri, <code>.yaml<\/code> dosyalar\u0131 arac\u0131l\u0131\u011f\u0131yla tan\u0131mlan\u0131r. Bu dosyalar, <code>lib\/src\/models<\/code> dizini alt\u0131nda yer al\u0131r. Bir model tan\u0131mlad\u0131\u011f\u0131m\u0131zda, Serverpod CLI bu YAML tan\u0131m\u0131n\u0131 kullanarak hem veritaban\u0131 tablolar\u0131n\u0131 hem de client ve server taraf\u0131 i\u00e7in Dart model s\u0131n\u0131flar\u0131n\u0131 otomatik olarak generate eder. Bu, tip g\u00fcvenli\u011fini ve geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131ran kilit bir \u00f6zelliktir.<\/p>\n<p>Basit bir \"Todo\" listesi uygulamas\u0131 i\u00e7in bir model olu\u015ftural\u0131m. <code>my_serverpod_project_server\/lib\/src\/models\/todo.yaml<\/code> ad\u0131nda yeni bir dosya olu\u015ftural\u0131m ve i\u00e7ine a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyelim:<\/p>\n<pre><code>\n# my_serverpod_project_server\/lib\/src\/models\/todo.yaml\nclass: Todo\ntable: todos\nfields:\n  description: String\n  isCompleted: bool, default = false\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu YAML dosyas\u0131, <code>Todo<\/code> ad\u0131nda bir model ve <code>todos<\/code> ad\u0131nda bir veritaban\u0131 tablosu tan\u0131mlar. Modelimiz iki alan i\u00e7erir: <code>description<\/code> (String) ve <code>isCompleted<\/code> (bool). <code>isCompleted<\/code> alan\u0131 i\u00e7in varsay\u0131lan de\u011fer <code>false<\/code> olarak ayarlanm\u0131\u015ft\u0131r.<\/p>\n<h3>Modeli Generate Etme ve Veritaban\u0131na Migrate Etme<\/h3>\n<p>YAML dosyas\u0131n\u0131 olu\u015fturduktan sonra, Serverpod'a bu modeli i\u015flemesi i\u00e7in talimat vermemiz gerekir. Bunun i\u00e7in projenin ana dizininde <code>serverpod generate<\/code> komutunu tekrar \u00e7al\u0131\u015ft\u0131rmal\u0131y\u0131z:<\/p>\n<pre><code>\ncd my_serverpod_project\nserverpod generate\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>my_serverpod_project_server\/lib\/src\/generated<\/code> dizini alt\u0131nda <code>todo.dart<\/code> ve di\u011fer ilgili dosyalar\u0131 olu\u015fturacakt\u0131r. Ayn\u0131 zamanda client taraf\u0131 i\u00e7in de <code>my_serverpod_project_client\/lib\/src\/protocol.dart<\/code> dosyas\u0131na <code>Todo<\/code> modelini ekleyecektir. Bu otomatik jenerasyon, manuel kod yazma hatas\u0131n\u0131 ortadan kald\u0131r\u0131r.<\/p>\n<p>Model s\u0131n\u0131flar\u0131 olu\u015fturulduktan sonra, bu modeli veritaban\u0131m\u0131za uygulamam\u0131z gerekir. Serverpod, veritaban\u0131 \u015femas\u0131n\u0131 y\u00f6netmek i\u00e7in migrasyon (migration) mekanizmas\u0131n\u0131 kullan\u0131r. Sunucunuzu \u00e7al\u0131\u015ft\u0131r\u0131rken terminale geri d\u00f6n\u00fcn ve <code>serverpod create-migration<\/code> komutunu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\ncd my_serverpod_project\/my_serverpod_project_server\nserverpod create-migration\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>migrations<\/code> dizini alt\u0131nda yeni bir migrasyon dosyas\u0131 olu\u015fturacakt\u0131r. Bu dosya, <code>todos<\/code> tablosunu olu\u015fturmak i\u00e7in gerekli SQL komutlar\u0131n\u0131 i\u00e7erir. Migrasyon dosyas\u0131n\u0131 inceledikten sonra, de\u011fi\u015fiklikleri veritaban\u0131na uygulamak i\u00e7in Serverpod sunucunuzu yeniden ba\u015flatman\u0131z yeterlidir. Sunucu ba\u015flang\u0131c\u0131nda, yeni migrasyonlar\u0131 otomatik olarak alg\u0131layacak ve uygulayacakt\u0131r. E\u011fer halihaz\u0131rda \u00e7al\u0131\u015f\u0131yorsa, sunucuyu kapat\u0131p tekrar ba\u015flat\u0131n (<code>Ctrl+C<\/code> ile kapat\u0131p <code>dart bin\/main.dart<\/code> ile tekrar ba\u015flat\u0131n).<\/p>\n<h3>Veritaban\u0131 \u0130\u015flemleri (CRUD)<\/h3>\n<p>\u015eimdi bir <code>Todo<\/code> \u00f6\u011fesini veritaban\u0131na kaydetmek ve ard\u0131ndan okumak i\u00e7in bir API endpoint'i olu\u015ftural\u0131m. <code>my_serverpod_project_server\/lib\/src\/endpoints\/todo_endpoint.dart<\/code> ad\u0131nda yeni bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code>\n\/\/ my_serverpod_project_server\/lib\/src\/endpoints\/todo_endpoint.dart\nimport 'package:serverpod\/serverpod.dart';\nimport '..\/generated\/protocol.dart';\n\nclass TodoEndpoint extends Endpoint {\n  Future<void> createTodo(Session session, Todo todo) async {\n    await Todo.db.insert(session, todo);\n  }\n\n  Future<List<Todo>> getTodos(Session session) async {\n    return await Todo.db.find(session);\n  }\n\n  Future<void> updateTodo(Session session, Todo todo) async {\n    await Todo.db.update(session, todo);\n  }\n\n  Future<void> deleteTodo(Session session, int id) async {\n    await Todo.db.deleteRow(session, where: (t) => t.id.equals(id));\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu endpoint, <code>createTodo<\/code>, <code>getTodos<\/code>, <code>updateTodo<\/code> ve <code>deleteTodo<\/code> metodlar\u0131n\u0131 i\u00e7erir. Bu metodlar, Serverpod'un ORM'ini kullanarak <code>Todo<\/code> nesnelerini veritaban\u0131na ekler, sorgular, g\u00fcnceller ve siler. Dikkat ederseniz, <code>Todo.db<\/code> statik eri\u015fim noktas\u0131 \u00fczerinden t\u00fcm bu veritaban\u0131 i\u015flemlerini kolayca yapabiliyoruz.<\/p>\n<p>Bu yeni endpoint'i ekledikten sonra, client kodunun g\u00fcncellenmesi i\u00e7in tekrar ana dizinde <code>serverpod generate<\/code> komutunu \u00e7al\u0131\u015ft\u0131rmay\u0131 ve ard\u0131ndan sunucuyu yeniden ba\u015flatmay\u0131 unutmay\u0131n. Daha sonra Flutter uygulaman\u0131zdan bu endpoint'leri \u00e7a\u011f\u0131rarak bir To-Do listesi uygulamas\u0131 geli\u015ftirebilirsiniz. Bu, Serverpod'un veritaban\u0131 entegrasyonuyla full-stack geli\u015ftirmenin ne kadar ak\u0131c\u0131 hale geldi\u011finin g\u00fczel bir \u00f6rne\u011fidir.<\/p>\n<h2>Vaka Analizi: Basit Bir To-Do Uygulamas\u0131 Nas\u0131l Geli\u015ftirilir?<\/h2>\n<p>\u015eimdiye kadar Serverpod'un temel kurulumunu, API endpoint'i olu\u015fturmay\u0131 ve veritaban\u0131 ile nas\u0131l entegre olundu\u011funu \u00f6\u011frendik. Bu bilgileri kullanarak, ger\u00e7ek d\u00fcnya senaryosuna yak\u0131n, basit bir \"Yap\u0131lacaklar Listesi\" (To-Do) uygulamas\u0131 geli\u015ftirelim. Bu vaka analizi, hem Serverpod backend'inin hem de Flutter frontend'inin nas\u0131l bir araya geldi\u011fini uygulamal\u0131 olarak g\u00f6sterecektir.<\/p>\n<h3>Gereksinimler<\/h3>\n<p>Uygulamam\u0131z\u0131n temel gereksinimleri \u015funlard\u0131r:<\/p>\n<ul>\n<li>Yeni yap\u0131lacaklar ekleyebilme.<\/li>\n<li>Var olan yap\u0131lacaklar\u0131 listeleyebilme.<\/li>\n<li>Yap\u0131lacaklar\u0131n tamamlanma durumunu de\u011fi\u015ftirebilme.<\/li>\n<li>Yap\u0131lacaklar\u0131 silebilme.<\/li>\n<\/ul>\n<h3>Serverpod Backend Geli\u015ftirme<\/h3>\n<p>\u00d6nceki b\u00f6l\u00fcmde <code>Todo<\/code> modelimizi ve <code>TodoEndpoint<\/code>'imizi olu\u015fturmu\u015ftuk. Bu endpoint, <code>createTodo<\/code>, <code>getTodos<\/code>, <code>updateTodo<\/code> ve <code>deleteTodo<\/code> metodlar\u0131n\u0131 zaten i\u00e7eriyor. Bu, To-Do uygulamam\u0131z\u0131n temel backend ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamak i\u00e7in yeterli olacakt\u0131r. E\u011fer hen\u00fcz olu\u015fturmad\u0131ysan\u0131z, \u00f6nceki b\u00f6l\u00fcmdeki ad\u0131mlar\u0131 takip ederek <code>todo.yaml<\/code> modelini ve <code>todo_endpoint.dart<\/code> dosyas\u0131n\u0131 olu\u015fturup <code>serverpod generate<\/code> ve <code>serverpod create-migration<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zdan emin olun.<\/p>\n<pre><code>\n\/\/ my_serverpod_project_server\/lib\/src\/endpoints\/todo_endpoint.dart i\u00e7eri\u011fi\nimport 'package:serverpod\/serverpod.dart';\nimport '..\/generated\/protocol.dart';\n\nclass TodoEndpoint extends Endpoint {\n  Future<void> createTodo(Session session, Todo todo) async {\n    await Todo.db.insert(session, todo);\n  }\n\n  Future<List<Todo>> getTodos(Session session) async {\n    return await Todo.db.find(session, orderBy: (t) => t.id); \/\/ ID'ye g\u00f6re s\u0131rala\n  }\n\n  Future<void> updateTodo(Session session, Todo todo) async {\n    await Todo.db.update(session, todo);\n  }\n\n  Future<void> deleteTodo(Session session, int id) async {\n    await Todo.db.deleteRow(session, where: (t) => t.id.equals(id));\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Serverpod sunucunuzun \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun (<code>my_serverpod_project_server<\/code> dizininde <code>dart bin\/main.dart<\/code>).<\/p>\n<h3>Flutter Frontend Geli\u015ftirme<\/h3>\n<p>\u015eimdi <code>my_serverpod_project_flutter<\/code> dizinindeki Flutter uygulamam\u0131z\u0131 g\u00fcncelleyelim. <code>lib\/main.dart<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki kodla de\u011fi\u015ftirin. Bu kod, Serverpod client'\u0131n\u0131 kullanarak backend'deki To-Do endpoint'leri ile etkile\u015fim kuran basit bir UI olu\u015fturacakt\u0131r.<\/p>\n<pre><code>\n\/\/ my_serverpod_project_flutter\/lib\/main.dart\nimport 'package:flutter\/material.dart';\nimport 'package:my_serverpod_project_client\/my_serverpod_project_client.dart';\nimport 'package:serverpod_flutter\/serverpod_flutter.dart';\n\nvar client = Client(\n  'http:\/\/localhost:8080\/', \/\/ Sunucunuzun adresini ve portunu ayarlay\u0131n\n)\n  ..connectivityMonitor = ServerpodConnectivityMonitor();\n\nvoid main() {\n  runApp(const MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n  const MyApp({Key? key}) : super(key: key);\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Serverpod Todo App',\n      theme: ThemeData(\n        primarySwatch: Colors.blue,\n      ),\n      home: const TodoListPage(),\n    );\n  }\n}\n\nclass TodoListPage extends StatefulWidget {\n  const TodoListPage({Key? key}) : super(key: key);\n\n  @override\n  State<TodoListPage> createState() => _TodoListPageState();\n}\n\nclass _TodoListPageState extends State<TodoListPage> {\n  final TextEditingController _todoController = TextEditingController();\n  List<Todo> _todos = [];\n  bool _isLoading = true;\n\n  @override\n  void initState() {\n    super.initState();\n    _fetchTodos();\n  }\n\n  Future<void> _fetchTodos() async {\n    try {\n      setState(() { _isLoading = true; });\n      final fetchedTodos = await client.todo.getTodos();\n      setState(() {\n        _todos = fetchedTodos;\n      });\n    } catch (e) {\n      debugPrint('Error fetching todos: $e');\n    } finally {\n      setState(() { _isLoading = false; });\n    }\n  }\n\n  Future<void> _addTodo() async {\n    if (_todoController.text.isEmpty) return;\n    try {\n      final newTodo = Todo(description: _todoController.text, isCompleted: false);\n      await client.todo.createTodo(newTodo);\n      _todoController.clear();\n      await _fetchTodos(); \/\/ Listeyi g\u00fcncelle\n    } catch (e) {\n      debugPrint('Error adding todo: $e');\n    }\n  }\n\n  Future<void> _toggleTodoStatus(Todo todo) async {\n    try {\n      final updatedTodo = todo.copyWith(isCompleted: !todo.isCompleted);\n      await client.todo.updateTodo(updatedTodo);\n      await _fetchTodos(); \/\/ Listeyi g\u00fcncelle\n    } catch (e) {\n      debugPrint('Error toggling todo status: $e');\n    }\n  }\n\n  Future<void> _deleteTodo(int id) async {\n    try {\n      await client.todo.deleteTodo(id);\n      await _fetchTodos(); \/\/ Listeyi g\u00fcncelle\n    } catch (e) {\n      debugPrint('Error deleting todo: $e');\n    }\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text('Serverpod Todo App'),\n      ),\n      body: Column(\n        children: [\n          Padding(\n            padding: const EdgeInsets.all(8.0),\n            child: Row(\n              children: [\n                Expanded(\n                  child: TextField(\n                    controller: _todoController,\n                    decoration: const InputDecoration(\n                      labelText: 'Yeni g\u00f6rev ekle',\n                      border: OutlineInputBorder(),\n                    ),\n                    onSubmitted: (_) => _addTodo(),\n                  ),\n                ),\n                const SizedBox(width: 8),\n                ElevatedButton(\n                  onPressed: _addTodo,\n                  child: const Text('Ekle'),\n                ),\n              ],\n            ),\n          ),\n          _isLoading\n              ? const CircularProgressIndicator()\n              : Expanded(\n                  child: ListView.builder(\n                    itemCount: _todos.length,\n                    itemBuilder: (context, index) {\n                      final todo = _todos[index];\n                      return ListTile(\n                        title: Text(\n                          todo.description,\n                          style: TextStyle(\n                            decoration: todo.isCompleted ? TextDecoration.lineThrough : null,\n                          ),\n                        ),\n                        leading: Checkbox(\n                          value: todo.isCompleted,\n                          onChanged: (_) => _toggleTodoStatus(todo),\n                        ),\n                        trailing: IconButton(\n                          icon: const Icon(Icons.delete),\n                          onPressed: () => _deleteTodo(todo.id!),\n                        ),\n                      );\n                    },\n                  ),\n                ),\n        ],\n      ),\n    );\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<h3>Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma ve Test Etme<\/h3>\n<p>Bu kodu <code>main.dart<\/code> dosyan\u0131za yap\u0131\u015ft\u0131rd\u0131ktan sonra, Flutter uygulamas\u0131n\u0131 bir em\u00fclat\u00f6rde, fiziksel bir cihazda veya web taray\u0131c\u0131s\u0131nda \u00e7al\u0131\u015ft\u0131rabilirsiniz:<\/p>\n<pre><code>\ncd my_serverpod_project\/my_serverpod_project_flutter\nflutter run\n    <\/pre>\n<p><\/code><\/p>\n<p>Uygulama ba\u015flad\u0131\u011f\u0131nda, bir giri\u015f alan\u0131 ve ekle butonu ile kar\u015f\u0131la\u015facaks\u0131n\u0131z. Yeni g\u00f6revler ekleyebilir, checkbox'lar\u0131 i\u015faretleyerek tamamlanma durumlar\u0131n\u0131 de\u011fi\u015ftirebilir ve \u00e7\u00f6p kutusu simgelerine basarak g\u00f6revleri silebilirsiniz. T\u00fcm bu i\u015flemler, Serverpod backend'inizle etkile\u015fim kurarak ger\u00e7ekle\u015ftirilecektir. Herhangi bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda (ekleme, g\u00fcncelleme, silme), liste an\u0131nda g\u00fcncellenecektir.<\/p>\n<p>Bu basit To-Do uygulamas\u0131, Serverpod ve Flutter'\u0131n full-stack geli\u015ftirme i\u00e7in ne kadar g\u00fc\u00e7l\u00fc ve entegre bir \u00e7\u00f6z\u00fcm sundu\u011funu a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Tip g\u00fcvenli API \u00e7a\u011fr\u0131lar\u0131, otomatik veritaban\u0131 e\u015fle\u015fmeleri ve tek bir dil kullan\u0131m\u0131, geli\u015ftirme s\u00fcrecini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r ve hatalar\u0131 azalt\u0131r. Bu vaka analizi, kendi full-stack mobil uygulamalar\u0131n\u0131z\u0131 geli\u015ftirmek i\u00e7in sa\u011flam bir temel sunmaktad\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar: Serverpod ile Uygulaman\u0131z\u0131 G\u00fc\u00e7lendirin<\/h2>\n<p>Serverpod kurulumunu ve temel bir full-stack uygulaman\u0131n nas\u0131l geli\u015ftirildi\u011fini \u00f6\u011frendik. Ancak Serverpod'un sundu\u011fu imkanlar bunlarla s\u0131n\u0131rl\u0131 de\u011fil. Uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131rmak, g\u00fcvenli\u011fini sa\u011flamak ve daha karma\u015f\u0131k \u00f6zellikler eklemek i\u00e7in bilmeniz gereken baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalar bulunmaktad\u0131r. Bu b\u00f6l\u00fcmde, deneyimli geli\u015ftiricilerin Serverpod'dan daha fazla verim almas\u0131na yard\u0131mc\u0131 olacak stratejileri ele alaca\u011f\u0131z.<\/p>\n<h3>Kimlik Do\u011frulama ve G\u00fcvenlik<\/h3>\n<p>Hemen hemen her modern uygulama, kullan\u0131c\u0131 kimlik do\u011frulamas\u0131na ihtiya\u00e7 duyar. Serverpod, yerle\u015fik olarak kimlik do\u011frulama (authentication) \u00f6zelliklerini destekler. Kullan\u0131c\u0131 hesaplar\u0131 olu\u015fturma, oturum a\u00e7ma, JWT (JSON Web Token) tabanl\u0131 token y\u00f6netimi gibi konular\u0131 Serverpod'un kendi mod\u00fclleriyle kolayca halledebilirsiniz. \u00d6rne\u011fin, <code>serverpod_auth_server<\/code> ve <code>serverpod_auth_flutter<\/code> paketleri, bu s\u00fcreci basitle\u015ftirir. G\u00fcvenli API endpoint'leri olu\u015ftururken, <code>session.authenticated<\/code> veya belirli roller i\u00e7in yetkilendirme kontrolleri eklemeyi unutmay\u0131n. API endpoint'lerinizi varsay\u0131lan olarak herkese a\u00e7\u0131k b\u0131rakmak yerine, hassas verilere eri\u015fimi k\u0131s\u0131tlamak i\u00e7in kimlik do\u011frulama mekanizmalar\u0131n\u0131 aktif olarak kullanmal\u0131s\u0131n\u0131z.<\/p>\n<pre><code>\n\/\/ \u00d6rnek: Yaln\u0131zca oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131lar\u0131n eri\u015febilece\u011fi bir endpoint\nclass SecureEndpoint extends Endpoint {\n  @override\n  bool get requireAuthentication => true; \/\/ Bu endpoint i\u00e7in kimlik do\u011frulama gerekli\n\n  Future<String> getSecretData(Session session) async {\n    \/\/ session.userInfo ile oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131n\u0131n bilgilerine eri\u015filebilir\n    final userId = session.auth.userId;\n    return 'Gizli veriye eri\u015fildi, kullan\u0131c\u0131 ID: $userId';\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<h3>Performans Optimizasyonu ve \u00d6nbellekleme (Caching)<\/h3>\n<p>Y\u00fcksek performansl\u0131 uygulamalar geli\u015ftirmek i\u00e7in \u00f6nbellekleme hayati \u00f6neme sahiptir. Serverpod, Redis entegrasyonu sayesinde kolayca \u00f6nbellekleme stratejileri uygulaman\u0131za olanak tan\u0131r. S\u0131k\u00e7a eri\u015filen ancak nadiren de\u011fi\u015fen verileri Redis'te saklayarak veritaban\u0131 y\u00fck\u00fcn\u00fc azaltabilir ve yan\u0131t s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131saltabilirsiniz. Serverpod'un ORM'i ile yapaca\u011f\u0131n\u0131z sorgularda, <code>session.serverpod.redis<\/code> \u00fczerinden do\u011frudan Redis'e eri\u015febilir veya \u00f6zel \u00f6nbellekleme mant\u0131\u011f\u0131n\u0131z\u0131 uygulayabilirsiniz.<\/p>\n<h3>Hata Ay\u0131klama ve Loglama<\/h3>\n<p>Geli\u015ftirme s\u00fcrecinde hatalarla kar\u015f\u0131la\u015fmak ka\u00e7\u0131n\u0131lmazd\u0131r. Serverpod, Dart'\u0131n g\u00fc\u00e7l\u00fc hata ay\u0131klama yeteneklerinden faydalan\u0131r. VS Code veya IntelliJ IDEA gibi IDE'ler \u00fczerinden kolayca breakpoint'ler ekleyebilir ve kodunuzu ad\u0131m ad\u0131m takip edebilirsiniz. Ayr\u0131ca, Serverpod yerle\u015fik olarak loglama mekanizmalar\u0131na sahiptir. <code>debugPrint<\/code>, <code>print<\/code> veya daha geli\u015fmi\u015f loglama k\u00fct\u00fcphaneleri kullanarak sunucu taraf\u0131ndaki olaylar\u0131 izleyebilirsiniz. \u00dcretim ortam\u0131nda, yap\u0131land\u0131r\u0131lm\u0131\u015f loglama (\u00f6rne\u011fin, ELK Stack ile) hata tespiti ve performans izleme i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Deployment Stratejileri<\/h3>\n<p>Uygulaman\u0131z\u0131 geli\u015ftirdikten sonra, onu canl\u0131ya almak (deployment) \u00f6nemlidir. Serverpod, konteyner tabanl\u0131 bir mimariye sahip oldu\u011fu i\u00e7in Docker ve Kubernetes gibi ara\u00e7larla uyumludur. Uygulaman\u0131z\u0131 bir bulut sa\u011flay\u0131c\u0131s\u0131na (AWS, Google Cloud, Azure) da\u011f\u0131t\u0131rken, Docker image'\u0131n\u0131z\u0131 olu\u015fturabilir ve Kubernetes k\u00fcmelerinde \u00f6l\u00e7eklenebilir bir \u015fekilde \u00e7al\u0131\u015ft\u0131rabilirsiniz. Serverpod'un resmi d\u00f6k\u00fcmantasyonunda da\u011f\u0131t\u0131m stratejileri hakk\u0131nda detayl\u0131 bilgiler bulabilirsiniz. CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Teslimat) boru hatlar\u0131 kurarak, kod de\u011fi\u015fikliklerini otomatik olarak test edip da\u011f\u0131tarak geli\u015ftirme s\u00fcrecinizi otomatikle\u015ftirmek, modern geli\u015ftirmenin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r.<\/p>\n<h3>Mobil Uyumluluk ve Duyarl\u0131 Tasar\u0131m (Contextual Reminder)<\/h3>\n<p>Serverpod bir backend \u00e7\u00f6z\u00fcm\u00fc olmas\u0131na ra\u011fmen, Flutter ile full-stack mobil geli\u015ftirmenin bir par\u00e7as\u0131 oldu\u011fu i\u00e7in mobil uyumluluk ve duyarl\u0131 tasar\u0131m prensiplerini hat\u0131rlatmak \u00f6nemlidir. Flutter, tek bir kod taban\u0131yla farkl\u0131 ekran boyutlar\u0131na ve cihazlara uyum sa\u011flayabilen kullan\u0131c\u0131 aray\u00fczleri olu\u015fturman\u0131z\u0131 zaten sa\u011flar. Serverpod ise bu duyarl\u0131 aray\u00fczlerin arkas\u0131ndaki h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir veri ak\u0131\u015f\u0131n\u0131 garantiler. Backend taraf\u0131ndan g\u00f6nderilen verilerin, farkl\u0131 mobil cihazlarda do\u011fru \u015fekilde i\u015flenmesi ve sunulmas\u0131 i\u00e7in frontend tasar\u0131m\u0131n\u0131z\u0131n esnek olmas\u0131 gerekti\u011fini unutmay\u0131n. Bu, Serverpod'un sa\u011flad\u0131\u011f\u0131 h\u0131zl\u0131 veri al\u0131\u015fveri\u015fiyle birle\u015fti\u011finde, her boyuttaki ekranda m\u00fckemmel bir kullan\u0131c\u0131 deneyimi sunar.<\/p>\n<p>Bu ileri d\u00fczey ipu\u00e7lar\u0131, Serverpod ile geli\u015ftirdi\u011finiz uygulamalar\u0131n daha sa\u011flam, daha g\u00fcvenli ve daha performansl\u0131 olmas\u0131n\u0131 sa\u011flayacakt\u0131r. Unutmay\u0131n ki, iyi bir uygulaman\u0131n temeli, sadece \u00e7al\u0131\u015fan kod de\u011fil, ayn\u0131 zamanda en iyi uygulamalar\u0131 takip eden ve \u00f6l\u00e7eklenebilir bir mimariye sahip olan koddur. Serverpod, bu hedeflere ula\u015fman\u0131z i\u00e7in g\u00fc\u00e7l\u00fc bir temel sunar.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu kapsaml\u0131 makalede, full-stack mobil geli\u015ftirmenin Flutter ve Serverpod ile nas\u0131l daha kolay, daha verimli ve daha keyifli hale geldi\u011fini detayl\u0131ca inceledik. Serverpod'un kurulumundan temel API endpoint'i olu\u015fturmaya, veritaban\u0131 entegrasyonundan ger\u00e7ek d\u00fcnya bir To-Do uygulamas\u0131 geli\u015ftirmeye kadar bir\u00e7ok konuyu ad\u0131m ad\u0131m ele ald\u0131k. Ayr\u0131ca, uygulaman\u0131z\u0131 daha g\u00fc\u00e7l\u00fc ve g\u00fcvenli hale getirecek ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalar\u0131 da payla\u015ft\u0131k. Serverpod'un Dart tabanl\u0131 olmas\u0131, tip g\u00fcvenli\u011fi sa\u011flamas\u0131 ve otomatik kod jenerasyonu gibi \u00f6zellikleri sayesinde, geli\u015ftiriciler backend karma\u015f\u0131kl\u0131klar\u0131yla daha az u\u011fra\u015farak kullan\u0131c\u0131 deneyimine ve i\u015f mant\u0131\u011f\u0131na odaklanabiliyor.<\/p>\n<p>Flutter ve Serverpod kombinasyonu, modern mobil uygulama geli\u015ftiricileri i\u00e7in ger\u00e7ekten d\u00f6n\u00fc\u015ft\u00fcr\u00fcc\u00fc bir potansiyel sunuyor. Tek bir dilde (Dart) hem frontend hem de backend geli\u015ftirebilme yetene\u011fi, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r, hata oranlar\u0131n\u0131 azalt\u0131r ve ekip i\u00e7indeki i\u015f birli\u011fini art\u0131r\u0131r. Performans, \u00f6l\u00e7eklenebilirlik ve yerle\u015fik \u00f6zellikler (kimlik do\u011frulama, WebSocket, ORM) ile Serverpod, k\u00fc\u00e7\u00fck prototiplerden b\u00fcy\u00fck \u00f6l\u00e7ekli kurumsal uygulamalara kadar her t\u00fcrl\u00fc projeye uygun bir backend \u00e7\u00f6z\u00fcm\u00fcd\u00fcr. Bu makalenin, Serverpod ile full-stack mobil geli\u015ftirme yolculu\u011funuza sa\u011flam bir ba\u015flang\u0131\u00e7 yapman\u0131z i\u00e7in size gerekli bilgi ve g\u00fcveni verdi\u011fini umuyoruz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n<h4>Serverpod \u00fccretsiz mi?<\/h4>\n<p>Evet, Serverpod a\u00e7\u0131k kaynakl\u0131 bir projedir ve MIT lisans\u0131 alt\u0131nda \u00fccretsiz olarak kullan\u0131labilir. Hem geli\u015ftirme hem de \u00fcretim ortamlar\u0131nda hi\u00e7bir \u00fccret \u00f6demeden kullanabilirsiniz.<\/p>\n<\/li>\n<li>\n<h4>Serverpod hangi veritaban\u0131n\u0131 kullan\u0131yor?<\/h4>\n<p>Serverpod, varsay\u0131lan olarak PostgreSQL veritaban\u0131n\u0131 kullan\u0131r. Geli\u015ftirme ortam\u0131nda Docker arac\u0131l\u0131\u011f\u0131yla kolayca bir PostgreSQL konteyneri kurar ve y\u00f6netir.<\/p>\n<\/li>\n<li>\n<h4>Serverpod sadece Flutter ile mi \u00e7al\u0131\u015f\u0131r?<\/h4>\n<p>Serverpod, Flutter uygulamalar\u0131yla m\u00fckemmel bir uyum i\u00e7inde \u00e7al\u0131\u015fmak \u00fczere tasarlanm\u0131\u015ft\u0131r ve client kodunu Dart olarak generate eder. Teorik olarak, generate edilen client kodunu Dart destekleyen di\u011fer platformlarda da kullanmak m\u00fcmk\u00fcn olsa da, esasen Flutter i\u00e7in optimize edilmi\u015ftir. Ba\u015fka bir teknolojiyle kullanmak i\u00e7in manuel entegrasyon veya \u00f6zel client yazman\u0131z gerekebilir.<\/p>\n<\/li>\n<li>\n<h4>Serverpod'u \u00fcretim ortam\u0131nda kullanabilir miyim?<\/h4>\n<p>Evet, Serverpod \u00fcretim ortam\u0131nda kullan\u0131lmak \u00fczere tasarlanm\u0131\u015ft\u0131r. Y\u00fcksek performans, \u00f6l\u00e7eklenebilirlik ve g\u00fcvenlik \u00f6zellikleri sunar. Docker ve Kubernetes ile kolayca da\u011f\u0131t\u0131labilir.<\/p>\n<\/li>\n<li>\n<h4>Serverpod ile ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirebilir miyim?<\/h4>\n<p>Evet, Serverpod yerle\u015fik olarak WebSocket deste\u011fi sunar. Bu sayede sohbet uygulamalar\u0131, canl\u0131 bildirimler veya ger\u00e7ek zamanl\u0131 veri senkronizasyonu gibi interaktif ve ger\u00e7ek zamanl\u0131 \u00f6zelliklere sahip uygulamalar geli\u015ftirebilirsiniz.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Full-stack mobil geli\u015ftirme s\u00fcrecinde h\u0131z ve verimlilik arayanlar i\u00e7in Flutter ve Serverpod ideal bir ikili. Bu makalede Serverpod&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":[874],"tags":[],"class_list":{"0":"post-32957","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-server","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>Flutter ve Serverpod: Sunucu Kurulumu ve \u0130lk Ad\u0131mlar<\/title>\n<meta name=\"description\" content=\"Full-stack mobil geli\u015ftirme s\u00fcrecinde h\u0131z ve verimlilik arayanlar i\u00e7in Flutter ve Serverpod ideal bir ikili. Bu makalede Serverpod kurulumu ve ilk proje ad\u0131mlar\u0131n\u0131 \u00f6\u011frenerek g\u00fc\u00e7l\u00fc bir backend olu\u015fturacaks\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\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flutter ve Serverpod: Sunucu Kurulumu ve \u0130lk Ad\u0131mlar\" \/>\n<meta property=\"og:description\" content=\"Full-stack mobil geli\u015ftirme s\u00fcrecinde h\u0131z ve verimlilik arayanlar i\u00e7in Flutter ve Serverpod ideal bir ikili. Bu makalede Serverpod kurulumu ve ilk proje ad\u0131mlar\u0131n\u0131 \u00f6\u011frenerek g\u00fc\u00e7l\u00fc bir backend olu\u015fturacaks\u0131n\u0131z.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-27T18:32:11+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=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Flutter ve Serverpod: Sunucu Kurulumu ve \u0130lk Ad\u0131mlar\",\"datePublished\":\"2025-10-27T18:32:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/\"},\"wordCount\":4720,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Server\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/\",\"name\":\"Flutter ve Serverpod: Sunucu Kurulumu ve \u0130lk Ad\u0131mlar\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-27T18:32:11+00:00\",\"description\":\"Full-stack mobil geli\u015ftirme s\u00fcrecinde h\u0131z ve verimlilik arayanlar i\u00e7in Flutter ve Serverpod ideal bir ikili. Bu makalede Serverpod kurulumu ve ilk proje ad\u0131mlar\u0131n\u0131 \u00f6\u011frenerek g\u00fc\u00e7l\u00fc bir backend olu\u015fturacaks\u0131n\u0131z.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flutter ve Serverpod: Sunucu Kurulumu ve \u0130lk Ad\u0131mlar\"}]},{\"@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":"Flutter ve Serverpod: Sunucu Kurulumu ve \u0130lk Ad\u0131mlar","description":"Full-stack mobil geli\u015ftirme s\u00fcrecinde h\u0131z ve verimlilik arayanlar i\u00e7in Flutter ve Serverpod ideal bir ikili. Bu makalede Serverpod kurulumu ve ilk proje ad\u0131mlar\u0131n\u0131 \u00f6\u011frenerek g\u00fc\u00e7l\u00fc bir backend olu\u015fturacaks\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\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/","og_locale":"tr_TR","og_type":"article","og_title":"Flutter ve Serverpod: Sunucu Kurulumu ve \u0130lk Ad\u0131mlar","og_description":"Full-stack mobil geli\u015ftirme s\u00fcrecinde h\u0131z ve verimlilik arayanlar i\u00e7in Flutter ve Serverpod ideal bir ikili. Bu makalede Serverpod kurulumu ve ilk proje ad\u0131mlar\u0131n\u0131 \u00f6\u011frenerek g\u00fc\u00e7l\u00fc bir backend olu\u015fturacaks\u0131n\u0131z.","og_url":"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-27T18:32:11+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Flutter ve Serverpod: Sunucu Kurulumu ve \u0130lk Ad\u0131mlar","datePublished":"2025-10-27T18:32:11+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/"},"wordCount":4720,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Server"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/","url":"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/","name":"Flutter ve Serverpod: Sunucu Kurulumu ve \u0130lk Ad\u0131mlar","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-27T18:32:11+00:00","description":"Full-stack mobil geli\u015ftirme s\u00fcrecinde h\u0131z ve verimlilik arayanlar i\u00e7in Flutter ve Serverpod ideal bir ikili. Bu makalede Serverpod kurulumu ve ilk proje ad\u0131mlar\u0131n\u0131 \u00f6\u011frenerek g\u00fc\u00e7l\u00fc bir backend olu\u015fturacaks\u0131n\u0131z.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/flutter-ve-serverpod-sunucu-kurulumu-ve-ilk-adimlar\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Flutter ve Serverpod: Sunucu Kurulumu ve \u0130lk Ad\u0131mlar"}]},{"@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\/32957","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=32957"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32957\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32957"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32957"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32957"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}