{"id":34568,"date":"2025-11-19T00:31:27","date_gmt":"2025-11-18T21:31:27","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/"},"modified":"2025-11-19T00:31:27","modified_gmt":"2025-11-18T21:31:27","slug":"nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/","title":{"rendered":"NestJS ve Prisma Kurulumu: Sorunsuz Bir Entegrasyon Rehberi"},"content":{"rendered":"<p><body><\/p>\n<p>Modern web geli\u015ftirme s\u00fcre\u00e7lerinde NestJS ve Prisma ikilisini kullanarak veritaban\u0131 i\u015flemlerini basitle\u015ftirmek mi istiyorsunuz? Bu kapsaml\u0131 rehber, NestJS uygulaman\u0131z\u0131 Prisma ile ad\u0131m ad\u0131m nas\u0131l entegre edece\u011finizi, kar\u015f\u0131la\u015f\u0131labilecek yayg\u0131n zorluklar\u0131n \u00fcstesinden nas\u0131l gelece\u011finizi ve geli\u015ftirme deneyiminizi nas\u0131l iyile\u015ftirece\u011finizi detayl\u0131 bir \u015fekilde a\u00e7\u0131kl\u0131yor. Art\u0131k veritaban\u0131 entegrasyonu ba\u015f a\u011fr\u0131s\u0131 olmaktan \u00e7\u0131kacak!<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i yaz\u0131l\u0131m d\u00fcnyas\u0131nda, h\u0131zl\u0131 ve g\u00fcvenilir API&#8217;ler geli\u015ftirmek her zamankinden daha \u00f6nemli hale geldi. Backend geli\u015ftiricileri olarak, verimlili\u011fi art\u0131ran, kod kalitesini y\u00fckselten ve bak\u0131m maliyetlerini d\u00fc\u015f\u00fcren ara\u00e7lara ihtiya\u00e7 duyar\u0131z. \u0130\u015fte tam da bu noktada NestJS ve Prisma gibi modern teknolojiler sahneye \u00e7\u0131k\u0131yor. Peki, bu ikiliyi bu kadar \u00f6zel k\u0131lan nedir ve neden onlar\u0131 projelerinizde bir arada kullanmal\u0131s\u0131n\u0131z?<\/p>\n<p>NestJS, Node.js ekosistemindeki g\u00fc\u00e7l\u00fc bir framework olarak dikkat \u00e7eker. TypeScript deste\u011fi, mod\u00fcler yap\u0131s\u0131 ve Angular&#8217;dan ilham alan mimarisiyle, b\u00fcy\u00fck \u00f6l\u00e7ekli ve kurumsal uygulamalar geli\u015ftirmek i\u00e7in ideal bir zemin sunar. Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu (Dependency Injection), mod\u00fcller, servisler ve denetleyiciler (controllers) gibi \u00f6zellikleriyle, d\u00fczenli, \u00f6l\u00e7eklenebilir ve test edilebilir kod yazmay\u0131 kolayla\u015ft\u0131r\u0131r. Ayr\u0131ca, mikroservis mimarileri, GraphQL ve WebSocket gibi modern API yakla\u015f\u0131mlar\u0131n\u0131 sorunsuz bir \u015fekilde desteklemesi, onu geli\u015ftiricilerin g\u00f6zdesi haline getiriyor.<\/p>\n<p>\u00d6te yandan Prisma, modern bir veritaban\u0131 ara\u00e7 tak\u0131m\u0131d\u0131r. Geleneksel ORM&#8217;lerden (Object-Relational Mapping) farkl\u0131 olarak, Prisma kendisini &#8220;nesne-ili\u015fkisel e\u015fleyici&#8221;den ziyade &#8220;nesne-ili\u015fkisel haritalay\u0131c\u0131&#8221; veya &#8220;veri eri\u015fim katman\u0131&#8221; olarak konumland\u0131r\u0131r. Bu, Prisma&#8217;n\u0131n sadece veritaban\u0131 i\u015flemlerini de\u011fil, ayn\u0131 zamanda \u015fema y\u00f6netimi (migrations), veritaban\u0131 istemcisi olu\u015fturma ve tip g\u00fcvenli\u011fi sa\u011flama gibi konularda da \u00fcst d\u00fczey \u00e7\u00f6z\u00fcmler sunmas\u0131 anlam\u0131na gelir. TypeScript ile m\u00fckemmel uyumu sayesinde, veritaban\u0131 \u015feman\u0131zdaki de\u011fi\u015fiklikler an\u0131nda kodunuza yans\u0131r ve derleme zaman\u0131nda hatalar\u0131n \u00f6n\u00fcne ge\u00e7ilir. Yani, veritaban\u0131n\u0131zda yapt\u0131\u011f\u0131n\u0131z bir kolon de\u011fi\u015fikli\u011finin uygulaman\u0131zda neden olabilece\u011fi potansiyel hatalar\u0131 daha kod yazarken fark edebilirsiniz. Bu, \u00f6zellikle b\u00fcy\u00fck ekiplerle \u00e7al\u0131\u015f\u0131rken veya karma\u015f\u0131k projelerde geli\u015ftirme yaparken paha bi\u00e7ilmez bir avantajd\u0131r.<\/p>\n<p>Peki, bu iki teknoloji bir araya geldi\u011finde ne oluyor? NestJS&#8217;in yap\u0131land\u0131r\u0131lm\u0131\u015f, mod\u00fcler ve g\u00fc\u00e7l\u00fc mimarisi ile Prisma&#8217;n\u0131n tip g\u00fcvenli, modern ve geli\u015ftirici dostu veritaban\u0131 katman\u0131 birle\u015fti\u011finde, ortaya muazzam bir geli\u015ftirme deneyimi \u00e7\u0131kar. NestJS, API&#8217;nizin i\u015f mant\u0131\u011f\u0131n\u0131 ve kontrol katmanlar\u0131n\u0131 y\u00f6netirken, Prisma veritaban\u0131 ile etkile\u015fimi g\u00fcvenli, h\u0131zl\u0131 ve tip g\u00fcvenli bir \u015fekilde sa\u011flar. Bu kombinasyon, geli\u015ftirici verimlili\u011fini art\u0131r\u0131r, kod taban\u0131n\u0131 temiz tutar, hata oran\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr ve uzun vadede uygulaman\u0131z\u0131n bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. \u00d6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan da, NestJS&#8217;in mikroservis yetenekleri ve Prisma&#8217;n\u0131n optimize edilmi\u015f veritaban\u0131 sorgular\u0131, y\u00fcksek trafikli uygulamalar i\u00e7in sa\u011flam bir temel olu\u015fturur. K\u0131sacas\u0131, NestJS ve Prisma birlikte, gelece\u011fin API&#8217;lerini in\u015fa etmek i\u00e7in g\u00fc\u00e7l\u00fc, g\u00fcvenilir ve modern bir ara\u00e7 seti sunar.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: NestJS&#8217;in mod\u00fcler yap\u0131s\u0131 ve Prisma&#8217;n\u0131n veri katman\u0131 soyutlamas\u0131, b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalarda kod tekrar\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131rken, bak\u0131m kolayl\u0131\u011f\u0131 sa\u011flar. \u00d6zellikle kurumsal projelerde, bu sinerji geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131r ve potansiyel hatalar\u0131 minimize eder.\n    <\/div>\n<h2>NestJS Projesi Olu\u015fturma ve Temel Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckleme Ad\u0131mlar\u0131 Nelerdir?<\/h2>\n<p>NestJS ve Prisma ile sorunsuz bir entegrasyon yolculu\u011funa ba\u015flamak i\u00e7in, \u00f6ncelikle sa\u011flam bir temel olu\u015fturmam\u0131z gerekiyor. Bu b\u00f6l\u00fcmde, yeni bir NestJS projesi olu\u015fturma, gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleme ve Prisma&#8217;y\u0131 projenize dahil etme ad\u0131mlar\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu s\u00fcre\u00e7, yeni ba\u015flayanlar i\u00e7in bile olduk\u00e7a anla\u015f\u0131l\u0131r ve basittir.<\/p>\n<p><strong>1. Nest CLI ile Yeni Proje Olu\u015fturma:<\/strong><br \/>\n    \u0130lk ad\u0131m olarak, NestJS&#8217;in g\u00fc\u00e7l\u00fc komut sat\u0131r\u0131 aray\u00fcz\u00fc (CLI) arac\u0131n\u0131 global olarak kurmam\u0131z gerekiyor. Bu ara\u00e7, proje iskeletini otomatik olarak olu\u015fturarak size zaman kazand\u0131r\u0131r. Ard\u0131ndan, yeni bir NestJS projesi olu\u015fturabiliriz.<\/p>\n<pre><code>\nnpm i -g @nestjs\/cli\nnest new my-nestjs-prisma-app\ncd my-nestjs-prisma-app\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra, <code>my-nestjs-prisma-app<\/code> ad\u0131nda yeni bir dizin olu\u015fturulacak ve NestJS'in temel dosyalar\u0131 buraya kopyalanacakt\u0131r. <code>cd my-nestjs-prisma-app<\/code> komutuyla proje dizininize ge\u00e7i\u015f yapmay\u0131 unutmay\u0131n. Bu, di\u011fer t\u00fcm komutlar\u0131 do\u011fru ba\u011flamda \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flayacakt\u0131r.<\/p>\n<p><strong>2. Prisma ve \u0130lgili Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckleme:<\/strong><br \/>\n    \u015eimdi s\u0131ra Prisma'y\u0131 projemize dahil etmeye geldi. Prisma, iki ana paketten olu\u015fur:<\/p>\n<ul>\n<li><code>prisma<\/code>: Prisma CLI ve \u00e7e\u015fitli yard\u0131mc\u0131 ara\u00e7lar\u0131 i\u00e7eren ana pakettir. Veritaban\u0131 \u015femas\u0131n\u0131 y\u00f6netmek, migrasyonlar\u0131 \u00e7al\u0131\u015ft\u0131rmak ve Prisma Studio'yu kullanmak i\u00e7in bu pakete ihtiyac\u0131m\u0131z olacak.<\/li>\n<li><code>@prisma\/client<\/code>: Uygulaman\u0131z\u0131n do\u011frudan veritaban\u0131yla etkile\u015fime girmesini sa\u011flayan otomatik olu\u015fturulmu\u015f Prisma istemcisidir. Bu istemci, \u015feman\u0131za g\u00f6re tip g\u00fcvenli sorgular yapman\u0131z\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p>    Bu paketleri projemize eklemek i\u00e7in a\u015fa\u011f\u0131daki komutu kullan\u0131yoruz:<\/p>\n<pre><code>\nnpm install @prisma\/client prisma\n    <\/pre>\n<p><\/code><\/p>\n<p><strong>3. Ortam De\u011fi\u015fkenleri \u0130\u00e7in <code>dotenv<\/code> Kurulumu:<\/strong><br \/>\n    Veritaban\u0131 ba\u011flant\u0131 dizgisi (connection string) gibi hassas bilgileri do\u011frudan kod i\u00e7inde tutmak iyi bir pratik de\u011fildir. Bu t\u00fcr bilgileri ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netmek g\u00fcvenlik ve esneklik a\u00e7\u0131s\u0131ndan \u00f6nemlidir. Bunun i\u00e7in Node.js uygulamalar\u0131nda s\u0131kl\u0131kla kullan\u0131lan <code>dotenv<\/code> paketini kuraca\u011f\u0131z.<\/p>\n<pre><code>\nnpm install dotenv\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu paket, <code>.env<\/code> dosyas\u0131ndaki ortam de\u011fi\u015fkenlerini uygulaman\u0131z\u0131n eri\u015fimine a\u00e7acakt\u0131r. Daha sonra Prisma \u015femam\u0131z\u0131 ve NestJS uygulamam\u0131z\u0131 yap\u0131land\u0131r\u0131rken bu de\u011fi\u015fkenleri kullanaca\u011f\u0131z. Bu ad\u0131mlar, NestJS ve Prisma entegrasyonunuz i\u00e7in sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 olu\u015fturur. Art\u0131k veritaban\u0131 \u015femam\u0131z\u0131 tasarlamaya ve veritaban\u0131 i\u015flemlerine ba\u015flamaya haz\u0131r\u0131z.<\/p>\n<h2>Prisma Veritaban\u0131 \u015eemas\u0131 Nas\u0131l Tasarlan\u0131r ve Migrasyonlar Nas\u0131l Y\u00f6netilir?<\/h2>\n<p>Veritaban\u0131 \u015femas\u0131, uygulaman\u0131z\u0131n veri yap\u0131s\u0131n\u0131n temelini olu\u015fturur. Prisma ile \u015fema tasar\u0131m\u0131, tip g\u00fcvenli\u011fi ve kullan\u0131m kolayl\u0131\u011f\u0131 a\u00e7\u0131s\u0131ndan benzersiz bir deneyim sunar. Bu b\u00f6l\u00fcmde, <code>schema.prisma<\/code> dosyas\u0131n\u0131 nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131, veri modellerimizi nas\u0131l tan\u0131mlayaca\u011f\u0131m\u0131z\u0131 ve bu \u015fema de\u011fi\u015fikliklerini veritaban\u0131m\u0131za nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 (migrasyonlar) ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz.<\/p>\n<p><strong>1. Prisma Ortam\u0131n\u0131 Ba\u015flatma:<\/strong><br \/>\n    Prisma CLI'y\u0131 kullanarak projenizde bir Prisma ortam\u0131 ba\u015flat\u0131n. Bu komut, anahtar yap\u0131land\u0131rma dosyas\u0131 olan <code>schema.prisma<\/code>'y\u0131 ve <code>.env<\/code> dosyas\u0131n\u0131 olu\u015fturacakt\u0131r. <code>.env<\/code> dosyas\u0131, veritaban\u0131 ba\u011flant\u0131 dizgisi gibi hassas bilgileri i\u00e7erecektir.<\/p>\n<pre><code>\nnpx prisma init\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komutu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>prisma<\/code> ad\u0131nda yeni bir dizin ve i\u00e7inde <code>schema.prisma<\/code> dosyas\u0131 olu\u015fur. Ayr\u0131ca, <code>.env<\/code> dosyas\u0131nda varsay\u0131lan bir <code>DATABASE_URL<\/code> de\u011fi\u015fkeni tan\u0131mlan\u0131r. Bu URL'yi kullanaca\u011f\u0131n\u0131z veritaban\u0131na (\u00f6rne\u011fin PostgreSQL, MySQL, SQL Server, SQLite) g\u00f6re d\u00fczenlemeniz gerekecektir.<\/p>\n<p><strong>2. <code>schema.prisma<\/code> Dosyas\u0131n\u0131 D\u00fczenleme:<\/strong><br \/>\n    <code>schema.prisma<\/code> dosyas\u0131, uygulaman\u0131z\u0131n veritaban\u0131 \u015femas\u0131n\u0131n kalbidir. Bu dosya, veritaban\u0131 sa\u011flay\u0131c\u0131n\u0131z\u0131 (PostgreSQL \u00f6rne\u011fi \u00fczerinden gidece\u011fiz) tan\u0131mlar ve veri modellerinizi i\u00e7erir. A\u015fa\u011f\u0131daki gibi bir yap\u0131ya sahip olacakt\u0131r:<\/p>\n<pre><code>\n\/\/ prisma\/schema.prisma\ndatasource db {\n  provider = \"postgresql\" \/\/ Kullanaca\u011f\u0131n\u0131z veritaban\u0131 t\u00fcr\u00fcn\u00fc belirtin\n  url      = env(\"DATABASE_URL\") \/\/ .env dosyas\u0131ndan gelen ba\u011flant\u0131 URL'si\n}\n\ngenerator client {\n  provider = \"prisma-client-js\" \/\/ Prisma istemcisini JavaScript\/TypeScript i\u00e7in olu\u015fturur\n}\n\nmodel User {\n  id        Int      @id @default(autoincrement()) \/\/ Otomatik artan ID\n  email     String   @unique \/\/ Benzersiz e-posta\n  name      String? \/\/ \u0130ste\u011fe ba\u011fl\u0131 isim\n  posts     Post[] \/\/ Bir kullan\u0131c\u0131n\u0131n birden fazla g\u00f6nderisi olabilir\n  createdAt DateTime @default(now())\n  updatedAt DateTime @updatedAt\n}\n\nmodel Post {\n  id        Int      @id @default(autoincrement())\n  title     String\n  content   String?\n  published Boolean  @default(false)\n  author    User     @relation(fields: [authorId], references: [id]) \/\/ User modeliyle ili\u015fki\n  authorId  Int \/\/ \u0130li\u015fkili yazar\u0131n ID'si\n  createdAt DateTime @default(now())\n  updatedAt DateTime @updatedAt\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki \u00f6rnekte, iki temel model tan\u0131mlad\u0131k: <code>User<\/code> ve <code>Post<\/code>. Her model, veritaban\u0131 tablosundaki bir varl\u0131\u011f\u0131 temsil eder. <code>@id<\/code>, <code>@unique<\/code>, <code>@default<\/code>, <code>@relation<\/code> gibi nitelikler, alanlar\u0131n davran\u0131\u015flar\u0131n\u0131 ve veritaban\u0131 ili\u015fkilerini tan\u0131mlar. \u00d6zellikle <code>@relation<\/code> \u00f6zelli\u011fi, <code>User<\/code> ve <code>Post<\/code> modelleri aras\u0131ndaki bire-\u00e7ok (one-to-many) ili\u015fkiyi kurar. Bu sayede, bir <code>User<\/code> birden fazla <code>Post<\/code>a sahip olabilir.<\/p>\n<p><strong>3. Veritaban\u0131 Ba\u011flant\u0131 Dizgesini Ayarlama:<\/strong><br \/>\n    <code>.env<\/code> dosyan\u0131z\u0131 a\u00e7\u0131n ve <code>DATABASE_URL<\/code> de\u011fi\u015fkenini kullanaca\u011f\u0131n\u0131z PostgreSQL veritaban\u0131n\u0131n ba\u011flant\u0131 dizgesiyle g\u00fcncelleyin. \u00d6rne\u011fin:<\/p>\n<pre><code>\nDATABASE_URL=\"postgresql:\/\/user:password@localhost:5432\/mydb?schema=public\"\n    <\/pre>\n<p><\/code><\/p>\n<p>Kendi veritaban\u0131 kullan\u0131c\u0131 ad\u0131n\u0131z, \u015fifreniz, host'unuz ve veritaban\u0131 ad\u0131n\u0131zla bu dizgeyi de\u011fi\u015ftirdi\u011finizden emin olun.<\/p>\n<p><strong>4. \u0130lk Migrasyonu \u00c7al\u0131\u015ft\u0131rma:<\/strong><br \/>\n    \u015eemam\u0131z\u0131 tan\u0131mlad\u0131ktan ve <code>.env<\/code> dosyam\u0131z\u0131 yap\u0131land\u0131rd\u0131ktan sonra, bu \u015femay\u0131 veritaban\u0131m\u0131za uygulamam\u0131z gerekiyor. Prisma'n\u0131n migrasyon arac\u0131 bu i\u015fi bizim i\u00e7in yapar. <code>prisma migrate dev<\/code> komutu, \u015feman\u0131zdaki de\u011fi\u015fiklikleri alg\u0131lar, bir SQL migrasyon dosyas\u0131 olu\u015fturur ve bu de\u011fi\u015fiklikleri veritaban\u0131n\u0131za uygular.<\/p>\n<pre><code>\nnpx prisma migrate dev --name init\n    <\/pre>\n<p><\/code><\/p>\n<p><code>--name init<\/code> parametresi, bu migrasyon setine a\u00e7\u0131klay\u0131c\u0131 bir isim vermemizi sa\u011flar. Bu komutu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, Prisma \u015feman\u0131z\u0131 analiz edecek ve veritaban\u0131n\u0131zda <code>User<\/code> ve <code>Post<\/code> tablolar\u0131n\u0131 olu\u015fturacak SQL komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131racakt\u0131r. Ayr\u0131ca, <code>prisma\/migrations<\/code> dizininde bu migrasyonun bir kayd\u0131n\u0131 tutacakt\u0131r. Bu sayede, veritaban\u0131 \u015feman\u0131zdaki evrimi takip edebilir ve gerekti\u011finde geri alabilirsiniz. Bu ad\u0131mlar, NestJS uygulaman\u0131z\u0131n veri katman\u0131n\u0131 Prisma ile ba\u015far\u0131yla kurman\u0131z\u0131 ve y\u00f6netmenizi sa\u011flar.<\/p>\n<h2>NestJS Servislerinde Prisma \u0130stemcisi Nas\u0131l Kullan\u0131l\u0131r ve Entegre Edilir?<\/h2>\n<p>Prisma \u015femam\u0131z\u0131 ve veritaban\u0131 migrasyonlar\u0131m\u0131z\u0131 tamamlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi bu g\u00fc\u00e7l\u00fc veritaban\u0131 istemcisini NestJS uygulamam\u0131z\u0131n i\u015f mant\u0131\u011f\u0131na entegre etme zaman\u0131. NestJS'in mod\u00fcler yap\u0131s\u0131 ve ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu (DI) sistemi sayesinde, PrismaClient'\u0131 uygulaman\u0131zda temiz ve s\u00fcrd\u00fcr\u00fclebilir bir \u015fekilde kullanmak olduk\u00e7a kolayd\u0131r. Bu b\u00f6l\u00fcmde, bir <code>PrismaService<\/code> olu\u015fturacak, bunu NestJS mod\u00fcllerine entegre edecek ve servislerimizde nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 \u00f6rnekleyece\u011fiz.<\/p>\n<p><strong>1. <code>PrismaService<\/code> Olu\u015fturma:<\/strong><br \/>\n    PrismaClient'\u0131 do\u011frudan her servise enjekte etmek yerine, t\u00fcm uygulaman\u0131zda tekil bir \u00f6rnek olarak y\u00f6neten \u00f6zel bir <code>PrismaService<\/code> olu\u015fturmak en iyi y\u00f6ntemdir. Bu, ba\u011flant\u0131 y\u00f6netimi, loglama ve uygulama ya\u015fam d\u00f6ng\u00fcs\u00fc hook'lar\u0131n\u0131 tek bir yerde toplaman\u0131z\u0131 sa\u011flar. \u0130lk olarak, Nest CLI ile yeni bir servis olu\u015ftural\u0131m:<\/p>\n<pre><code>\nnest g service prisma --no-spec\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu komut <code>src\/prisma\/prisma.service.ts<\/code> dosyas\u0131n\u0131 olu\u015fturacakt\u0131r. \u015eimdi bu dosyay\u0131 a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim:<\/p>\n<pre><code>\n\/\/ src\/prisma\/prisma.service.ts\nimport { INestApplication, Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs\/common';\nimport { PrismaClient } from '@prisma\/client';\n\n@Injectable()\nexport class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {\n  constructor() {\n    super({\n      \/\/ Sorgular\u0131 konsolda g\u00f6rmek i\u00e7in log seviyesini ayarlayabilirsiniz.\n      \/\/ Bu, geli\u015ftirme a\u015famas\u0131nda hatalar\u0131 ay\u0131klamak i\u00e7in olduk\u00e7a faydal\u0131d\u0131r.\n      log: ['query', 'info', 'warn', 'error'], \n    });\n  }\n\n  async onModuleInit() {\n    \/\/ Uygulama ba\u015flad\u0131\u011f\u0131nda veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kur\n    await this.$connect();\n  }\n\n  async onModuleDestroy() {\n    \/\/ Uygulama kapat\u0131ld\u0131\u011f\u0131nda veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kes\n    await this.$disconnect();\n  }\n\n  \/\/ NestJS'in d\u00fczg\u00fcn bir \u015fekilde kapanmas\u0131 i\u00e7in shutdown hook'lar\u0131n\u0131 etkinle\u015ftirme\n  async enableShutdownHooks(app: INestApplication) {\n    this.$on('beforeExit', async () => {\n      await app.close();\n    });\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu servis, <code>PrismaClient<\/code>'tan t\u00fcredi\u011fi i\u00e7in t\u00fcm Prisma \u00f6zelliklerine eri\u015febilir. <code>OnModuleInit<\/code> ve <code>OnModuleDestroy<\/code> aray\u00fczleri, uygulaman\u0131n ba\u015flat\u0131lmas\u0131 ve kapat\u0131lmas\u0131 s\u0131ras\u0131nda veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 y\u00f6netmemizi sa\u011flar. <code>enableShutdownHooks<\/code> metodu ise, NestJS uygulamas\u0131n\u0131n kapatma sinyallerini d\u00fczg\u00fcn bir \u015fekilde i\u015flemesini ve a\u00e7\u0131k veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 temizlemesini garantiler.<\/p>\n<p><strong>2. <code>PrismaModule<\/code> Olu\u015fturma ve Entegrasyon:<\/strong><br \/>\n    <code>PrismaService<\/code>'i di\u011fer mod\u00fcllerin kullanabilmesi i\u00e7in, onu d\u0131\u015fa aktaran (export) bir <code>PrismaModule<\/code> olu\u015fturmak en iyi yakla\u015f\u0131md\u0131r. Bu, mod\u00fclerli\u011fi art\u0131r\u0131r ve kod tekrar\u0131n\u0131 \u00f6nler.<\/p>\n<pre><code>\n\/\/ src\/prisma\/prisma.module.ts\nimport { Module, Global } from '@nestjs\/common';\nimport { PrismaService } from '.\/prisma.service';\n\n@Global() \/\/ Bu mod\u00fcl\u00fcn uygulaman\u0131n herhangi bir yerinde kullan\u0131labilmesini sa\u011flar\n@Module({\n  providers: [PrismaService],\n  exports: [PrismaService], \/\/ Di\u011fer mod\u00fcllerin PrismaService'i kullanabilmesi i\u00e7in d\u0131\u015fa aktar\n})\nexport class PrismaModule {}\n    <\/pre>\n<p><\/code><\/p>\n<p><code>@Global()<\/code> dekorat\u00f6r\u00fc sayesinde, <code>PrismaModule<\/code>'\u00fc sadece bir kez <code>AppModule<\/code>'a aktararak uygulaman\u0131zdaki t\u00fcm di\u011fer mod\u00fcllerde <code>PrismaService<\/code>'i kullanabilirsiniz. Bu, her mod\u00fclde ayr\u0131 ayr\u0131 <code>PrismaModule<\/code>'\u00fc i\u00e7e aktarma zahmetinden kurtar\u0131r.<\/p>\n<p><strong>3. <code>AppModule<\/code> ve Di\u011fer Mod\u00fcllere Entegrasyon:<\/strong><br \/>\n    \u015eimdi <code>PrismaModule<\/code>'\u00fc ana <code>AppModule<\/code>'\u00fcm\u00fcze aktaral\u0131m:<\/p>\n<pre><code>\n\/\/ src\/app.module.ts\nimport { Module } from '@nestjs\/common';\nimport { AppController } from '.\/app.controller';\nimport { AppService } from '.\/app.service';\nimport { PrismaModule } from '.\/prisma\/prisma.module';\nimport { UsersModule } from '.\/users\/users.module'; \/\/ Yeni olu\u015fturaca\u011f\u0131m\u0131z mod\u00fcl\n\n@Module({\n  imports: [PrismaModule, UsersModule], \/\/ PrismaModule'\u00fc buraya ekledik\n  controllers: [AppController],\n  providers: [AppService],\n})\nexport class AppModule {}\n    <\/pre>\n<p><\/code><\/p>\n<p><strong>4. \u00d6rnek Kullan\u0131c\u0131 Mod\u00fcl\u00fc ve Servisi Olu\u015fturma:<\/strong><br \/>\n    <code>PrismaService<\/code>'i ger\u00e7ek bir senaryoda nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 g\u00f6stermek i\u00e7in bir <code>UsersModule<\/code> olu\u015ftural\u0131m. \u0130lk olarak, mod\u00fcl\u00fc ve servisleri olu\u015ftural\u0131m:<\/p>\n<pre><code>\nnest g module users\nnest g service users --no-spec\nnest g controller users --no-spec\n    <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi <code>UsersService<\/code> i\u00e7inde <code>PrismaService<\/code>'i enjekte edelim ve CRUD (Create, Read, Update, Delete) operasyonlar\u0131 i\u00e7in kullanal\u0131m:<\/p>\n<pre><code>\n\/\/ src\/users\/users.module.ts\nimport { Module } from '@nestjs\/common';\nimport { UsersService } from '.\/users.service';\nimport { UsersController } from '.\/users.controller';\nimport { PrismaModule } from '..\/prisma\/prisma.module'; \/\/ PrismaModule'\u00fc burada tekrar import etmeye gerek kalmad\u0131 @Global() sayesinde\n\n@Module({\n  imports: [PrismaModule], \/\/ @Global() kullan\u0131ld\u0131ysa bu sat\u0131ra gerek yoktur, ancak a\u00e7\u0131k\u00e7a belirtmek iyi bir pratik olabilir.\n  controllers: [UsersController],\n  providers: [UsersService],\n})\nexport class UsersModule {}\n    <\/pre>\n<p><\/code><\/p>\n<pre><code>\n\/\/ src\/users\/users.service.ts\nimport { Injectable } from '@nestjs\/common';\nimport { PrismaService } from '..\/prisma\/prisma.service';\nimport { User, Prisma } from '@prisma\/client'; \/\/ Tip g\u00fcvenli\u011fi i\u00e7in PrismaClient'tan User modelini import ediyoruz\n\n@Injectable()\nexport class UsersService {\n  constructor(private prisma: PrismaService) {} \/\/ PrismaService'i enjekte ettik\n\n  async createUser(data: Prisma.UserCreateInput): Promise<User> {\n    return this.prisma.user.create({ data });\n  }\n\n  async findOne(email: string): Promise<User | null> {\n    return this.prisma.user.findUnique({ where: { email } });\n  }\n\n  async findAll(): Promise<User[]> {\n    return this.prisma.user.findMany();\n  }\n\n  async updateUser(id: number, data: Prisma.UserUpdateInput): Promise<User> {\n    return this.prisma.user.update({\n      where: { id },\n      data,\n    });\n  }\n\n  async deleteUser(id: number): Promise<User> {\n    return this.prisma.user.delete({ where: { id } });\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Son olarak, <code>UsersController<\/code>'\u0131m\u0131z\u0131 olu\u015ftural\u0131m. Bu controller, <code>UsersService<\/code>'teki metotlar\u0131 HTTP istekleriyle e\u015fleyecektir:<\/p>\n<pre><code>\n\/\/ src\/users\/users.controller.ts\nimport { Controller, Post, Body, Get, Param, Patch, Delete } from '@nestjs\/common';\nimport { UsersService } from '.\/users.service';\nimport { User as UserModel } from '@prisma\/client';\n\n@Controller('users')\nexport class UsersController {\n  constructor(private readonly usersService: UsersService) {}\n\n  @Post()\n  async createUser(@Body() userData: { name?: string; email: string }): Promise<UserModel> {\n    return this.usersService.createUser(userData);\n  }\n\n  @Get(':email')\n  async findOne(@Param('email') email: string): Promise<UserModel | null> {\n    return this.usersService.findOne(email);\n  }\n\n  @Get()\n  async findAll(): Promise<UserModel[]> {\n    return this.usersService.findAll();\n  }\n\n  @Patch(':id')\n  async updateUser(\n    @Param('id') id: string,\n    @Body() userData: { name?: string; email?: string }\n  ): Promise<UserModel> {\n    return this.usersService.updateUser(+id, userData); \/\/ +id ile string'i number'a \u00e7eviriyoruz\n  }\n\n  @Delete(':id')\n  async deleteUser(@Param('id') id: string): Promise<UserModel> {\n    return this.usersService.deleteUser(+id);\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu ad\u0131mlarla, NestJS servislerinizde Prisma istemcisini nas\u0131l g\u00fcvenli, tip g\u00fcvenli ve \u00f6l\u00e7eklenebilir bir \u015fekilde kullanaca\u011f\u0131n\u0131z\u0131 \u00f6\u011frenmi\u015f oldunuz. Art\u0131k API'niz veritaban\u0131yla sorunsuz bir \u015fekilde etkile\u015fim kurabilir.<\/p>\n<h2>Geli\u015fmi\u015f NestJS ve Prisma Kullan\u0131m Senaryolar\u0131 Nelerdir?<\/h2>\n<p>NestJS ve Prisma entegrasyonunun temel ad\u0131mlar\u0131n\u0131 anlad\u0131ktan sonra, \u015fimdi daha karma\u015f\u0131k ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda bu ikiliyi nas\u0131l daha verimli kullanabilece\u011fimize odaklanal\u0131m. Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e ve i\u015f mant\u0131\u011f\u0131n\u0131z daha karma\u015f\u0131k hale geldik\u00e7e, baz\u0131 geli\u015fmi\u015f \u00f6zelliklere ihtiya\u00e7 duyacaks\u0131n\u0131z. \u0130\u015fte NestJS ve Prisma'y\u0131 bir sonraki seviyeye ta\u015f\u0131yacak baz\u0131 kullan\u0131m senaryolar\u0131:<\/p>\n<p><strong>1. \u0130\u015flemler (Transactions) Y\u00f6netimi:<\/strong><br \/>\n    Veritaban\u0131 i\u015flemlerinde veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak kritik \u00f6neme sahiptir. Birbiriyle ili\u015fkili birden fazla veritaban\u0131 operasyonunun tamam\u0131n\u0131n ya ba\u015far\u0131yla tamamlanmas\u0131n\u0131 ya da hi\u00e7birinin uygulanmamas\u0131n\u0131 sa\u011flamak i\u00e7in transaction'lara ihtiya\u00e7 duyar\u0131z. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n yeni bir g\u00f6nderi olu\u015fturmas\u0131 ve ayn\u0131 zamanda bu g\u00f6nderiyi yazarla ili\u015fkilendirmesi gibi durumlarda, bu iki i\u015flemin atomik olmas\u0131n\u0131 sa\u011flamak gerekir. Prisma, <code>$transaction<\/code> API'si ile bu t\u00fcr durumlar\u0131 kolayca y\u00f6netmenizi sa\u011flar.<\/p>\n<pre><code>\n\/\/ src\/posts\/posts.service.ts\nimport { Injectable } from '@nestjs\/common';\nimport { PrismaService } from '..\/prisma\/prisma.service';\nimport { Post, User, Prisma } from '@prisma\/client';\n\n@Injectable()\nexport class PostsService {\n  constructor(private prisma: PrismaService) {}\n\n  async createPostAndUser(\n    userData: Prisma.UserCreateInput,\n    postData: { title: string; content?: string }\n  ): Promise<{ user: User; post: Post }> {\n    return this.prisma.$transaction(async (tx) => {\n      \/\/ \u00d6nce kullan\u0131c\u0131y\u0131 olu\u015ftur\n      const user = await tx.user.create({ data: userData });\n\n      \/\/ Sonra g\u00f6nderiyi olu\u015ftur ve yeni olu\u015fturulan kullan\u0131c\u0131yla ili\u015fkilendir\n      const post = await tx.post.create({\n        data: {\n          ...postData,\n          author: { connect: { id: user.id } }, \/\/ \u0130li\u015fkiyi kur\n        },\n      });\n      return { user, post };\n    });\n  }\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>createPostAndUser<\/code> fonksiyonu i\u00e7inde hem kullan\u0131c\u0131 olu\u015fturma hem de g\u00f6nderi olu\u015fturma i\u015flemleri tek bir transaction i\u00e7inde ger\u00e7ekle\u015ftirilir. Herhangi bir ad\u0131m ba\u015far\u0131s\u0131z olursa, t\u00fcm transaction geri al\u0131n\u0131r ve veritaban\u0131 tutarl\u0131 kal\u0131r.<\/p>\n<p><strong>2. Sorgu Filtreleme, S\u0131ralama ve Sayfalama (Pagination):<\/strong><br \/>\n    B\u00fcy\u00fck veri setleriyle \u00e7al\u0131\u015f\u0131rken, kullan\u0131c\u0131 aray\u00fcz\u00fcnde sadece belirli kriterlere uyan verileri g\u00f6stermek veya verileri par\u00e7alar halinde y\u00fcklemek (pagination) yayg\u0131n bir gerekliliktir. Prisma, bu i\u015flemleri olduk\u00e7a sezgisel bir \u015fekilde yapman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code>\n\/\/ src\/posts\/posts.service.ts (devam\u0131)\nasync findPosts(params: {\n    skip?: number;\n    take?: number;\n    cursor?: Prisma.PostWhereUniqueInput;\n    where?: Prisma.PostWhereInput;\n    orderBy?: Prisma.PostOrderByWithRelationInput;\n  }): Promise<Post[]> {\n    const { skip, take, cursor, where, orderBy } = params;\n    return this.prisma.post.findMany({\n      skip,\n      take,\n      cursor,\n      where,\n      orderBy,\n    });\n  }\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu metot ile <code>skip<\/code> (atla), <code>take<\/code> (al), <code>where<\/code> (filtreleme) ve <code>orderBy<\/code> (s\u0131ralama) parametrelerini kullanarak esnek sorgular olu\u015fturabilirsiniz. \u00d6rne\u011fin, ilk 10 yay\u0131n\u0131 ba\u015fl\u0131\u011fa g\u00f6re s\u0131ralayarak almak i\u00e7in \u015f\u00f6yle bir \u00e7a\u011fr\u0131 yapabilirsiniz: <code>findPosts({ take: 10, orderBy: { title: &#039;asc&#039; } })<\/code>.<\/p>\n<p><strong>3. Soft Delete Implementasyonu:<\/strong><br \/>\n    Bir\u00e7ok uygulamada, verileri kal\u0131c\u0131 olarak silmek yerine \"yumu\u015fak silme\" (soft delete) yapmak tercih edilir. Bu, veritaban\u0131ndan bir kayd\u0131 fiziksel olarak silmek yerine, <code>deletedAt<\/code> gibi bir zaman damgas\u0131 veya <code>isDeleted<\/code> gibi bir boolean alan\u0131 ayarlayarak kayd\u0131 pasif hale getirmektir. Bu yakla\u015f\u0131m, veri kurtarma i\u015flemlerini kolayla\u015ft\u0131r\u0131r ve denetim izi (audit trail) tutman\u0131za yard\u0131mc\u0131 olur. Prisma, do\u011frudan bir \"soft delete\" \u00f6zelli\u011fi sunmasa da, bunu manuel olarak uygulamak olduk\u00e7a basittir:<\/p>\n<ol>\n<li>\u015eeman\u0131za bir <code>deletedAt<\/code> alan\u0131 ekleyin (<code>DateTime?<\/code>).<\/li>\n<li>Silme i\u015flemlerini bu alan\u0131 g\u00fcncellemekle de\u011fi\u015ftirin.<\/li>\n<li>T\u00fcm sorgular\u0131n\u0131za varsay\u0131lan olarak <code>where: { deletedAt: null }<\/code> filtresini ekleyin veya bir middleware kullanarak bu filtreyi otomatik olarak uygulay\u0131n.<\/li>\n<\/ol>\n<pre><code>\n\/\/ schema.prisma (User modeline eklenecek)\nmodel User {\n  \/\/ ... di\u011fer alanlar\n  deletedAt DateTime?\n}\n\n\/\/ src\/users\/users.service.ts (Soft delete \u00f6rne\u011fi)\nasync softDeleteUser(id: number): Promise<User> {\n  return this.prisma.user.update({\n    where: { id },\n    data: { deletedAt: new Date() },\n  });\n}\n\n\/\/ src\/users\/users.service.ts (Sadece aktif kullan\u0131c\u0131lar\u0131 getirme)\nasync findAllActiveUsers(): Promise<User[]> {\n  return this.prisma.user.findMany({\n    where: { deletedAt: null },\n  });\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu ileri d\u00fczey teknikler, uygulaman\u0131z\u0131n daha sa\u011flam, g\u00fcvenilir ve i\u015flevsel olmas\u0131n\u0131 sa\u011flar. \u00d6zellikle vaka analizi olarak, bir e-ticaret uygulamas\u0131nda sepetten \u00fcr\u00fcn silme veya sipari\u015f tamamlama gibi kritik i\u015flemlerde, transaction kullan\u0131m\u0131 sayesinde veri tutarl\u0131l\u0131\u011f\u0131 sa\u011flanarak m\u00fc\u015fteri deneyimi ve i\u015f s\u00fcre\u00e7leri korunabilir. \u00d6rne\u011fin, bir m\u00fc\u015fteri \u00f6deme yaparken stoktan d\u00fc\u015f\u00fclen \u00fcr\u00fcn adedi ve \u00f6deme kayd\u0131 e\u015f zamanl\u0131 olarak ba\u015far\u0131l\u0131 olmak zorundad\u0131r; aksi takdirde transaction geri al\u0131n\u0131r. Bu, hem m\u00fc\u015fterinin hem de i\u015fletmenin finansal b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc garanti alt\u0131na al\u0131r.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: Karma\u015f\u0131k veri manip\u00fclasyonlar\u0131 ve ili\u015fkisel veritaban\u0131 i\u015flemleri s\u0131ras\u0131nda veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak i\u00e7in Prisma'n\u0131n transaction \u00f6zelliklerini aktif olarak kullan\u0131n. Bu, olas\u0131 tutars\u0131zl\u0131klar\u0131 \u00f6nler ve uygulaman\u0131z\u0131n daha g\u00fcvenilir olmas\u0131n\u0131 sa\u011flar. G\u00fcvenli API geli\u015ftirmede transaction'lar vazge\u00e7ilmezdir.\n    <\/div>\n<h2>Performans Optimizasyonu ve G\u00fcvenlik \u0130pu\u00e7lar\u0131 Nelerdir?<\/h2>\n<p>Bir NestJS ve Prisma uygulamas\u0131n\u0131 geli\u015ftirirken sadece fonksiyonellik de\u011fil, ayn\u0131 zamanda performans ve g\u00fcvenlik de \u00f6n planda tutulmal\u0131d\u0131r. Y\u00fcksek performansl\u0131 ve g\u00fcvenli bir API, kullan\u0131c\u0131 memnuniyetini art\u0131r\u0131r, kaynak t\u00fcketimini optimize eder ve olas\u0131 g\u00fcvenlik zafiyetlerinin \u00f6n\u00fcne ge\u00e7er. \u0130\u015fte bu konularda size yard\u0131mc\u0131 olacak baz\u0131 ipu\u00e7lar\u0131:<\/p>\n<p><strong>1. N+1 Problemi ve \u00c7\u00f6z\u00fcmleri:<\/strong><br \/>\n    N+1 problemi, ili\u015fkili verileri \u00e7ekerken s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan bir performans sorunudur. \u00d6rne\u011fin, 100 kullan\u0131c\u0131y\u0131 ve her kullan\u0131c\u0131n\u0131n g\u00f6nderilerini \u00e7ekmek istedi\u011finizde, \u00f6nce 1 sorgu ile 100 kullan\u0131c\u0131y\u0131 \u00e7eker, ard\u0131ndan her kullan\u0131c\u0131 i\u00e7in ayr\u0131 ayr\u0131 g\u00f6nderilerini \u00e7ekmek \u00fczere 100 ek sorgu g\u00f6nderirseniz, toplamda 101 sorgu \u00e7al\u0131\u015ft\u0131rm\u0131\u015f olursunuz. Bu durum, \u00f6zellikle b\u00fcy\u00fck veri setlerinde performans\u0131 ciddi \u015fekilde d\u00fc\u015f\u00fcrebilir. Prisma, bu sorunu <code>include<\/code> veya <code>select<\/code> \u00f6zellikleriyle \u00e7\u00f6zmenize olanak tan\u0131r.<\/p>\n<pre><code>\n\/\/ src\/users\/users.service.ts (N+1 \u00e7\u00f6z\u00fcm - include kullan\u0131m\u0131)\nasync getUsersWithPosts(): Promise<User[]> {\n  \/\/ Tek bir sorguda kullan\u0131c\u0131lar\u0131 ve ili\u015fkili g\u00f6nderilerini getirir\n  return this.prisma.user.findMany({\n    include: {\n      posts: true, \/\/ Kullan\u0131c\u0131larla birlikte g\u00f6nderileri de dahil et\n    },\n  });\n}\n\n\/\/ Sadece belirli alanlar\u0131 se\u00e7mek i\u00e7in 'select' kullan\u0131m\u0131\nasync getUsersWithPostTitles(): Promise<Pick<User, 'id' | 'name'>[]> {\n  return this.prisma.user.findMany({\n    select: {\n      id: true,\n      name: true,\n      posts: {\n        select: {\n          title: true, \/\/ G\u00f6nderilerden sadece ba\u015fl\u0131klar\u0131 se\u00e7\n        },\n      },\n    },\n  });\n}\n    <\/pre>\n<p><\/code><\/p>\n<p><code>include<\/code> \u00f6zelli\u011fi, ili\u015fkili t\u00fcm verileri \u00e7ekerken, <code>select<\/code> \u00f6zelli\u011fi sadece belirli alanlar\u0131 \u00e7ekerek daha da optimize edilmi\u015f sorgular yapman\u0131z\u0131 sa\u011flar. Performans a\u00e7\u0131s\u0131ndan, ihtiyac\u0131n\u0131z olan minimum veriyi \u00e7ekmeye \u00f6zen g\u00f6sterin.<\/p>\n<p><strong>2. Sorgu Optimizasyonu ve Ba\u011flant\u0131 Havuzlar\u0131:<\/strong><br \/>\n    Prisma, ba\u011flant\u0131 havuzlar\u0131n\u0131 (connection pools) otomatik olarak y\u00f6netir. Bu, her veritaban\u0131 i\u015flemi i\u00e7in yeni bir ba\u011flant\u0131 a\u00e7ma maliyetini ortadan kald\u0131r\u0131r ve performans\u0131 art\u0131r\u0131r. Yine de, uzun s\u00fcren veya \u00e7ok fazla kaynak t\u00fcketen sorgulardan ka\u00e7\u0131nmak i\u00e7in sorgular\u0131n\u0131z\u0131 dikkatli bir \u015fekilde tasarlaman\u0131z \u00f6nemlidir. Karma\u015f\u0131k join'ler veya b\u00fcy\u00fck veri setleri \u00fczerinde full-text search yaparken, veritaban\u0131n\u0131z\u0131n indekslerini do\u011fru kurdu\u011funuzdan emin olun. Prisma Studio, sorgular\u0131n\u0131z\u0131n performans\u0131n\u0131 g\u00f6rsel olarak incelemenize yard\u0131mc\u0131 olabilir.<\/p>\n<p><strong>3. G\u00fcvenlik: Input Validasyon, Yetkilendirme ve Rate Limiting:<\/strong><br \/>\n    API g\u00fcvenli\u011fi, herhangi bir uygulaman\u0131n temel ta\u015f\u0131d\u0131r. NestJS, bu konuda size g\u00fc\u00e7l\u00fc ara\u00e7lar sunar:<\/p>\n<ul>\n<li><strong>Input Validasyon:<\/strong> Gelen t\u00fcm kullan\u0131c\u0131 girdilerini (<code>@Body()<\/code>, <code>@Query()<\/code>, <code>@Param()<\/code>) do\u011frulamak esast\u0131r. NestJS, <code>class-validator<\/code> ve <code>class-transformer<\/code> paketleriyle m\u00fckemmel uyum sa\u011flar. Gelen verinin beklenen formatta, tipte ve uzunlukta oldu\u011fundan emin olun.<\/li>\n<li><strong>Yetkilendirme (AuthGuard):<\/strong> Kimlik do\u011frulama (Authentication) ve yetkilendirme (Authorization), kullan\u0131c\u0131lar\u0131n yaln\u0131zca izinli kaynaklara eri\u015fmesini sa\u011flar. NestJS Guard'lar\u0131 (\u00f6rne\u011fin JWT Guard'lar\u0131) kullanarak, her rotaya eri\u015fimi rol tabanl\u0131 veya izin tabanl\u0131 olarak k\u0131s\u0131tlayabilirsiniz.<\/li>\n<li><strong>Rate Limiting:<\/strong> Bir IP adresinden veya kullan\u0131c\u0131dan belirli bir zaman diliminde gelebilecek istek say\u0131s\u0131n\u0131 s\u0131n\u0131rlamak (rate limiting), DoS (Denial of Service) sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma sa\u011flar. NestJS i\u00e7in <code>@nestjs\/throttler<\/code> gibi paketler bu i\u015flevi kolayca eklemenizi sa\u011flar.<\/li>\n<li><strong>CORS (Cross-Origin Resource Sharing):<\/strong> Taray\u0131c\u0131 tabanl\u0131 istemciler i\u00e7in CORS politikalar\u0131n\u0131 do\u011fru yap\u0131land\u0131rmak, yaln\u0131zca izin verilen kaynaklardan gelen isteklere yan\u0131t vermenizi sa\u011flar.<\/li>\n<li><strong>API Versiyonlama:<\/strong> Mobil uygulamalar gibi farkl\u0131 client'lar i\u00e7in API versiyonlama (<code>\/v1\/users<\/code>, <code>\/v2\/users<\/code>) hem geriye d\u00f6n\u00fck uyumlulu\u011fu korur hem de farkl\u0131 client'lar\u0131n ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131layacak esnekli\u011fi sa\u011flar.<\/li>\n<\/ul>\n<pre><code>\n\/\/ main.ts'te Global ValidationPipe kullan\u0131m\u0131\nimport { ValidationPipe } from '@nestjs\/common';\nimport { NestFactory } from '@nestjs\/core';\nimport { AppModule } from '.\/app.module';\n\nasync function bootstrap() {\n  const app = await NestFactory.create(AppModule);\n  app.useGlobalPipes(new ValidationPipe({\n    whitelist: true, \/\/ Sadece DTO'da tan\u0131ml\u0131 alanlar\u0131 kabul eder\n    forbidNonWhitelisted: true, \/\/ Tan\u0131ml\u0131 olmayan alan gelirse hata verir\n    transform: true, \/\/ Gelen JSON verisini DTO s\u0131n\u0131f\u0131na d\u00f6n\u00fc\u015ft\u00fcr\u00fcr\n  }));\n  \/\/ CORS ayarlar\u0131\n  app.enableCors({\n    origin: 'http:\/\/localhost:3000', \/\/ Sadece bu origin'den gelen isteklere izin ver\n    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',\n    credentials: true,\n  });\n  \/\/ ... di\u011fer ayarlar\n  await app.listen(3000);\n}\nbootstrap();\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu g\u00fcvenlik \u00f6nlemleri, uygulaman\u0131z\u0131n hem web hem de mobil platformlarda g\u00fcvenli ve kararl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. \u00d6zellikle mobil uygulamalar i\u00e7in API'ler tasarlarken, hafif veri transferi, token tabanl\u0131 kimlik do\u011frulama (JWT gibi) ve hata tolerans\u0131 gibi konulara daha fazla dikkat etmek gerekir. Bu sayede, farkl\u0131 client'lar i\u00e7in esnek ve g\u00fcvenilir bir API altyap\u0131s\u0131 sa\u011flam\u0131\u015f olursunuz.<\/p>\n<div class=\"expert-tip\">\n        Uzman \u0130pucu: API'nizi geli\u015ftirirken yaln\u0131zca web taray\u0131c\u0131lar\u0131 i\u00e7in de\u011fil, mobil uygulamalar gibi farkl\u0131 client'lar i\u00e7in de eri\u015filebilir ve g\u00fcvenli oldu\u011fundan emin olun. JWT tabanl\u0131 kimlik do\u011frulama, API versiyonlama ve g\u00fc\u00e7l\u00fc input validasyonu bu noktada kritik \u00f6neme sahiptir. Modern mobil uygulamalar i\u00e7in REST veya GraphQL tabanl\u0131 API'ler tasarlarken bu prensipler vazge\u00e7ilmezdir.\n    <\/div>\n<h2>Yayg\u0131n Sorunlar ve \u00c7\u00f6z\u00fcmleri: NestJS ve Prisma Birlikte \u00c7al\u0131\u015f\u0131rken Kar\u015f\u0131la\u015f\u0131lan Zorluklar<\/h2>\n<p>Her teknoloji kombinasyonunda oldu\u011fu gibi, NestJS ve Prisma birlikte kullan\u0131l\u0131rken de geli\u015ftiricilerin kar\u015f\u0131la\u015fabilece\u011fi baz\u0131 yayg\u0131n sorunlar ve bu sorunlar\u0131n \u00e7\u00f6z\u00fcmleri vard\u0131r. Bu b\u00f6l\u00fcmde, s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan zorluklar\u0131 ele alacak ve sorunsuz bir geli\u015ftirme deneyimi i\u00e7in pratik \u00e7\u00f6z\u00fcmler sunaca\u011f\u0131z.<\/p>\n<p><strong>1. <code>DATABASE_URL<\/code> Ortam De\u011fi\u015fkeni Problemleri:<\/strong><br \/>\n    En s\u0131k kar\u015f\u0131la\u015f\u0131lan sorunlardan biri, Prisma'n\u0131n veritaban\u0131 ba\u011flant\u0131 dizgesini bulamamas\u0131d\u0131r. Bu genellikle <code>.env<\/code> dosyas\u0131n\u0131n yanl\u0131\u015f yap\u0131land\u0131r\u0131lmas\u0131ndan veya <code>dotenv<\/code> paketinin d\u00fczg\u00fcn \u015fekilde y\u00fcklenmemesinden kaynaklan\u0131r.<\/p>\n<ul>\n<li><strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>.env<\/code> dosyan\u0131z\u0131n projenizin k\u00f6k dizininde oldu\u011fundan ve <code>DATABASE_URL<\/code> de\u011fi\u015fkeninin do\u011fru bir ba\u011flant\u0131 dizgesi i\u00e7erdi\u011finden emin olun. NestJS uygulaman\u0131zda <code>dotenv<\/code>'i en erken a\u015famada y\u00fckledi\u011finizden emin olun (genellikle <code>main.ts<\/code> dosyas\u0131n\u0131n ba\u015f\u0131nda). Prisma CLI komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131rken de <code>.env<\/code> dosyas\u0131n\u0131n varl\u0131\u011f\u0131ndan emin olun.<\/li>\n<li><strong>\u0130pucu:<\/strong> Prisma CLI komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmadan \u00f6nce (\u00f6rne\u011fin <code>npx prisma migrate dev<\/code>), <code>dotenv<\/code>'i y\u00fcklemek i\u00e7in <code>npm install -g dotenv-cli<\/code> komutuyla <code>dotenv-cli<\/code> paketini kurup <code>dotenv -e .env -- npx prisma migrate dev<\/code> \u015feklinde \u00e7al\u0131\u015ft\u0131rmak da bir \u00e7\u00f6z\u00fcm olabilir.<\/li>\n<\/ul>\n<p><strong>2. Schema Senkronizasyon Sorunlar\u0131 (Prisma Client G\u00fcncelleme):<\/strong><br \/>\n    <code>schema.prisma<\/code> dosyas\u0131nda bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda (yeni bir model eklemek, bir alan\u0131n tipini de\u011fi\u015ftirmek vb.), bu de\u011fi\u015fikliklerin Prisma istemcisine yans\u0131mas\u0131 ve veritaban\u0131na uygulanmas\u0131 gerekir. Bu ad\u0131m\u0131n unutulmas\u0131, \"model bulunamad\u0131\" veya \"alan tan\u0131ml\u0131 de\u011fil\" gibi hatalara yol a\u00e7abilir.<\/p>\n<ul>\n<li><strong>\u00c7\u00f6z\u00fcm:<\/strong> Her <code>schema.prisma<\/code> de\u011fi\u015fikli\u011finden sonra <code>npx prisma generate<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak Prisma istemcisini yeniden olu\u015fturun. Veritaban\u0131na \u015fema de\u011fi\u015fikliklerini uygulamak i\u00e7in ise <code>npx prisma migrate dev<\/code> komutunu kullan\u0131n. Bu iki komutun s\u0131ras\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131, hem kodunuzdaki tip g\u00fcvenli\u011finin korunmas\u0131n\u0131 hem de veritaban\u0131n\u0131z\u0131n g\u00fcncel kalmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p><strong>3. <code>node_modules<\/code> \u0130\u00e7indeki <code>prisma<\/code> Klas\u00f6r\u00fc Sorunlar\u0131:<\/strong><br \/>\n    Bazen <code>node_modules\/@prisma\/client\/<\/code> dizinindeki Prisma engine ikili dosyalar\u0131yla ilgili sorunlar ya\u015fanabilir (\u00f6rne\u011fin farkl\u0131 i\u015fletim sistemlerinde da\u011f\u0131t\u0131m veya CI\/CD ortamlar\u0131nda). Bu, genellikle \"binary not found\" hatalar\u0131na yol a\u00e7ar.<\/p>\n<ul>\n<li><strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>prisma<\/code> ve <code>@prisma\/client<\/code> paketlerini do\u011fru bir \u015fekilde y\u00fckledi\u011finizden emin olun. E\u011fer bu t\u00fcr bir hata al\u0131rsan\u0131z, <code>npm uninstall @prisma\/client prisma<\/code> ve ard\u0131ndan <code>npm install @prisma\/client prisma<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rarak paketleri yeniden y\u00fcklemeyi deneyin. Ayr\u0131ca <code>package.json<\/code> dosyas\u0131nda <code>prisma<\/code> ve <code>@prisma\/client<\/code>'\u0131n do\u011fru versiyonlarda oldu\u011fundan emin olun.<\/li>\n<\/ul>\n<p><strong>4. Hata Loglama ve \u0130zleme:<\/strong><br \/>\n    \u00dcretim ortamlar\u0131nda hatalar\u0131 h\u0131zl\u0131ca tespit etmek ve \u00e7\u00f6zmek i\u00e7in etkili loglama ve izleme sistemleri kurmak hayati \u00f6neme sahiptir. NestJS ve Prisma, zengin loglama se\u00e7enekleri sunar.<\/p>\n<ul>\n<li><strong>\u00c7\u00f6z\u00fcm:<\/strong> PrismaService'inizde <code>log: [&#039;query&#039;, &#039;info&#039;, &#039;warn&#039;, &#039;error&#039;]<\/code> ayar\u0131n\u0131 etkinle\u015ftirerek Prisma'n\u0131n veritaban\u0131 sorgular\u0131n\u0131 ve di\u011fer olaylar\u0131 konsola yazmas\u0131n\u0131 sa\u011flayabilirsiniz. NestJS'in kendi <code>Logger<\/code> servisini kullanarak uygulama seviyesindeki loglar\u0131 y\u00f6netebilir ve bunlar\u0131 Sentry, Winston veya Pino gibi profesyonel loglama ara\u00e7lar\u0131na y\u00f6nlendirebilirsiniz. Bu, hatalar\u0131 ve performans sorunlar\u0131n\u0131 proaktif olarak izlemenizi sa\u011flar.<\/li>\n<\/ul>\n<p><strong>Ger\u00e7ek D\u00fcnya Vaka Analizi: E-ticaret Sepeti Kilitlenmesi<\/strong><br \/>\n    Bir e-ticaret uygulamas\u0131nda \"\u00fcr\u00fcn stok g\u00fcncelleme\" senaryosunda yayg\u0131n bir sorunla kar\u015f\u0131la\u015fabiliriz. M\u00fc\u015fteri sepete bir \u00fcr\u00fcn ekledi\u011finde veya sipari\u015f verdi\u011finde, \u00fcr\u00fcn\u00fcn sto\u011funun g\u00fcncellenmesi gerekir. E\u011fer birden fazla m\u00fc\u015fteri ayn\u0131 \u00fcr\u00fcn\u00fc ayn\u0131 anda almaya \u00e7al\u0131\u015f\u0131rsa, veritaban\u0131nda \"kilitlenme\" (deadlock) veya yanl\u0131\u015f stok g\u00fcncelleme (race condition) sorunlar\u0131 ya\u015fanabilir. \u00d6rne\u011fin, A kullan\u0131c\u0131s\u0131 \u00fcr\u00fcn\u00fc sepete ekledi, stok de\u011feri X'ten X-1'e d\u00fc\u015fecek. Tam bu anda B kullan\u0131c\u0131s\u0131 da ayn\u0131 \u00fcr\u00fcn\u00fc sepete ekledi. E\u011fer transaction'lar ve do\u011fru kilit mekanizmalar\u0131 kullan\u0131lmazsa, iki i\u015flem de X'ten X-1'e d\u00fc\u015f\u00fcrme i\u015flemini yapabilir, ancak bu, sto\u011fu X-2 yerine X-1 olarak b\u0131rakabilir veya bir kilitlenme ya\u015fanabilir.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> Bu t\u00fcr senaryolarda Prisma'n\u0131n transaction \u00f6zelliklerini kullanmak ve m\u00fcmk\u00fcnse veritaban\u0131 seviyesinde \"optimistic locking\" veya \"pessimistic locking\" mekanizmalar\u0131n\u0131 devreye sokmak esast\u0131r. <code>PrismaService<\/code> i\u00e7inde bir <code>$transaction<\/code> kullanarak stok d\u00fc\u015f\u00fcrme ve sipari\u015f olu\u015fturma ad\u0131mlar\u0131n\u0131 atomik hale getirebiliriz. \u00d6rne\u011fin:<\/p>\n<pre><code>\n\/\/ products.service.ts\nasync purchaseProduct(productId: number, quantity: number, userId: number) {\n  return this.prisma.$transaction(async (tx) => {\n    \/\/ 1. \u00dcr\u00fcn\u00fc kilitle (burada manuel bir yakla\u015f\u0131m veya veritaban\u0131 kilidi sim\u00fclasyonu)\n    const product = await tx.product.findUnique({\n      where: { id: productId },\n      \/\/ select: { stock: true, version: true }, \/\/ Versiyon alan\u0131 optimistic locking i\u00e7in\n    });\n\n    if (!product || product.stock < quantity) {\n      throw new Error('Yeterli stok yok veya \u00fcr\u00fcn bulunamad\u0131.');\n    }\n\n    \/\/ 2. Stok g\u00fcncellemesi\n    const updatedProduct = await tx.product.update({\n      where: { id: productId },\n      data: {\n        stock: { decrement: quantity },\n        \/\/ version: { increment: 1 }, \/\/ Optimistic locking i\u00e7in versiyon g\u00fcncellemesi\n      },\n    });\n\n    \/\/ 3. Sipari\u015f kayd\u0131 olu\u015fturma\n    await tx.order.create({\n      data: {\n        userId,\n        productId,\n        quantity,\n        totalPrice: updatedProduct.price * quantity,\n      },\n    });\n\n    return updatedProduct;\n  }, {\n    maxWait: 5000, \/\/ Transaction'\u0131n bekleme s\u00fcresi\n    timeout: 10000, \/\/ Transaction'\u0131n tamamlanma s\u00fcresi\n  });\n}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu vaka analizinde, <code>$transaction<\/code> sayesinde stok g\u00fcncelleme ve sipari\u015f olu\u015fturma i\u015flemleri tek bir atomik birim olarak ele al\u0131n\u0131r. B\u00f6ylece, e\u015fzamanl\u0131 isteklerde bile veri b\u00fct\u00fcnl\u00fc\u011f\u00fc sa\u011flan\u0131r ve tutars\u0131z stok durumlar\u0131n\u0131n veya eksik sipari\u015f kay\u0131tlar\u0131n\u0131n \u00f6n\u00fcne ge\u00e7ilir. Bu t\u00fcr pratik \u00e7\u00f6z\u00fcmler, uygulaman\u0131z\u0131n \u00fcretim ortam\u0131nda kararl\u0131 ve g\u00fcvenilir \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Sonu\u00e7: Gelecek Nesil API'ler i\u00e7in NestJS ve Prisma<\/h2>\n<p>Bu kapsaml\u0131 rehber boyunca, NestJS ve Prisma'n\u0131n g\u00fc\u00e7l\u00fc d\u00fcnyas\u0131na derinlemesine bir yolculuk yapt\u0131k. S\u0131f\u0131rdan bir NestJS projesi olu\u015fturmaktan, Prisma ile veritaban\u0131 \u015femas\u0131n\u0131 tasarlamaya, migrasyonlar\u0131 y\u00f6netmeye, geli\u015fmi\u015f sorgular yapmaya ve hatta karma\u015f\u0131k senaryolarda transaction'lar\u0131 kullanmaya kadar bir\u00e7ok konuyu ele ald\u0131k. Ayr\u0131ca, performans optimizasyonu i\u00e7in N+1 sorununu \u00e7\u00f6zme yollar\u0131n\u0131 ve API'mizi g\u00fcvende tutmak i\u00e7in temel g\u00fcvenlik uygulamalar\u0131n\u0131 inceledik. Kar\u015f\u0131la\u015f\u0131labilecek yayg\u0131n sorunlara ve ger\u00e7ek d\u00fcnya vaka analizleriyle bu sorunlar\u0131n pratik \u00e7\u00f6z\u00fcmlerine de de\u011findik.<\/p>\n<p>NestJS'in sa\u011flam, mod\u00fcler ve TypeScript tabanl\u0131 mimarisi ile Prisma'n\u0131n tip g\u00fcvenli, sezgisel ve g\u00fc\u00e7l\u00fc veritaban\u0131 ara\u00e7 tak\u0131m\u0131 bir araya geldi\u011finde, geli\u015ftiricilere inan\u0131lmaz bir verimlilik ve g\u00fcvenilirlik sunar. Bu kombinasyon, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar, mikroservis mimarileri ve y\u00fcksek performans gerektiren API'ler geli\u015ftirmek isteyenler i\u00e7in ideal bir se\u00e7enektir. Kod tekrar\u0131n\u0131 azalt\u0131r, hata oran\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr ve uzun vadede uygulaman\u0131z\u0131n bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Gelecek nesil API'ler in\u015fa ederken, geli\u015ftirici deneyimini en \u00fcst d\u00fczeye \u00e7\u0131karan ve veri katman\u0131 y\u00f6netimini basitle\u015ftiren ara\u00e7lara sahip olmak kritik \u00f6neme sahiptir. NestJS ve Prisma, bu ihtiya\u00e7lar\u0131 fazlas\u0131yla kar\u015f\u0131layan, modern web geli\u015ftirme y\u0131\u011f\u0131nlar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015ftir. Bu rehberdeki bilgileri ve \u00f6rnekleri kendi projelerinizde deneyerek, hem geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131rabilir hem de daha sa\u011flam ve \u00f6l\u00e7eklenebilir uygulamalar olu\u015fturabilirsiniz. Unutmay\u0131n, iyi bir ba\u015flang\u0131\u00e7 ve do\u011fru ara\u00e7 se\u00e7imi, projenizin ba\u015far\u0131s\u0131n\u0131n anahtar\u0131d\u0131r. \u015eimdiden ba\u015far\u0131lar!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>NestJS ile Prisma kullanmak performans\u0131 nas\u0131l etkiler?<\/dt>\n<dd>Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda Prisma, performans\u0131 art\u0131rabilir. Otomatik sorgu optimizasyonu, ba\u011flant\u0131 havuzu y\u00f6netimi ve tip g\u00fcvenli\u011fi sayesinde hatalar azal\u0131r, bu da dolayl\u0131 olarak performansa olumlu yans\u0131r. \u00d6zellikle N+1 sorununu <code>include<\/code> veya <code>select<\/code> ile \u00e7\u00f6zmek, gereksiz veritaban\u0131 sorgular\u0131n\u0131 \u00f6nleyerek performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. Ancak, k\u00f6t\u00fc tasarlanm\u0131\u015f \u015femalar veya optimize edilmemi\u015f sorgular her ORM\/ara\u00e7ta oldu\u011fu gibi Prisma'da da performans\u0131 d\u00fc\u015f\u00fcrebilir.<\/dd>\n<dt>Prisma'n\u0131n geleneksel ORM'lerden fark\u0131 nedir?<\/dt>\n<dd>Prisma, tip g\u00fcvenli bir veritaban\u0131 istemcisi olmas\u0131n\u0131n yan\u0131 s\u0131ra, bir veritaban\u0131 migrasyon arac\u0131 ve veritaban\u0131 \u015femas\u0131 olu\u015fturma arac\u0131d\u0131r. Geleneksel ORM'ler (\u00f6rn. TypeORM, Sequelize) genellikle sadece nesne-ili\u015fkisel e\u015fleme (Object-Relational Mapping) sa\u011flarken, Prisma veritaban\u0131 ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fcn (\u015fema tasar\u0131m\u0131, migrasyonlar, sorgulama, tip g\u00fcvenli\u011fi) daha geni\u015f bir k\u0131sm\u0131n\u0131 kapsar. TypeScript ile olan entegrasyonu ve otomatik client olu\u015fturmas\u0131, geli\u015ftirici deneyimini ve hata yakalama yetene\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/dd>\n<dt>Mevcut bir NestJS projesine Prisma nas\u0131l entegre edilir?<\/dt>\n<dd>Mevcut bir projeye entegrasyon, bu rehberdeki ad\u0131mlara benzer \u015fekilde ilerler: \u00d6ncelikle <code>prisma<\/code> ve <code>@prisma\/client<\/code> paketlerini projenize y\u00fckleyin. Ard\u0131ndan <code>npx prisma init<\/code> ile \u015fema dosyan\u0131z\u0131 ba\u015flat\u0131n ve veritaban\u0131 ba\u011flant\u0131 dizgenizi <code>.env<\/code>'ye ekleyin. Sonra bir <code>PrismaService<\/code> olu\u015fturun ve bu servisi <code>PrismaModule<\/code> \u00fczerinden uygulaman\u0131zdaki di\u011fer mod\u00fcllere enjekte edin. \u015eema ve migrasyon s\u00fcre\u00e7leri, yeni projelerle ayn\u0131 \u015fekilde i\u015fler. Mevcut servislerinizi, <code>PrismaService<\/code>'i kullanarak veritaban\u0131 i\u015flemleri yapacak \u015fekilde g\u00fcncelleyin.<\/dd>\n<dt>Prisma ile birden fazla veritaban\u0131 kullanabilir miyim?<\/dt>\n<dd>Evet, Prisma birden fazla veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 destekler. Bunu yapmak i\u00e7in, her veritaban\u0131 i\u00e7in ayr\u0131 bir <code>datasource<\/code> tan\u0131m\u0131 ve farkl\u0131 bir <code>generator<\/code> yap\u0131land\u0131rmas\u0131 ile birden fazla <code>schema.prisma<\/code> dosyas\u0131 olu\u015fturabilirsiniz (\u00f6rne\u011fin <code>schema.primary.prisma<\/code>, <code>schema.analytics.prisma<\/code>). Daha sonra, her \u015fema i\u00e7in ayr\u0131 bir Prisma istemcisi olu\u015fturup, bunlar\u0131 uygulaman\u0131zda gerekti\u011fi \u015fekilde enjekte ederek farkl\u0131 veritabanlar\u0131na ba\u011flanabilirsiniz. Bu, mikroservis mimarilerinde veya farkl\u0131 veri depolama ihtiya\u00e7lar\u0131 olan uygulamalarda olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r.<\/dd>\n<dt>NestJS ve Prisma i\u00e7in test stratejileri nelerdir?<\/dt>\n<dd>NestJS ve Prisma kombinasyonuyla test yazmak i\u00e7in farkl\u0131 stratejiler mevcuttur.<\/p>\n<ul>\n<li><strong>Unit Testler:<\/strong> <code>PrismaService<\/code>'i mock'layarak servis ve controller'lar\u0131n\u0131z\u0131 izole bir \u015fekilde test edebilirsiniz. Jest gibi test framework'leri ile kolayca mock objeler olu\u015fturabilirsiniz.<\/li>\n<li><strong>Entegrasyon Testleri:<\/strong> Ger\u00e7ek bir veritaban\u0131 (\u00f6rne\u011fin Docker konteyneri i\u00e7inde ge\u00e7ici bir test veritaban\u0131) kullanarak entegrasyon testleri yapabilirsiniz. Her testten \u00f6nce veya sonra veritaban\u0131n\u0131 temizleyerek test ortam\u0131n\u0131n tutarl\u0131 kalmas\u0131n\u0131 sa\u011flayabilirsiniz.<\/li>\n<li><strong>E2E Testleri:<\/strong> Tam bir uygulama ak\u0131\u015f\u0131n\u0131 test etmek i\u00e7in E2E (u\u00e7tan uca) testleri yazabilirsiniz. <code>NestFactory.create()<\/code> ile bir test uygulamas\u0131 olu\u015fturup, ger\u00e7ek HTTP istekleri g\u00f6ndererek uygulaman\u0131n t\u00fcm katmanlar\u0131n\u0131 test edebilirsiniz.<\/li>\n<\/ul>\n<p>        Bu yakla\u015f\u0131mlar\u0131n kombinasyonu, uygulaman\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131 ve g\u00fcvenilirli\u011fini garanti alt\u0131na alman\u0131za yard\u0131mc\u0131 olur.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web geli\u015ftirme s\u00fcre\u00e7lerinde NestJS ve Prisma ikilisini kullanarak veritaban\u0131 i\u015flemlerini basitle\u015ftirmek mi istiyorsunuz? Bu kapsaml\u0131 rehber, NestJS&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-34568","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>NestJS ve Prisma Kurulumu: Sorunsuz Bir Entegrasyon Rehberi<\/title>\n<meta name=\"description\" content=\"Modern web geli\u015ftirme s\u00fcre\u00e7lerinde NestJS ve Prisma ikilisini kullanarak veritaban\u0131 i\u015flemlerini basitle\u015ftirmek mi istiyorsunuz? Bu kapsaml\u0131 rehber, NestJS uygulaman\u0131z\u0131 Prisma ile ad\u0131m ad\u0131m nas\u0131l entegre edece\u011finizi, kar\u015f\u0131la\u015f\u0131labilecek yayg\u0131n zorluklar\u0131n \u00fcstesinden nas\u0131l gelece\u011finizi ve geli\u015ftirme deneyiminizi nas\u0131l iyile\u015ftirece\u011finizi detayl\u0131 bir \u015fekilde a\u00e7\u0131kl\u0131yor. Art\u0131k veritaban\u0131 entegrasyonu ba\u015f a\u011fr\u0131s\u0131 olmaktan \u00e7\u0131kacak!\" \/>\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\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"NestJS ve Prisma Kurulumu: Sorunsuz Bir Entegrasyon Rehberi\" \/>\n<meta property=\"og:description\" content=\"Modern web geli\u015ftirme s\u00fcre\u00e7lerinde NestJS ve Prisma ikilisini kullanarak veritaban\u0131 i\u015flemlerini basitle\u015ftirmek mi istiyorsunuz? Bu kapsaml\u0131 rehber, NestJS uygulaman\u0131z\u0131 Prisma ile ad\u0131m ad\u0131m nas\u0131l entegre edece\u011finizi, kar\u015f\u0131la\u015f\u0131labilecek yayg\u0131n zorluklar\u0131n \u00fcstesinden nas\u0131l gelece\u011finizi ve geli\u015ftirme deneyiminizi nas\u0131l iyile\u015ftirece\u011finizi detayl\u0131 bir \u015fekilde a\u00e7\u0131kl\u0131yor. Art\u0131k veritaban\u0131 entegrasyonu ba\u015f a\u011fr\u0131s\u0131 olmaktan \u00e7\u0131kacak!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-18T21:31:27+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=\"30 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"NestJS ve Prisma Kurulumu: Sorunsuz Bir Entegrasyon Rehberi\",\"datePublished\":\"2025-11-18T21:31:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/\"},\"wordCount\":4744,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/\",\"name\":\"NestJS ve Prisma Kurulumu: Sorunsuz Bir Entegrasyon Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-18T21:31:27+00:00\",\"description\":\"Modern web geli\u015ftirme s\u00fcre\u00e7lerinde NestJS ve Prisma ikilisini kullanarak veritaban\u0131 i\u015flemlerini basitle\u015ftirmek mi istiyorsunuz? Bu kapsaml\u0131 rehber, NestJS uygulaman\u0131z\u0131 Prisma ile ad\u0131m ad\u0131m nas\u0131l entegre edece\u011finizi, kar\u015f\u0131la\u015f\u0131labilecek yayg\u0131n zorluklar\u0131n \u00fcstesinden nas\u0131l gelece\u011finizi ve geli\u015ftirme deneyiminizi nas\u0131l iyile\u015ftirece\u011finizi detayl\u0131 bir \u015fekilde a\u00e7\u0131kl\u0131yor. Art\u0131k veritaban\u0131 entegrasyonu ba\u015f a\u011fr\u0131s\u0131 olmaktan \u00e7\u0131kacak!\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"NestJS ve Prisma Kurulumu: Sorunsuz Bir Entegrasyon Rehberi\"}]},{\"@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":"NestJS ve Prisma Kurulumu: Sorunsuz Bir Entegrasyon Rehberi","description":"Modern web geli\u015ftirme s\u00fcre\u00e7lerinde NestJS ve Prisma ikilisini kullanarak veritaban\u0131 i\u015flemlerini basitle\u015ftirmek mi istiyorsunuz? Bu kapsaml\u0131 rehber, NestJS uygulaman\u0131z\u0131 Prisma ile ad\u0131m ad\u0131m nas\u0131l entegre edece\u011finizi, kar\u015f\u0131la\u015f\u0131labilecek yayg\u0131n zorluklar\u0131n \u00fcstesinden nas\u0131l gelece\u011finizi ve geli\u015ftirme deneyiminizi nas\u0131l iyile\u015ftirece\u011finizi detayl\u0131 bir \u015fekilde a\u00e7\u0131kl\u0131yor. Art\u0131k veritaban\u0131 entegrasyonu ba\u015f a\u011fr\u0131s\u0131 olmaktan \u00e7\u0131kacak!","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\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"NestJS ve Prisma Kurulumu: Sorunsuz Bir Entegrasyon Rehberi","og_description":"Modern web geli\u015ftirme s\u00fcre\u00e7lerinde NestJS ve Prisma ikilisini kullanarak veritaban\u0131 i\u015flemlerini basitle\u015ftirmek mi istiyorsunuz? Bu kapsaml\u0131 rehber, NestJS uygulaman\u0131z\u0131 Prisma ile ad\u0131m ad\u0131m nas\u0131l entegre edece\u011finizi, kar\u015f\u0131la\u015f\u0131labilecek yayg\u0131n zorluklar\u0131n \u00fcstesinden nas\u0131l gelece\u011finizi ve geli\u015ftirme deneyiminizi nas\u0131l iyile\u015ftirece\u011finizi detayl\u0131 bir \u015fekilde a\u00e7\u0131kl\u0131yor. Art\u0131k veritaban\u0131 entegrasyonu ba\u015f a\u011fr\u0131s\u0131 olmaktan \u00e7\u0131kacak!","og_url":"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-18T21:31:27+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"30 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"NestJS ve Prisma Kurulumu: Sorunsuz Bir Entegrasyon Rehberi","datePublished":"2025-11-18T21:31:27+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/"},"wordCount":4744,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/","name":"NestJS ve Prisma Kurulumu: Sorunsuz Bir Entegrasyon Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-18T21:31:27+00:00","description":"Modern web geli\u015ftirme s\u00fcre\u00e7lerinde NestJS ve Prisma ikilisini kullanarak veritaban\u0131 i\u015flemlerini basitle\u015ftirmek mi istiyorsunuz? Bu kapsaml\u0131 rehber, NestJS uygulaman\u0131z\u0131 Prisma ile ad\u0131m ad\u0131m nas\u0131l entegre edece\u011finizi, kar\u015f\u0131la\u015f\u0131labilecek yayg\u0131n zorluklar\u0131n \u00fcstesinden nas\u0131l gelece\u011finizi ve geli\u015ftirme deneyiminizi nas\u0131l iyile\u015ftirece\u011finizi detayl\u0131 bir \u015fekilde a\u00e7\u0131kl\u0131yor. Art\u0131k veritaban\u0131 entegrasyonu ba\u015f a\u011fr\u0131s\u0131 olmaktan \u00e7\u0131kacak!","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/nestjs-ve-prisma-kurulumu-sorunsuz-bir-entegrasyon-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"NestJS ve Prisma Kurulumu: Sorunsuz Bir Entegrasyon Rehberi"}]},{"@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\/34568","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=34568"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34568\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}