{"id":33373,"date":"2025-11-02T04:41:53","date_gmt":"2025-11-02T01:41:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33373"},"modified":"2025-11-02T04:41:53","modified_gmt":"2025-11-02T01:41:53","slug":"graphql-nedir-ve-neden-kullanmaliyiz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/","title":{"rendered":"GraphQL Nedir ve Neden Kullanmal\u0131y\u0131z?"},"content":{"rendered":"<p><body><\/p>\n<p>GraphQL, API geli\u015ftirme d\u00fcnyas\u0131nda son y\u0131llar\u0131n en pop\u00fcler teknolojilerinden biri haline geldi. REST mimarisinin getirdi\u011fi baz\u0131 k\u0131s\u0131tlamalar\u0131 a\u015fmak ve istemcilerin ihtiya\u00e7 duydu\u011fu veriyi daha esnek ve verimli bir \u015fekilde almas\u0131n\u0131 sa\u011flamak amac\u0131yla Facebook taraf\u0131ndan geli\u015ftirilen GraphQL, \u00f6zellikle modern web ve mobil uygulamalarda veri al\u0131\u015fveri\u015fini optimize etmek i\u00e7in g\u00fc\u00e7l\u00fc bir alternatif sunar. Bu rehberde, Node.js ve Express kullanarak temel bir GraphQL API&#8217;sini nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frenecek, pratik \u00f6rneklerle konuyu peki\u015ftireceksiniz. Amac\u0131m\u0131z, GraphQL&#8217;in temel prensiplerini anlamak ve kendi projelerinizde kullanmaya ba\u015flamak i\u00e7in sa\u011flam bir temel olu\u015fturmakt\u0131r.<\/p>\n<h2>GraphQL Nedir ve Neden Kullanmal\u0131y\u0131z?<\/h2>\n<p>GraphQL, API&#8217;ler i\u00e7in bir sorgulama dili ve \u00e7al\u0131\u015fma zaman\u0131d\u0131r. Geleneksel REST API&#8217;lerinde genellikle birden fazla endpoint \u00fczerinden farkl\u0131 veri par\u00e7alar\u0131n\u0131 alman\u0131z gerekirken, GraphQL&#8217;de istemci tam olarak ihtiyac\u0131 olan veriyi tek bir sorgu ile talep edebilir. Bu, &#8220;over-fetching&#8221; (gere\u011finden fazla veri \u00e7ekme) ve &#8220;under-fetching&#8221; (gere\u011finden az veri \u00e7ekme) gibi sorunlar\u0131 ortadan kald\u0131r\u0131r ve a\u011f trafi\u011fini azalt\u0131r.<\/p>\n<h3>GraphQL&#8217;in Avantajlar\u0131:<\/h3>\n<ul>\n<li><strong>Veri Esnekli\u011fi:<\/strong> \u0130stemciler tam olarak ihtiya\u00e7 duyduklar\u0131 veriyi sorgulayabilirler.<\/li>\n<li><strong>Tek Endpoint:<\/strong> T\u00fcm sorgular genellikle tek bir HTTP endpoint&#8217;ine (\u00f6rne\u011fin, <code>\/graphql<\/code>) yap\u0131l\u0131r.<\/li>\n<li><strong>Geli\u015ftirici Deneyimi:<\/strong> G\u00fc\u00e7l\u00fc tip sistemi sayesinde API&#8217;nin ne d\u00f6nd\u00fcrece\u011fi veya ne bekleyece\u011fi net bir \u015fekilde bellidir. Bu, hem backend hem de frontend geli\u015ftiricileri i\u00e7in daha iyi bir deneyim sunar.<\/li>\n<li><strong>Daha Az A\u011f \u0130ste\u011fi:<\/strong> Karma\u015f\u0131k verileri tek bir istekte alarak performans art\u0131\u015f\u0131 sa\u011flar.<\/li>\n<li><strong>Evrimsel API&#8217;ler:<\/strong> API&#8217;ye yeni alanlar eklemek veya mevcut alanlar\u0131 de\u011fi\u015ftirmek, istemcilerin mevcut sorgular\u0131n\u0131 bozmadan yap\u0131labilir.<\/li>\n<\/ul>\n<h3>Node.js ve Express Neden Tercih Edilmeli?<\/h3>\n<p>Node.js, JavaScript tabanl\u0131, olay tabanl\u0131 ve asenkron yap\u0131s\u0131yla h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir a\u011f uygulamalar\u0131 geli\u015ftirmek i\u00e7in ideal bir \u00e7al\u0131\u015fma zaman\u0131d\u0131r. Express ise Node.js i\u00e7in minimalist ve esnek bir web uygulama \u00e7at\u0131s\u0131d\u0131r. Bu ikili, GraphQL sunucusu kurmak i\u00e7in olduk\u00e7a pop\u00fcler ve g\u00fc\u00e7l\u00fc bir kombinasyondur. Geni\u015f bir paket ekosistemine sahip olmalar\u0131, geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131r\u0131r.<\/p>\n<h2>GraphQL Temelleri: Schema, Tipler ve Resolver&#8217;lar<\/h2>\n<p>Bir GraphQL API&#8217;si olu\u015ftururken anlaman\u0131z gereken en temel kavramlar Schema (\u015eema), Tipler (Types) ve Resolver&#8217;lard\u0131r.<\/p>\n<h3>Schema (\u015eema)<\/h3>\n<p>GraphQL \u015femas\u0131, API&#8217;nizin t\u00fcm yeteneklerini tan\u0131mlayan bir s\u00f6zle\u015fmedir. Hangi sorgular\u0131n yap\u0131labilece\u011fini, hangi verilerin d\u00f6nd\u00fcr\u00fclece\u011fini ve hangi veri tiplerini kullanaca\u011f\u0131n\u0131z\u0131 belirtir. \u015eema, GraphQL Schema Definition Language (SDL) kullan\u0131larak yaz\u0131l\u0131r. Her \u015fema en az bir <code>Query<\/code> tipi i\u00e7ermelidir, bu tip istemcilerin API&#8217;den veri okumak i\u00e7in kullanabilece\u011fi t\u00fcm giri\u015f noktalar\u0131n\u0131 tan\u0131mlar. Veri de\u011fi\u015ftirmek i\u00e7in ise <code>Mutation<\/code> tipi kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-graphql\">type Query {\n  hello: String\n  book(id: ID!): Book\n  books: [Book]\n}\n\ntype Mutation {\n  addBook(title: String!, author: String!): Book\n  updateBookTitle(id: ID!, newTitle: String!): Book\n}\n\ntype Book {\n  id: ID!\n  title: String!\n  author: String!\n}\n<\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte:<\/p>\n<ul>\n<li><code>Query<\/code> tipi, <code>hello<\/code>, <code>book<\/code> ve <code>books<\/code> ad\u0131nda \u00fc\u00e7 sorgu tan\u0131mlar.<\/li>\n<li><code>Mutation<\/code> tipi, <code>addBook<\/code> ve <code>updateBookTitle<\/code> ad\u0131nda iki i\u015flem tan\u0131mlar.<\/li>\n<li><code>Book<\/code> tipi, API&#8217;mizin d\u00f6nd\u00fcrece\u011fi kitap nesnesinin yap\u0131s\u0131n\u0131 tan\u0131mlar. <code>ID!<\/code>, <code>String!<\/code> gibi ifadeler, alan\u0131n null olamayaca\u011f\u0131n\u0131 (zorunlu oldu\u011funu) belirtir.<\/li>\n<\/ul>\n<h3>Tipler (Types)<\/h3>\n<p>GraphQL, g\u00fc\u00e7l\u00fc bir tip sistemine sahiptir. Bu, istemcilerin API&#8217;den hangi verileri bekleyebilece\u011fini ve sunucunun hangi verileri i\u015fleyebilece\u011fini net bir \u015fekilde tan\u0131mlar. Temel (scalar) tipler \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>String<\/code>: UTF-8 dizisi.<\/li>\n<li><code>Int<\/code>: 32 bit i\u015faretli tam say\u0131.<\/li>\n<li><code>Float<\/code>: \u00c7ift hassasiyetli kayan nokta say\u0131s\u0131.<\/li>\n<li><code>Boolean<\/code>: <code>true<\/code> veya <code>false<\/code>.<\/li>\n<li><code>ID<\/code>: Benzersiz bir tan\u0131mlay\u0131c\u0131 (genellikle string olarak serile\u015ftirilir).<\/li>\n<\/ul>\n<p>Kendi \u00f6zel tiplerinizi de tan\u0131mlayabilirsiniz, yukar\u0131daki <code>Book<\/code> tipi gibi.<\/p>\n<h3>Resolver&#8217;lar (Resolvers)<\/h3>\n<p>Resolver&#8217;lar, \u015femadaki her bir alan i\u00e7in veri sa\u011flayan fonksiyonlard\u0131r. Bir istemci bir sorgu yapt\u0131\u011f\u0131nda, GraphQL sunucusu bu sorguyu ayr\u0131\u015ft\u0131r\u0131r ve ilgili resolver fonksiyonlar\u0131n\u0131 \u00e7a\u011f\u0131rarak veriyi toplar. \u00d6rne\u011fin, <code>Query<\/code> tipindeki <code>books<\/code> alan\u0131 i\u00e7in bir resolver, veritaban\u0131ndan t\u00fcm kitaplar\u0131 getirecek bir fonksiyon olabilir.<\/p>\n<pre><code class=\"language-javascript\">const books = [\n  { id: '1', title: 'The Lord of the Rings', author: 'J.R.R. Tolkien' },\n  { id: '2', title: 'The Hobbit', author: 'J.R.R. Tolkien' },\n];\n\nconst resolvers = {\n  Query: {\n    books: () => books,\n    book: (parent, args) => books.find(book => book.id === args.id),\n  },\n  Mutation: {\n    addBook: (parent, args) => {\n      const newBook = { id: String(books.length + 1), title: args.title, author: args.author };\n      books.push(newBook);\n      return newBook;\n    },\n    updateBookTitle: (parent, args) => {\n      const book = books.find(book => book.id === args.id);\n      if (book) {\n        book.title = args.newTitle;\n      }\n      return book;\n    }\n  }\n};\n<\/code><\/pre>\n<p>Bu resolver&#8217;lar, yukar\u0131daki \u015fema ile uyumlu \u00e7al\u0131\u015f\u0131r ve istemciden gelen sorgulara g\u00f6re veriyi d\u00f6nd\u00fcr\u00fcr veya g\u00fcnceller.<\/p>\n<h2>Node.js ve Express ile GraphQL Ortam\u0131 Kurulumu<\/h2>\n<p>\u015eimdi pratik k\u0131sma ge\u00e7elim ve basit bir GraphQL sunucusu olu\u015ftural\u0131m.<\/p>\n<h3>Proje Olu\u015fturma ve Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kurma<\/h3>\n<p>\u00d6ncelikle yeni bir Node.js projesi olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">mkdir graphql-book-api\ncd graphql-book-api\nnpm init -y\n<\/code><\/pre>\n<p>Ard\u0131ndan, gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyelim:<\/p>\n<pre><code class=\"language-bash\">npm install express graphql express-graphql\n<\/code><\/pre>\n<ul>\n<li><code>express<\/code>: Web sunucumuzu olu\u015fturmak i\u00e7in.<\/li>\n<li><code>graphql<\/code>: GraphQL \u015femalar\u0131n\u0131 ve resolver&#8217;lar\u0131n\u0131 tan\u0131mlamak i\u00e7in ana k\u00fct\u00fcphane.<\/li>\n<li><code>express-graphql<\/code>: Express ile GraphQL&#8217;i kolayca entegre etmemizi sa\u011flayan bir middleware.<\/li>\n<\/ul>\n<h3>Express Sunucusu ve GraphQL Middleware Entegrasyonu<\/h3>\n<p>Proje dizininde <code>server.js<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve temel Express sunucumuzu kural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">\/\/ server.js\nconst express = require('express');\nconst { graphqlHTTP } = require('express-graphql');\nconst { buildSchema } = require('graphql');\n\nconst app = express();\n\n\/\/ 1. GraphQL \u015eemas\u0131n\u0131 Tan\u0131mlama (SDL kullanarak)\nconst schema = buildSchema(<code>\n  type Query {\n    hello: String\n  }\n<\/code>);\n\n\/\/ 2. Resolver'lar\u0131 Tan\u0131mlama\nconst root = {\n  hello: () => 'Hello world!',\n};\n\n\/\/ 3. Express ile GraphQL Middleware'\u0131 Kullanma\napp.use('\/graphql', graphqlHTTP({\n  schema: schema,\n  rootValue: root,\n  graphiql: true, \/\/ Geli\u015ftirme ortam\u0131nda GraphQL Playground\/GraphiQL aray\u00fcz\u00fcn\u00fc a\u00e7ar\n}));\n\nconst PORT = 4000;\napp.listen(PORT, () => {\n  console.log(<code>GraphQL API running at http:\/\/localhost:${PORT}\/graphql<\/code>);\n  console.log(<code>Access GraphQL Playground at http:\/\/localhost:${PORT}\/graphql<\/code>);\n});\n<\/code><\/pre>\n<p>Bu kodda:<\/p>\n<ul>\n<li><code>express<\/code> ve <code>express-graphql<\/code> k\u00fct\u00fcphanelerini i\u00e7e aktar\u0131yoruz.<\/li>\n<li><code>buildSchema<\/code> fonksiyonu ile GraphQL \u015femas\u0131n\u0131 SDL string&#8217;inden olu\u015fturuyoruz.<\/li>\n<li><code>root<\/code> nesnesi, \u015femadaki alanlar i\u00e7in resolver&#8217;lar\u0131 i\u00e7erir.<\/li>\n<li><code>app.use('\/graphql', ...)<\/code> sat\u0131r\u0131, Express sunucusuna <code>\/graphql<\/code> yoluna gelen istekleri <code>express-graphql<\/code> middleware&#8217;\u0131 ile i\u015flemesini s\u00f6yler.<\/li>\n<li><code>graphiql: true<\/code> ayar\u0131, taray\u0131c\u0131 \u00fczerinden API&#8217;mizi test edebilece\u011fimiz interaktif bir aray\u00fcz olan GraphQL Playground&#8217;u etkinle\u015ftirir.<\/li>\n<\/ul>\n<p>Sunucuyu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">node server.js\n<\/code><\/pre>\n<p>Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:4000\/graphql<\/code> adresine giderek GraphQL Playground&#8217;u g\u00f6rebilirsiniz. Sa\u011f taraftaki &#8220;Docs&#8221; b\u00f6l\u00fcm\u00fcnden \u015feman\u0131z\u0131 inceleyebilir ve sol taraftaki sorgu alan\u0131na a\u015fa\u011f\u0131daki sorguyu yazarak test edebilirsiniz:<\/p>\n<pre><code class=\"language-graphql\">query {\n  hello\n}\n<\/code><\/pre>\n<p>\u00c7\u0131kt\u0131 olarak <code>{\"data\":{\"hello\":\"Hello world!\"}}<\/code> almal\u0131s\u0131n\u0131z.<\/p>\n<h2>Pratik Uygulama: Kitap Y\u00f6netim API&#8217;si<\/h2>\n<p>\u015eimdi daha karma\u015f\u0131k bir \u00f6rnek olan basit bir kitap y\u00f6netim API&#8217;si olu\u015ftural\u0131m. Bu API, kitaplar\u0131 listeleme, tek bir kitab\u0131 alma ve yeni kitap ekleme yeteneklerine sahip olacak.<\/p>\n<h3>Veri Modeli<\/h3>\n<p>Basitlik ad\u0131na, veritaban\u0131 yerine ge\u00e7ici olarak bellekte tutulan bir dizi kullanaca\u011f\u0131z:<\/p>\n<pre><code class=\"language-javascript\">\/\/ data.js\nconst books = [\n  { id: '1', title: 'The Lord of the Rings', author: 'J.R.R. Tolkien' },\n  { id: '2', title: 'The Hobbit', author: 'J.R.R. Tolkien' },\n  { id: '3', title: 'The Alchemist', author: 'Paulo Coelho' },\n];\n\nmodule.exports = { books };\n<\/code><\/pre>\n<h3>\u015eema ve Resolver&#8217;lar\u0131n G\u00fcncellenmesi<\/h3>\n<p><code>server.js<\/code> dosyam\u0131z\u0131 g\u00fcncelleyelim:<\/p>\n<pre><code class=\"language-javascript\">\/\/ server.js\nconst express = require('express');\nconst { graphqlHTTP } = require('express-graphql');\nconst { buildSchema } = require('graphql');\nconst { books } = require('.\/data'); \/\/ data.js dosyam\u0131z\u0131 import ediyoruz\n\nconst app = express();\n\n\/\/ GraphQL \u015eemas\u0131n\u0131 Tan\u0131mlama\nconst schema = buildSchema(<code>\n  type Book {\n    id: ID!\n    title: String!\n    author: String!\n  }\n\n  type Query {\n    books: [Book]\n    book(id: ID!): Book\n  }\n\n  type Mutation {\n    addBook(title: String!, author: String!): Book\n    updateBookTitle(id: ID!, newTitle: String!): Book\n    deleteBook(id: ID!): String\n  }\n<\/code>);\n\n\/\/ Resolver'lar\u0131 Tan\u0131mlama\nconst root = {\n  books: () => {\n    return books;\n  },\n  book: (args) => {\n    return books.find(book => book.id === args.id);\n  },\n  addBook: (args) => {\n    const newBook = {\n      id: String(books.length + 1), \/\/ Basit ID \u00fcretimi\n      title: args.title,\n      author: args.author,\n    };\n    books.push(newBook);\n    return newBook;\n  },\n  updateBookTitle: (args) => {\n    const bookIndex = books.findIndex(book => book.id === args.id);\n    if (bookIndex > -1) {\n      books[bookIndex].title = args.newTitle;\n      return books[bookIndex];\n    }\n    return null; \/\/ Kitap bulunamazsa null d\u00f6nd\u00fcr\n  },\n  deleteBook: (args) => {\n    const initialLength = books.length;\n    const filteredBooks = books.filter(book => book.id !== args.id);\n    \/\/ E\u011fer kitap silindiyse, books dizisini g\u00fcncelle\n    if (filteredBooks.length < initialLength) {\n        \/\/ books dizisini filtreledikten sonra g\u00fcncelliyoruz\n        \/\/ Bu k\u0131s\u0131m ger\u00e7ek bir uygulamada veritaban\u0131 i\u015flemi olurdu.\n        \/\/ Array.prototype.splice kullanarak da yap\u0131labilir.\n        \/\/ Basitlik ad\u0131na yeni bir dizi olu\u015fturmak yerine, var olan\u0131 de\u011fi\u015ftirelim:\n        books.splice(0, books.length, ...filteredBooks); \/\/ Eski diziyi yeni diziyle de\u011fi\u015ftir\n        return <code>Book with ID ${args.id} deleted.<\/code>;\n    }\n    return <code>Book with ID ${args.id} not found.<\/code>;\n  }\n};\n\n\/\/ Express ile GraphQL Middleware'\u0131 Kullanma\napp.use('\/graphql', graphqlHTTP({\n  schema: schema,\n  rootValue: root,\n  graphiql: true,\n}));\n\nconst PORT = 4000;\napp.listen(PORT, () => {\n  console.log(<code>GraphQL API running at http:\/\/localhost:${PORT}\/graphql<\/code>);\n  console.log(<code>Access GraphQL Playground at http:\/\/localhost:${PORT}\/graphql<\/code>);\n});\n<\/code><\/pre>\n<h3>API&#8217;yi Test Etme (GraphQL Playground ile)<\/h3>\n<p>Sunucuyu yeniden ba\u015flat\u0131n (<code>node server.js<\/code>) ve <code>http:\/\/localhost:4000\/graphql<\/code> adresine gidin.<\/p>\n<h4>T\u00fcm Kitaplar\u0131 Sorgulama (Query)<\/h4>\n<pre><code class=\"language-graphql\">query {\n  books {\n    id\n    title\n    author\n  }\n}\n<\/code><\/pre>\n<h4>Belirli Bir Kitab\u0131 Sorgulama (Query)<\/h4>\n<pre><code class=\"language-graphql\">query {\n  book(id: \"1\") {\n    title\n    author\n  }\n}\n<\/code><\/pre>\n<h4>Yeni Kitap Ekleme (Mutation)<\/h4>\n<pre><code class=\"language-graphql\">mutation {\n  addBook(title: \"Sapiens: A Brief History of Humankind\", author: \"Yuval Noah Harari\") {\n    id\n    title\n    author\n  }\n}\n<\/code><\/pre>\n<p>Bu mutasyonu \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra tekrar <code>books<\/code> sorgusunu yaparak yeni eklenen kitab\u0131 g\u00f6rebilirsiniz.<\/p>\n<h4>Kitap Ba\u015fl\u0131\u011f\u0131n\u0131 G\u00fcncelleme (Mutation)<\/h4>\n<pre><code class=\"language-graphql\">mutation {\n  updateBookTitle(id: \"1\", newTitle: \"The Lord of the Rings: Fellowship of the Ring\") {\n    id\n    title\n  }\n}\n<\/code><\/pre>\n<h4>Kitap Silme (Mutation)<\/h4>\n<pre><code class=\"language-graphql\">mutation {\n  deleteBook(id: \"4\")\n}\n<\/code><\/pre>\n<p>Bu \u00f6rneklerle, GraphQL&#8217;in temel sorgulama (Query) ve veri de\u011fi\u015ftirme (Mutation) yeteneklerini pratik olarak g\u00f6rm\u00fc\u015f oldunuz.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<p>Bu rehberde, Node.js ve Express kullanarak temel bir GraphQL API&#8217;sini nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 \u00f6\u011frendiniz. GraphQL&#8217;in temel kavramlar\u0131 olan Schema, Tipler ve Resolver&#8217;lar\u0131 anlad\u0131n\u0131z ve pratik bir kitap y\u00f6netim API&#8217;si \u00f6rne\u011fi ile bunlar\u0131 uygulad\u0131n\u0131z. GraphQL&#8217;in sundu\u011fu esneklik ve verimlilik, modern uygulama geli\u015ftirmede \u00f6nemli avantajlar sa\u011flar. Bu sadece ba\u015flang\u0131\u00e7; GraphQL d\u00fcnyas\u0131 daha bir\u00e7ok geli\u015fmi\u015f konuyu (\u00f6rne\u011fin, abonelikler, kimlik do\u011frulama, veritaban\u0131 entegrasyonlar\u0131, daha karma\u015f\u0131k tipler ve ili\u015fkiler) bar\u0131nd\u0131r\u0131yor.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>S: GraphQL, REST&#8217;e g\u00f6re neden daha iyi bir se\u00e7enek olabilir?<\/strong><br \/>\nC: GraphQL, istemcinin tam olarak ihtiyac\u0131 olan veriyi tek bir istekte almas\u0131n\u0131 sa\u011flayarak &#8220;over-fetching&#8221; ve &#8220;under-fetching&#8221; sorunlar\u0131n\u0131 ortadan kald\u0131r\u0131r. Bu, daha az a\u011f trafi\u011fi ve daha h\u0131zl\u0131 y\u00fckleme s\u00fcreleri anlam\u0131na gelir. Ayr\u0131ca, g\u00fc\u00e7l\u00fc tip sistemi sayesinde API&#8217;nin dok\u00fcmantasyonu otomatik olarak olu\u015fturulur ve geli\u015ftirme deneyimi artar.<\/p>\n<p><strong>S: GraphQL&#8217;in dezavantajlar\u0131 nelerdir?<\/strong><br \/>\nC: GraphQL&#8217;in \u00f6\u011frenme e\u011frisi REST&#8217;e g\u00f6re biraz daha dik olabilir. Dosya y\u00fckleme gibi baz\u0131 i\u015flemler REST&#8217;te daha basitken GraphQL&#8217;de ek \u00e7\u00f6z\u00fcmler gerektirebilir. Ayr\u0131ca, karma\u015f\u0131k sorgular\u0131n performans y\u00f6netimi (N+1 problemi gibi) ve \u00f6nbellekleme stratejileri REST&#8217;e g\u00f6re farkl\u0131 yakla\u015f\u0131mlar gerektirir.<\/p>\n<p><strong>S: GraphQL API&#8217;sinde kimlik do\u011frulama (authentication) ve yetkilendirme (authorization) nas\u0131l yap\u0131l\u0131r?<\/strong><br \/>\nC: GraphQL, kimlik do\u011frulama ve yetkilendirme i\u00e7in \u00f6zel bir mekanizma sa\u011flamaz. Bunlar genellikle Express&#8217;in kendi middleware&#8217;lar\u0131 veya JWT (JSON Web Token) gibi end\u00fcstri standard\u0131 y\u00f6ntemlerle yap\u0131l\u0131r. \u00d6rne\u011fin, bir Express middleware&#8217;\u0131 gelen iste\u011fin ba\u015fl\u0131\u011f\u0131ndaki token&#8217;\u0131 do\u011frulayabilir ve kullan\u0131c\u0131 bilgilerini GraphQL resolver&#8217;lar\u0131na iletebilir.<\/p>\n<pre><code class=\"language-javascript\">app.use('\/graphql', (req, res, next) => {\n  \/\/ Basit bir \u00f6rnek: JWT token'\u0131 kontrol et\n  const token = req.headers.authorization;\n  if (token && verifyToken(token)) { \/\/ verifyToken kendi fonksiyonunuz\n    req.user = getUserFromToken(token); \/\/ Kullan\u0131c\u0131 bilgilerini ekle\n  }\n  next();\n}, graphqlHTTP({\n  schema: schema,\n  rootValue: root,\n  context: ({ req }) => ({ user: req.user }), \/\/ Resolver'lara kullan\u0131c\u0131y\u0131 ilet\n  graphiql: true,\n}));\n<\/code><\/pre>\n<p>Resolver i\u00e7inde <code>context<\/code> objesi \u00fczerinden kullan\u0131c\u0131 bilgilerine eri\u015ferek yetkilendirme kontrol\u00fc yapabilirsiniz.<\/p>\n<p><strong>S: Veritaban\u0131 entegrasyonu nas\u0131l yap\u0131l\u0131r?<\/strong><br \/>\nC: Bu rehberde basitlik ad\u0131na bellekteki bir dizi kullan\u0131ld\u0131. Ger\u00e7ek bir uygulamada, resolver&#8217;lar\u0131n\u0131z veritaban\u0131 etkile\u015fimlerini (\u00f6rne\u011fin, MongoDB i\u00e7in Mongoose, PostgreSQL i\u00e7in Sequelize gibi ORM\/ODM k\u00fct\u00fcphaneleri kullanarak) ger\u00e7ekle\u015ftiren asenkron fonksiyonlar olacakt\u0131r. Resolver&#8217;lar\u0131n\u0131zda <code>async\/await<\/code> kullanarak veritaban\u0131 i\u015flemlerini kolayca y\u00f6netebilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u00d6rnek bir veritaban\u0131 entegrasyonu (pseudo-code)\nconst root = {\n  books: async () => {\n    return await BookModel.find(); \/\/ Mongoose ile t\u00fcm kitaplar\u0131 getir\n  },\n  addBook: async (args) => {\n    const newBook = new BookModel({ title: args.title, author: args.author });\n    await newBook.save();\n    return newBook;\n  },\n};\n<\/code><\/pre>\n<p>Bu sayede GraphQL API&#8217;niz dinamik ve kal\u0131c\u0131 verilere sahip olacakt\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"GraphQL, API geli\u015ftirme d\u00fcnyas\u0131nda son y\u0131llar\u0131n en pop\u00fcler teknolojilerinden biri haline geldi. REST mimarisinin getirdi\u011fi baz\u0131 k\u0131s\u0131tlamal","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-33373","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 Nedir ve Neden Kullanmal\u0131y\u0131z? - 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-nedir-ve-neden-kullanmaliyiz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GraphQL Nedir ve Neden Kullanmal\u0131y\u0131z?\" \/>\n<meta property=\"og:description\" content=\"GraphQL, API geli\u015ftirme d\u00fcnyas\u0131nda son y\u0131llar\u0131n en pop\u00fcler teknolojilerinden biri haline geldi. REST mimarisinin getirdi\u011fi baz\u0131 k\u0131s\u0131tlamal\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-02T01:41:53+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=\"11 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"GraphQL Nedir ve Neden Kullanmal\u0131y\u0131z?\",\"datePublished\":\"2025-11-02T01:41:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/\"},\"wordCount\":1398,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/\",\"name\":\"GraphQL Nedir ve Neden Kullanmal\u0131y\u0131z? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-02T01:41:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GraphQL Nedir ve Neden Kullanmal\u0131y\u0131z?\"}]},{\"@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 Nedir ve Neden Kullanmal\u0131y\u0131z? - 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-nedir-ve-neden-kullanmaliyiz\/","og_locale":"tr_TR","og_type":"article","og_title":"GraphQL Nedir ve Neden Kullanmal\u0131y\u0131z?","og_description":"GraphQL, API geli\u015ftirme d\u00fcnyas\u0131nda son y\u0131llar\u0131n en pop\u00fcler teknolojilerinden biri haline geldi. REST mimarisinin getirdi\u011fi baz\u0131 k\u0131s\u0131tlamal","og_url":"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-02T01:41:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"GraphQL Nedir ve Neden Kullanmal\u0131y\u0131z?","datePublished":"2025-11-02T01:41:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/"},"wordCount":1398,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/","url":"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/","name":"GraphQL Nedir ve Neden Kullanmal\u0131y\u0131z? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-02T01:41:53+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/graphql-nedir-ve-neden-kullanmaliyiz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"GraphQL Nedir ve Neden Kullanmal\u0131y\u0131z?"}]},{"@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\/33373","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=33373"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33373\/revisions"}],"predecessor-version":[{"id":33374,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33373\/revisions\/33374"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}