{"id":33478,"date":"2025-11-03T09:40:57","date_gmt":"2025-11-03T06:40:57","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33478"},"modified":"2025-11-03T09:40:57","modified_gmt":"2025-11-03T06:40:57","slug":"graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/","title":{"rendered":"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans"},"content":{"rendered":"<p><body><\/p>\n<h2>GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans<\/h2>\n<p>GraphQL, modern API geli\u015ftirme d\u00fcnyas\u0131nda veri sorgulama ve manip\u00fclasyonu i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir yakla\u015f\u0131m sunar. Geleneksel RESTful API&#8217;lerin aksine, GraphQL istemcilerin tam olarak ihtiya\u00e7 duyduklar\u0131 veriyi tek bir istekte almalar\u0131na olanak tan\u0131r, bu da a\u015f\u0131r\u0131 veya eksik veri getirme sorunlar\u0131n\u0131 ortadan kald\u0131r\u0131r. Ancak GraphQL&#8217;in bu g\u00fcc\u00fc, temelinde yatan iyi tan\u0131mlanm\u0131\u015f bir s\u00f6zle\u015fmeye, yani \u015eema Tan\u0131mlama Dili&#8217;ne (Schema Definition Language &#8211; SDL) dayan\u0131r. SDL, GraphQL API&#8217;nizin yap\u0131s\u0131n\u0131, mevcut veri tiplerini, sorgulanabilir alanlar\u0131 ve veri manip\u00fclasyonu (mutasyonlar) i\u00e7in kullan\u0131lacak y\u00f6ntemleri a\u00e7\u0131k\u00e7a belirten dilden ba\u011f\u0131ms\u0131z bir formatt\u0131r.<\/p>\n<p>Bu makale, GraphQL SDL&#8217;in derinlemesine bir referans\u0131n\u0131 sunmay\u0131 ama\u00e7lamaktad\u0131r. SDL&#8217;in temel yap\u0131 ta\u015flar\u0131ndan ba\u015flayarak, farkl\u0131 tip tan\u0131mlamalar\u0131na, alanlara, arg\u00fcmanlara, y\u00f6nergelere ve geli\u015fmi\u015f kavramlara kadar her bir bile\u015feni ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceleyece\u011fiz. SDL&#8217;in nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, API&#8217;nizin nas\u0131l \u015fekillendi\u011fini ve bu dilin GraphQL ekosistemindeki merkezi rol\u00fcn\u00fc anlamak, hem API sa\u011flay\u0131c\u0131lar\u0131 hem de t\u00fcketicileri i\u00e7in kritik \u00f6neme sahiptir. \u0130ster yeni bir GraphQL API tasarl\u0131yor olun, ister mevcut bir API&#8217;yi anlamaya \u00e7al\u0131\u015f\u0131n, bu kapsaml\u0131 rehber SDL&#8217;in inceliklerini kavraman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>GraphQL SDL&#8217;in Temel Kavramlar\u0131<\/h3>\n<p>GraphQL SDL, bir GraphQL hizmetinin sundu\u011fu t\u00fcm veri ve i\u015flemlerin formal bir tan\u0131m\u0131n\u0131 sa\u011flar. Bu tan\u0131m, istemcinin API ile nas\u0131l etkile\u015fim kurabilece\u011fini belirleyen bir s\u00f6zle\u015fme g\u00f6revi g\u00f6r\u00fcr. SDL&#8217;in temelinde, bir API&#8217;nin hangi sorgular\u0131 kabul edebilece\u011fini, hangi verileri d\u00f6nd\u00fcrebilece\u011fini ve hangi de\u011fi\u015fiklikleri yapabilece\u011fini a\u00e7\u0131klayan bir dizi tip tan\u0131m\u0131 bulunur.<\/p>\n<h4>\u015eema (Schema)<\/h4>\n<p>Bir GraphQL SDL belgesinin k\u00f6k\u00fcnde <code>schema<\/code> tan\u0131m\u0131 bulunur. Bu tan\u0131m, API&#8217;nizin ana giri\u015f noktalar\u0131n\u0131 belirtir: sorgular (<code>query<\/code>), mutasyonlar (<code>mutation<\/code>) ve abonelikler (<code>subscription<\/code>). Her bir giri\u015f noktas\u0131, belirli bir nesne tipine i\u015faret eder ve bu nesne tipleri arac\u0131l\u0131\u011f\u0131yla API&#8217;nin sundu\u011fu t\u00fcm i\u015flemlere eri\u015filir.<\/p>\n<pre><code class=\"language-graphql\">schema {\n  query: Query\n  mutation: Mutation\n  subscription: Subscription\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>Query<\/code>, <code>Mutation<\/code> ve <code>Subscription<\/code> ad\u0131nda \u00fc\u00e7 farkl\u0131 nesne tipi tan\u0131mlanm\u0131\u015f ve bunlar API&#8217;nin ana giri\u015f noktalar\u0131 olarak belirlenmi\u015ftir. <code>Query<\/code> tipi, veri okuma i\u015flemleri i\u00e7in, <code>Mutation<\/code> tipi veri yazma veya de\u011fi\u015ftirme i\u015flemleri i\u00e7in, <code>Subscription<\/code> tipi ise ger\u00e7ek zamanl\u0131 veri ak\u0131\u015flar\u0131 i\u00e7in kullan\u0131l\u0131r. Bir \u015fema tan\u0131m\u0131nda t\u00fcm bu \u00fc\u00e7 giri\u015f noktas\u0131n\u0131n bulunmas\u0131 zorunlu de\u011fildir; \u00f6rne\u011fin, sadece veri okuma yapan bir API yaln\u0131zca <code>query<\/code> giri\u015f noktas\u0131na sahip olabilir.<\/p>\n<h4>Tipler (Types)<\/h4>\n<p>Tipler, GraphQL SDL&#8217;in temel yap\u0131 ta\u015flar\u0131d\u0131r ve API&#8217;nizin d\u00f6nd\u00fcrebilece\u011fi veya kabul edebilece\u011fi t\u00fcm veri yap\u0131lar\u0131n\u0131 tan\u0131mlar. GraphQL, farkl\u0131 ihtiya\u00e7lar i\u00e7in \u00e7e\u015fitli tip kategorileri sunar.<\/p>\n<h5>Nesne Tipleri (Object Types)<\/h5>\n<p>Nesne tipleri, GraphQL \u015femas\u0131n\u0131n en yayg\u0131n ve temel bile\u015fenleridir. Bunlar, bir sistemdeki belirli bir varl\u0131\u011f\u0131 (\u00f6rne\u011fin, bir kullan\u0131c\u0131, bir \u00fcr\u00fcn, bir g\u00f6nderi) temsil eder ve bu varl\u0131\u011f\u0131n sahip oldu\u011fu alanlar\u0131 tan\u0131mlar. Her alan\u0131n bir ad\u0131 ve bir tipi vard\u0131r.<\/p>\n<pre><code class=\"language-graphql\">type User {\n  id: ID!\n  name: String!\n  email: String\n  posts: [Post!]!\n  createdAt: DateTime!\n}<\/code><\/pre>\n<p>Yukar\u0131daki <code>User<\/code> nesne tipi \u00f6rne\u011finde:<br \/>\n*   <code>id<\/code>: <code>ID!<\/code> tipinde bir alan. <code>ID<\/code> GraphQL&#8217;in yerle\u015fik bir skaler tipidir ve benzersiz tan\u0131mlay\u0131c\u0131lar\u0131 temsil eder. Sondaki <code>!<\/code> i\u015fareti, bu alan\u0131n bo\u015f (null) olamayaca\u011f\u0131n\u0131, yani her zaman bir de\u011fer i\u00e7ermesi gerekti\u011fini belirtir.<br \/>\n*   <code>name<\/code>: <code>String!<\/code> tipinde bir alan, yine bo\u015f olamaz.<br \/>\n*   <code>email<\/code>: <code>String<\/code> tipinde bir alan. <code>!<\/code> i\u015fareti olmad\u0131\u011f\u0131 i\u00e7in bu alan\u0131n bo\u015f olabilece\u011fi anlam\u0131na gelir.<br \/>\n*   <code>posts<\/code>: <code>[Post!]!<\/code> tipinde bir alan. Bu, <code>Post<\/code> nesne tiplerinden olu\u015fan bir liste oldu\u011funu g\u00f6sterir. \u0130\u00e7teki <code>!<\/code> i\u015fareti, listenin elemanlar\u0131n\u0131n bo\u015f olamayaca\u011f\u0131n\u0131 (yani her postun bir de\u011feri olmal\u0131) belirtirken, d\u0131\u015ftaki <code>!<\/code> i\u015fareti, listenin kendisinin bo\u015f olamayaca\u011f\u0131n\u0131 (yani her zaman bir liste d\u00f6necek, bo\u015f bir liste bile olsa) g\u00f6sterir.<br \/>\n*   <code>createdAt<\/code>: <code>DateTime!<\/code> tipinde bir alan. <code>DateTime<\/code> burada \u00f6zel (custom) bir skaler tip olabilir.<\/p>\n<p>Nesne tipleri aras\u0131ndaki ili\u015fkiler de alanlar arac\u0131l\u0131\u011f\u0131yla tan\u0131mlan\u0131r. \u00d6rne\u011fin, bir <code>User<\/code> tipinin <code>posts<\/code> alan\u0131, <code>Post<\/code> tipleriyle olan bire-\u00e7ok ili\u015fkisini g\u00f6sterir.<\/p>\n<h5>Skaler Tipler (Scalar Types)<\/h5>\n<p>Skaler tipler, bir GraphQL \u015femas\u0131ndaki en k\u00fc\u00e7\u00fck, atomik veri birimleridir. Bunlar, daha fazla alt alana sahip olmayan ve tek bir de\u011fere sahip olan tiplerdir. GraphQL, be\u015f yerle\u015fik skaler tip sunar:<br \/>\n*   <code>String<\/code>: UTF-8 karakter dizisi.<br \/>\n*   <code>Int<\/code>: 32 bit imzal\u0131 tamsay\u0131.<br \/>\n*   <code>Float<\/code>: \u00c7ift hassasiyetli kayan nokta de\u011feri.<br \/>\n*   <code>Boolean<\/code>: <code>true<\/code> veya <code>false<\/code> de\u011feri.<br \/>\n*   <code>ID<\/code>: Benzersiz bir tan\u0131mlay\u0131c\u0131y\u0131 temsil eden bir dize. Genellikle bir nesnenin birincil anahtar\u0131 olarak kullan\u0131l\u0131r ve serile\u015ftirme s\u0131ras\u0131nda <code>String<\/code> olarak i\u015flenir.<\/p>\n<p>Yerle\u015fik skaler tiplerin yan\u0131 s\u0131ra, kendi \u00f6zel skaler tiplerinizi de tan\u0131mlayabilirsiniz. \u00d6rne\u011fin, tarih\/saat bilgileri veya JSON nesneleri gibi karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 temsil etmek i\u00e7in \u00f6zel skaler tipler kullan\u0131labilir.<\/p>\n<pre><code class=\"language-graphql\">scalar DateTime\nscalar JSON<\/code><\/pre>\n<p>\u00d6zel skaler tiplerin tan\u0131m\u0131 SDL&#8217;de basittir, ancak bu tiplerin \u00e7al\u0131\u015fma zaman\u0131nda nas\u0131l serile\u015ftirilip serile\u015ftirilece\u011fi (istemci ve sunucu aras\u0131nda nas\u0131l d\u00f6n\u00fc\u015ft\u00fcr\u00fclece\u011fi) sunucu taraf\u0131 kodunda implemente edilmelidir.<\/p>\n<h5>Enum Tipleri (Enum Types)<\/h5>\n<p>Enum tipleri, bir alan\u0131n alabilece\u011fi de\u011ferleri belirli bir sabit setle k\u0131s\u0131tlamak i\u00e7in kullan\u0131l\u0131r. Bu, tip g\u00fcvenli\u011fini art\u0131r\u0131r ve olas\u0131 de\u011ferleri a\u00e7\u0131k\u00e7a belirtir.<\/p>\n<pre><code class=\"language-graphql\">enum Role {\n  ADMIN\n  EDITOR\n  VIEWER\n}\n\ntype User {\n  id: ID!\n  name: String!\n  role: Role!\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>Role<\/code> enum tipi, bir kullan\u0131c\u0131n\u0131n rol\u00fcn\u00fcn yaln\u0131zca <code>ADMIN<\/code>, <code>EDITOR<\/code> veya <code>VIEWER<\/code> olabilece\u011fini belirtir. Bu, hem istemcinin hem de sunucunun ge\u00e7erli de\u011ferler k\u00fcmesini bilmesini sa\u011flar.<\/p>\n<h5>Girdi Nesne Tipleri (Input Object Types)<\/h5>\n<p>Girdi nesne tipleri, \u00f6zellikle mutasyonlarda arg\u00fcman olarak karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 iletmek i\u00e7in kullan\u0131l\u0131r. Yap\u0131sal olarak nesne tiplerine benzerler ancak <code>input<\/code> anahtar kelimesiyle tan\u0131mlan\u0131rlar ve kendi i\u00e7lerinde di\u011fer nesne tiplerini do\u011frudan alan olarak bar\u0131nd\u0131ramazlar (skalerler, enumlar, di\u011fer input tipleri veya listeleri olabilir).<\/p>\n<pre><code class=\"language-graphql\">input CreateUserInput {\n  name: String!\n  email: String\n  role: Role = VIEWER # Varsay\u0131lan de\u011fer atanabilir\n}\n\ntype Mutation {\n  createUser(input: CreateUserInput!): User!\n}<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>CreateUserInput<\/code> bir kullan\u0131c\u0131n\u0131n olu\u015fturulmas\u0131 i\u00e7in gerekli bilgileri i\u00e7eren bir girdi nesne tipidir. <code>createUser<\/code> mutasyonu, bu tipi bir arg\u00fcman olarak al\u0131r. Bu, bir\u00e7ok arg\u00fcman\u0131 tek bir yap\u0131 alt\u0131nda toplaman\u0131n temiz bir yoludur.<\/p>\n<h5>Aray\u00fcz Tipleri (Interface Types)<\/h5>\n<p>Aray\u00fcz tipleri, birden fazla nesne tipinin payla\u015fmas\u0131 gereken ortak bir alan k\u00fcmesini tan\u0131mlar. Bir nesne tipi bir aray\u00fcz\u00fc uygulad\u0131\u011f\u0131nda, o aray\u00fczde tan\u0131mlanan t\u00fcm alanlar\u0131 i\u00e7ermek zorundad\u0131r. Bu, polimorfizm sa\u011flamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-graphql\">interface Node {\n  id: ID!\n}\n\ntype User implements Node {\n  id: ID!\n  name: String!\n  email: String\n}\n\ntype Post implements Node {\n  id: ID!\n  title: String!\n  content: String\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>Node<\/code> aray\u00fcz\u00fc, <code>id<\/code> ad\u0131nda bir <code>ID!<\/code> alan\u0131na sahip olmas\u0131 gereken t\u00fcm tipleri tan\u0131mlar. Hem <code>User<\/code> hem de <code>Post<\/code> tipleri <code>Node<\/code> aray\u00fcz\u00fcn\u00fc uygulad\u0131\u011f\u0131 i\u00e7in, her ikisinin de bir <code>id<\/code> alan\u0131 olmak zorundad\u0131r. Bu sayede, <code>Node<\/code> tipinde bir de\u011fer bekleyen bir sorgu, hem <code>User<\/code> hem de <code>Post<\/code> tiplerini d\u00f6nd\u00fcrebilir ve istemci bu ortak <code>id<\/code> alan\u0131na eri\u015febilir.<\/p>\n<h5>Birle\u015fim Tipleri (Union Types)<\/h5>\n<p>Birle\u015fim tipleri, bir alan\u0131n belirli bir anda birden fazla farkl\u0131 nesne tipinden herhangi birini d\u00f6nd\u00fcrebilece\u011fini belirtir. Aray\u00fczlerden farkl\u0131 olarak, birle\u015fim tipleri, birle\u015fime dahil olan tipler aras\u0131nda ortak alanlar gerektirmez.<\/p>\n<pre><code class=\"language-graphql\">union SearchResult = User | Post | Comment\n\ntype Query {\n  search(text: String!): [SearchResult!]!\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>SearchResult<\/code> birle\u015fim tipi, bir arama sonucunun <code>User<\/code>, <code>Post<\/code> veya <code>Comment<\/code> tiplerinden biri olabilece\u011fini g\u00f6sterir. \u0130stemci, bir <code>SearchResult<\/code> ald\u0131\u011f\u0131nda, <code>__typename<\/code> meta alan\u0131 arac\u0131l\u0131\u011f\u0131yla ger\u00e7ek tipini \u00f6\u011frenebilir ve buna g\u00f6re veri par\u00e7alar\u0131n\u0131 sorgulayabilir.<\/p>\n<h3>Alanlar ve Arg\u00fcmanlar<\/h3>\n<p>GraphQL \u015femas\u0131ndaki her nesne tipi, bir dizi alan tan\u0131mlar. Bu alanlar, o tipin sahip oldu\u011fu veri par\u00e7alar\u0131n\u0131 veya ger\u00e7ekle\u015ftirebilece\u011fi i\u015flemleri temsil eder.<\/p>\n<h4>Alanlar (Fields)<\/h4>\n<p>Her alan\u0131n bir ad\u0131 ve bir tipi vard\u0131r. Alan tipleri, yukar\u0131da bahsedilen skalerler, enumlar, nesne tipleri, aray\u00fczler, birle\u015fimler veya bunlar\u0131n listeleri olabilir.<\/p>\n<pre><code class=\"language-graphql\">type Query {\n  user(id: ID!): User\n  users(limit: Int = 10, offset: Int = 0): [User!]!\n  posts: [Post!]!\n}<\/code><\/pre>\n<p><code>users<\/code> alan\u0131nda <code>[User!]!<\/code> tipini g\u00f6r\u00fcyoruz. Bu, alan\u0131n <code>User<\/code> tiplerinden olu\u015fan bir liste d\u00f6nd\u00fcrece\u011fini ve hem listenin kendisinin hem de i\u00e7indeki elemanlar\u0131n <code>null<\/code> olamayaca\u011f\u0131n\u0131 g\u00f6sterir.<\/p>\n<h4>Arg\u00fcmanlar (Arguments)<\/h4>\n<p>Alanlar, iste\u011fe ba\u011fl\u0131 veya zorunlu arg\u00fcmanlar alabilir. Arg\u00fcmanlar, bir alan\u0131n d\u00f6nd\u00fcrece\u011fi veriyi filtrelemek, s\u0131ralamak veya parametrele\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Arg\u00fcmanlar, adlar\u0131 ve tipleriyle tan\u0131mlan\u0131r ve varsay\u0131lan de\u011ferlere sahip olabilirler.<\/p>\n<pre><code class=\"language-graphql\">type Query {\n  user(id: ID!): User # id zorunlu bir arg\u00fcman\n  users(limit: Int = 10, offset: Int = 0): [User!]! # limit ve offset varsay\u0131lan de\u011ferlere sahip\n  post(id: ID!, status: PostStatus = PUBLISHED): Post\n}<\/code><\/pre>\n<p>*   <code>user(id: ID!)<\/code>: <code>id<\/code> arg\u00fcman\u0131 <code>ID!<\/code> tipindedir ve <code>!<\/code> i\u015fareti zorunlu oldu\u011funu g\u00f6sterir. Bir <code>user<\/code> sorgusu yaparken <code>id<\/code> arg\u00fcman\u0131 mutlaka sa\u011flanmal\u0131d\u0131r.<br \/>\n*   <code>users(limit: Int = 10, offset: Int = 0)<\/code>: <code>limit<\/code> ve <code>offset<\/code> arg\u00fcmanlar\u0131 s\u0131ras\u0131yla <code>Int<\/code> tipindedir ve <code>10<\/code> ile <code>0<\/code> varsay\u0131lan de\u011ferlere sahiptir. E\u011fer istemci bu arg\u00fcmanlar\u0131 sa\u011flamazsa, sunucu varsay\u0131lan de\u011ferleri kullan\u0131r.<br \/>\n*   <code>post(id: ID!, status: PostStatus = PUBLISHED)<\/code>: <code>status<\/code> arg\u00fcman\u0131 <code>PostStatus<\/code> enum tipindedir ve <code>PUBLISHED<\/code> varsay\u0131lan de\u011ferine sahiptir.<\/p>\n<p>Arg\u00fcmanlar, sorgular\u0131n ve mutasyonlar\u0131n esnekli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r, istemcilerin tam olarak ihtiya\u00e7 duyduklar\u0131 veriyi daha spesifik bir \u015fekilde talep etmelerine olanak tan\u0131r.<\/p>\n<h3>Y\u00f6nergeler (Directives)<\/h3>\n<p>Y\u00f6nergeler, GraphQL SDL&#8217;in meta-programlama yetenekleridir. \u015eema tan\u0131mlar\u0131na veya sorgu y\u00fcr\u00fctme davran\u0131\u015f\u0131na ek bilgiler eklemek veya bu davran\u0131\u015flar\u0131 de\u011fi\u015ftirmek i\u00e7in kullan\u0131l\u0131rlar. Y\u00f6nergeler, <code>@<\/code> sembol\u00fcyle ba\u015flar ve arg\u00fcmanlar alabilirler.<\/p>\n<p>GraphQL, birka\u00e7 yerle\u015fik y\u00f6nerge sunar:<br \/>\n*   <code>@include(if: Boolean)<\/code>: Belirli bir alan\u0131n veya par\u00e7an\u0131n sorguya dahil edilip edilmeyece\u011fini ko\u015fullu olarak belirler. <code>if<\/code> arg\u00fcman\u0131 <code>true<\/code> ise dahil edilir, <code>false<\/code> ise hari\u00e7 tutulur.<br \/>\n*   <code>@skip(if: Boolean)<\/code>: <code>@include<\/code>&#8216;\u0131n tersidir; <code>if<\/code> arg\u00fcman\u0131 <code>true<\/code> ise belirli bir alan veya par\u00e7a sorgudan atlan\u0131r.<br \/>\n*   <code>@deprecated(reason: String = \"No longer supported\")<\/code>: Bir alan\u0131n veya enum de\u011ferinin kullan\u0131m d\u0131\u015f\u0131 b\u0131rak\u0131ld\u0131\u011f\u0131n\u0131 i\u015faretlemek i\u00e7in kullan\u0131l\u0131r. <code>reason<\/code> arg\u00fcman\u0131, neden kullan\u0131m d\u0131\u015f\u0131 b\u0131rak\u0131ld\u0131\u011f\u0131n\u0131 a\u00e7\u0131klayan bir mesaj sunar. Bu, ara\u00e7lar\u0131n ve dok\u00fcmantasyonun geli\u015ftiricilere bilgi vermesini sa\u011flar.<\/p>\n<pre><code class=\"language-graphql\">type User {\n  id: ID!\n  name: String!\n  oldEmail: String @deprecated(reason: \"Use the new 'email' field instead.\")\n  email: String\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>oldEmail<\/code> alan\u0131 <code>@deprecated<\/code> y\u00f6nergesiyle i\u015faretlenmi\u015ftir. Bu, istemcilerin bu alan\u0131 kullanmaktan ka\u00e7\u0131nmas\u0131 gerekti\u011fini ve yeni <code>email<\/code> alan\u0131na ge\u00e7meleri gerekti\u011fini belirtir.<\/p>\n<p>Yerle\u015fik y\u00f6nergelerin yan\u0131 s\u0131ra, kendi \u00f6zel y\u00f6nergelerinizi de tan\u0131mlayabilirsiniz. \u00d6zel y\u00f6nergeler, sunucu taraf\u0131nda i\u015f mant\u0131\u011f\u0131n\u0131 tetiklemek veya \u015femaya \u00f6zel meta veriler eklemek i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizma sunar.<\/p>\n<pre><code class=\"language-graphql\">directive @auth(role: Role!) on FIELD_DEFINITION | FIELD\n\nenum Role { ADMIN, USER }\n\ntype Query {\n  adminData: String @auth(role: ADMIN)\n  userData: String @auth(role: USER)\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>@auth<\/code> ad\u0131nda \u00f6zel bir y\u00f6nerge tan\u0131mlanm\u0131\u015ft\u0131r. Bu y\u00f6nerge, <code>role<\/code> ad\u0131nda zorunlu bir arg\u00fcman al\u0131r ve <code>FIELD_DEFINITION<\/code> (alan tan\u0131mlar\u0131 \u00fczerinde) veya <code>FIELD<\/code> (sorgudaki alanlar \u00fczerinde) konumlar\u0131nda kullan\u0131labilir. <code>adminData<\/code> alan\u0131 \u00fczerinde <code>role: ADMIN<\/code> ile kullan\u0131lmas\u0131, bu alana eri\u015fimin yaln\u0131zca <code>ADMIN<\/code> rol\u00fcne sahip kullan\u0131c\u0131larla s\u0131n\u0131rl\u0131 oldu\u011funu g\u00f6steren bir kural\u0131 temsil edebilir. Bu y\u00f6nergenin ger\u00e7ek implementasyonu GraphQL sunucusu taraf\u0131ndan sa\u011flanmal\u0131d\u0131r.<\/p>\n<h3>A\u00e7\u0131klamalar (Descriptions)<\/h3>\n<p>GraphQL SDL, \u015fema bile\u015fenlerini belgelemek i\u00e7in yerle\u015fik bir mekanizma sunar: a\u00e7\u0131klamalar. A\u00e7\u0131klamalar, \u00fc\u00e7 t\u0131rnak i\u015fareti (<code>\"\"\"<\/code>) i\u00e7ine al\u0131nm\u0131\u015f \u00e7ok sat\u0131rl\u0131 dizeler olarak veya tek t\u0131rnak i\u015fareti (<code>\"<\/code>) i\u00e7ine al\u0131nm\u0131\u015f tek sat\u0131rl\u0131 dizeler olarak tan\u0131mlar\u0131n hemen \u00fczerine yerle\u015ftirilir.<\/p>\n<pre><code class=\"language-graphql\">\"\"\"\nSistemdeki bir kullan\u0131c\u0131y\u0131 temsil eder.\nBenzersiz bir ID'ye, isme ve iste\u011fe ba\u011fl\u0131 e-posta adresine sahiptir.\n\"\"\"\ntype User {\n  id: ID!\n  \"Kullan\u0131c\u0131n\u0131n tam ad\u0131.\"\n  name: String!\n  email: String\n}\n\n\"\"\"\nSistemdeki bir g\u00f6nderinin durumunu belirtir.\n\"\"\"\nenum PostStatus {\n  DRAFT\n  PUBLISHED\n  ARCHIVED\n}<\/code><\/pre>\n<p>Bu a\u00e7\u0131klamalar, GraphiQL veya GraphQL Playground gibi ara\u00e7lar taraf\u0131ndan otomatik olarak al\u0131n\u0131r ve API dok\u00fcmantasyonunu zenginle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. \u0130yi yaz\u0131lm\u0131\u015f a\u00e7\u0131klamalar, API&#8217;nizi kullanan geli\u015ftiriciler i\u00e7in paha bi\u00e7ilmezdir, \u015feman\u0131n amac\u0131n\u0131 ve her alan\u0131n veya tipin neyi temsil etti\u011fini a\u00e7\u0131k\u00e7a anlamalar\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Geli\u015fmi\u015f SDL Kavramlar\u0131<\/h3>\n<p>SDL&#8217;in temel yap\u0131 ta\u015flar\u0131n\u0131n \u00f6tesinde, daha karma\u015f\u0131k senaryolar\u0131 ele almak i\u00e7in baz\u0131 geli\u015fmi\u015f \u00f6zellikler de bulunur.<\/p>\n<h4>Uzatmalar (Extensions)<\/h4>\n<p><code>extend<\/code> anahtar kelimesi, mevcut bir tipi veya \u015fema tan\u0131m\u0131n\u0131 de\u011fi\u015ftirmeden ona yeni alanlar veya y\u00f6nergeler eklemek i\u00e7in kullan\u0131l\u0131r. Bu, \u00f6zellikle \u015fema birle\u015ftirme (schema stitching) veya federasyon gibi senaryolarda ya da \u00fc\u00e7\u00fcnc\u00fc taraf bir \u015femay\u0131 kendi projenizde geni\u015fletirken kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-graphql\"># Mevcut bir Query tipine yeni alan ekleme\nextend type Query {\n  newField: String\n  anotherNewField(arg: Int): Boolean\n}\n\n<h2>Mevcut bir User tipine yeni alan ekleme<\/h2>\nextend type User {\n  age: Int\n}\n\n<h2>\u015eema tan\u0131m\u0131na y\u00f6nerge ekleme<\/h2>\nextend schema @federation<\/code><\/pre>\n<p><code>extend<\/code> kullan\u0131m\u0131, orijinal tan\u0131m\u0131n bulundu\u011fu yerden farkl\u0131 bir dosyada veya mod\u00fclde mevcut tiplere ekleme yapman\u0131za olanak tan\u0131r. Bu, mod\u00fcler \u015fema tasar\u0131m\u0131 i\u00e7in \u00f6nemlidir.<\/p>\n<h4>\u015eema Y\u00f6nergeleri (Schema Directives)<\/h4>\n<p>Y\u00f6nergeler sadece tipler veya alanlar \u00fczerinde de\u011fil, ayn\u0131 zamanda <code>schema<\/code> tan\u0131m\u0131n\u0131n kendisi \u00fczerinde de kullan\u0131labilir. Bu, t\u00fcm \u015fema i\u00e7in ge\u00e7erli olan meta verileri veya davran\u0131\u015flar\u0131 belirtmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-graphql\">schema @customSchemaDirective(version: \"1.0\") {\n  query: Query\n}\n\ndirective @customSchemaDirective(version: String!) on SCHEMA<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>@customSchemaDirective<\/code> y\u00f6nergesi <code>schema<\/code> tan\u0131m\u0131na uygulanm\u0131\u015ft\u0131r. Bu, \u015feman\u0131n genel s\u00fcr\u00fcm\u00fcn\u00fc veya di\u011fer global \u00f6zelliklerini belirtmek i\u00e7in kullan\u0131labilir. Apollo Federation gibi \u00e7\u00f6z\u00fcmler, federasyon \u00f6zelliklerini belirtmek i\u00e7in \u015fema y\u00f6nergelerini yo\u011fun bir \u015fekilde kullan\u0131r.<\/p>\n<h3>SDL&#8217;in Pratik Kullan\u0131m\u0131 ve Ara\u00e7lar<\/h3>\n<p>GraphQL SDL, sadece API&#8217;nizin bir tan\u0131m\u0131 olman\u0131n \u00f6tesinde, GraphQL ekosistemindeki bir\u00e7ok arac\u0131n ve metodolojinin temelini olu\u015fturur.<\/p>\n<h4>Schema First vs. Code First<\/h4>\n<p>GraphQL API geli\u015ftirme yakla\u015f\u0131mlar\u0131ndan ikisi olan &#8220;Schema First&#8221; ve &#8220;Code First&#8221; paradigmalar\u0131 bulunur. SDL, &#8220;Schema First&#8221; yakla\u015f\u0131m\u0131n\u0131n merkezindedir. Bu yakla\u015f\u0131mda, API&#8217;nin s\u00f6zle\u015fmesi (yani SDL \u015femas\u0131) ilk olarak tasarlan\u0131r ve ard\u0131ndan sunucu ve istemci kodlar\u0131 bu \u015femaya g\u00f6re olu\u015fturulur. Bu, API&#8217;nin tasar\u0131m\u0131na odaklanmay\u0131 ve istemci ile sunucu aras\u0131nda net bir s\u00f6zle\u015fme olu\u015fturmay\u0131 te\u015fvik eder. &#8220;Code First&#8221; yakla\u015f\u0131m\u0131nda ise, \u015fema do\u011frudan sunucu taraf\u0131 kodundan (\u00f6rne\u011fin TypeScript veya C# s\u0131n\u0131flar\u0131ndan) otomatik olarak t\u00fcretilir. Her iki yakla\u015f\u0131m\u0131n da kendine g\u00f6re avantajlar\u0131 olsa da, SDL&#8217;in netli\u011fi ve platformdan ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131, Schema First yakla\u015f\u0131m\u0131n\u0131 bir\u00e7ok b\u00fcy\u00fck \u00f6l\u00e7ekli projede tercih edilen se\u00e7enek haline getirir.<\/p>\n<h4>Kod \u00dcretimi (Code Generation)<\/h4>\n<p>SDL&#8217;in en g\u00fc\u00e7l\u00fc kullan\u0131m alanlar\u0131ndan biri kod \u00fcretimidir. GraphQL Code Generator gibi ara\u00e7lar, bir SDL \u015femas\u0131n\u0131 alarak TypeScript, Flow, Java, C#, Swift gibi \u00e7e\u015fitli dillerde istemci veya sunucu taraf\u0131 kodlar\u0131 (tipler, sorgu\/mutasyon yard\u0131mc\u0131lar\u0131, resolver aray\u00fczleri) otomatik olarak \u00fcretebilir. Bu, geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131r, insan hatas\u0131n\u0131 azalt\u0131r ve istemci ile sunucu aras\u0131nda tip g\u00fcvenli\u011fini sa\u011flar. \u00d6rne\u011fin, bir <code>User<\/code> tipini SDL&#8217;de tan\u0131mlad\u0131\u011f\u0131n\u0131zda, kod \u00fcretici otomatik olarak bu tipe kar\u015f\u0131l\u0131k gelen bir s\u0131n\u0131f veya aray\u00fcz olu\u015fturabilir.<\/p>\n<h4>Do\u011frulama (Validation)<\/h4>\n<p>GraphQL ara\u00e7lar\u0131, bir SDL \u015femas\u0131n\u0131n ge\u00e7erlili\u011fini kontrol etmek i\u00e7in kullan\u0131l\u0131r. SDL, belirli kurallara uymak zorundad\u0131r (\u00f6rne\u011fin, benzersiz tip adlar\u0131, do\u011fru alan tipleri). Ge\u00e7ersiz bir \u015fema, API&#8217;nin d\u00fczg\u00fcn \u00e7al\u0131\u015fmamas\u0131na neden olabilir. Edit\u00f6r eklentileri ve CI\/CD s\u00fcre\u00e7lerine entegre edilen ara\u00e7lar, \u015fema hatalar\u0131n\u0131 erken a\u015famada tespit etmeye yard\u0131mc\u0131 olur.<\/p>\n<h4>Dok\u00fcmantasyon (Documentation)<\/h4>\n<p>Yukar\u0131da bahsedildi\u011fi gibi, SDL&#8217;deki a\u00e7\u0131klamalar, otomatik dok\u00fcmantasyon ara\u00e7lar\u0131 i\u00e7in temel olu\u015fturur. GraphiQL ve GraphQL Playground gibi interaktif geli\u015ftirme ortamlar\u0131, \u015feman\u0131z\u0131 do\u011frudan SDL&#8217;den okuyarak zengin, gezinilebilir dok\u00fcmantasyon sunar. Bu, API&#8217;nizi kullanan geli\u015ftiricilerin kolayca anlay\u0131p ke\u015ffetmesini sa\u011flar.<\/p>\n<h4>Federasyon ve A\u011f Ge\u00e7itleri (Federation and Gateways)<\/h4>\n<p>B\u00fcy\u00fck ve karma\u015f\u0131k mikroservis mimarilerinde, tek bir monolitik GraphQL \u015femas\u0131 yerine birden fazla ba\u011f\u0131ms\u0131z GraphQL hizmetini (alt grafikleri) bir araya getirmek gerekebilir. Apollo Federation gibi \u00e7\u00f6z\u00fcmler, bu alt grafikleri birle\u015ftirmek i\u00e7in SDL&#8217;i kullan\u0131r. Her alt grafik, kendi SDL \u015femas\u0131n\u0131 tan\u0131mlar ve federasyon a\u011f ge\u00e7idi (gateway), bu \u015femalar\u0131 birle\u015ftirerek istemcilere tek bir birle\u015fik GraphQL API sunar. Bu senaryoda SDL, alt grafiklerin birbirleriyle nas\u0131l etkile\u015fime girece\u011fini ve ortak tipleri nas\u0131l payla\u015faca\u011f\u0131n\u0131 tan\u0131mlayan kritik bir rol oynar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>GraphQL SDL, modern API geli\u015ftirme d\u00fcnyas\u0131nda sadece bir tan\u0131m dili olman\u0131n \u00f6tesinde, bir API&#8217;nin kalbini ve ruhunu temsil eder. API&#8217;nin sundu\u011fu t\u00fcm veri yap\u0131lar\u0131n\u0131, sorgulanabilir alanlar\u0131 ve manip\u00fclasyon yeteneklerini dilden ba\u011f\u0131ms\u0131z, okunabilir ve makine taraf\u0131ndan yorumlanabilir bir formatta sunar. SDL sayesinde, istemciler API&#8217;nin yeteneklerini tam olarak anlayabilir, sunucular ise gelen istekleri g\u00fcvenli bir \u015fekilde i\u015fleyebilir.<\/p>\n<p>Bu makalede, SDL&#8217;in temel yap\u0131 ta\u015flar\u0131 olan \u015fema, nesne, skaler, enum, girdi, aray\u00fcz ve birle\u015fim tiplerini ayr\u0131nt\u0131l\u0131 olarak inceledik. Alanlar\u0131n ve arg\u00fcmanlar\u0131n nas\u0131l tan\u0131mland\u0131\u011f\u0131n\u0131, y\u00f6nergelerin \u015fema davran\u0131\u015f\u0131n\u0131 nas\u0131l de\u011fi\u015ftirebildi\u011fini ve a\u00e7\u0131klamalar\u0131n dok\u00fcmantasyon i\u00e7in ne kadar \u00f6nemli oldu\u011funu g\u00f6rd\u00fck. Ayr\u0131ca, uzatmalar ve \u015fema y\u00f6nergeleri gibi geli\u015fmi\u015f kavramlara ve SDL&#8217;in kod \u00fcretimi, do\u011frulama, dok\u00fcmantasyon ve federasyon gibi pratik kullan\u0131m alanlar\u0131na de\u011findik.<\/p>\n<p>SDL&#8217;i iyi anlamak ve do\u011fru bir \u015fekilde kullanmak, sadece daha iyi GraphQL API&#8217;leri in\u015fa etmekle kalmaz, ayn\u0131 zamanda API&#8217;nizin ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca s\u00fcrd\u00fcr\u00fclebilirli\u011fini, geni\u015fletilebilirli\u011fini ve geli\u015ftirici deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r. GraphQL ekosistemi geli\u015ftik\u00e7e, SDL&#8217;in merkezi rol\u00fc daha da g\u00fc\u00e7lenecek ve bu dili ustaca kullanabilen geli\u015ftiriciler, gelece\u011fin veri odakl\u0131 uygulamalar\u0131n\u0131 \u015fekillendirmede kilit bir konuma sahip olacakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans\nGraphQL, modern API geli\u015ftirme d\u00fcnyas\u0131nda veri sorgulama ve manip\u00fclasyonu i\u00e7in g\u00fc\u00e7l\u00fc v","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-33478","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>GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans\" \/>\n<meta property=\"og:description\" content=\"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans GraphQL, modern API geli\u015ftirme d\u00fcnyas\u0131nda veri sorgulama ve manip\u00fclasyonu i\u00e7in g\u00fc\u00e7l\u00fc v\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-03T06:40:57+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans\",\"datePublished\":\"2025-11-03T06:40:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/\"},\"wordCount\":2814,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/\",\"name\":\"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-03T06:40:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans\"}]},{\"@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":"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/","og_locale":"tr_TR","og_type":"article","og_title":"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans","og_description":"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans GraphQL, modern API geli\u015ftirme d\u00fcnyas\u0131nda veri sorgulama ve manip\u00fclasyonu i\u00e7in g\u00fc\u00e7l\u00fc v","og_url":"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-03T06:40:57+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"16 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans","datePublished":"2025-11-03T06:40:57+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/"},"wordCount":2814,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/","url":"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/","name":"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-03T06:40:57+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/graphql-sdl-yapi-taslari-ve-kapsamli-bir-referans\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"GraphQL SDL: Yap\u0131 Ta\u015flar\u0131 ve Kapsaml\u0131 Bir Referans"}]},{"@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\/33478","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=33478"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33478\/revisions"}],"predecessor-version":[{"id":33479,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33478\/revisions\/33479"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33478"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33478"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33478"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}