{"id":38658,"date":"2026-02-04T23:40:49","date_gmt":"2026-02-04T20:40:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38658"},"modified":"2026-02-04T23:40:49","modified_gmt":"2026-02-04T20:40:49","slug":"node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/","title":{"rendered":"Node.js&#8217;te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu"},"content":{"rendered":"<p><body><\/p>\n<h2>Node.js&#8217;te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Modern web uygulamalar\u0131, verilerle etkile\u015fim kurmak i\u00e7in g\u00fc\u00e7l\u00fc ve esnek API&#8217;lere ihtiya\u00e7 duyar. Geleneksel REST API&#8217;leri belirli senaryolarda etkili olsa da, veri ihtiyac\u0131n\u0131n karma\u015f\u0131kla\u015ft\u0131\u011f\u0131, istemcilerin farkl\u0131 veri setleri talep etti\u011fi veya a\u015f\u0131r\u0131\/eksik veri sorunlar\u0131n\u0131n ya\u015fand\u0131\u011f\u0131 durumlarda GraphQL, daha verimli bir alternatif sunar. Bu makale, Node.js ortam\u0131nda GraphQL sunucusu kurmak i\u00e7in end\u00fcstri standard\u0131 Apollo Server&#8217;\u0131 ve ili\u015fkisel veritaban\u0131 y\u00f6netimini kolayla\u015ft\u0131ran g\u00fc\u00e7l\u00fc ORM (Object-Relational Mapper) Sequelize&#8217;\u0131 nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m a\u00e7\u0131klayacakt\u0131r.<\/p>\n<h3>GraphQL Nedir?<\/h3>\n<p>GraphQL, Facebook taraf\u0131ndan geli\u015ftirilen ve 2015 y\u0131l\u0131nda a\u00e7\u0131k kaynak olarak yay\u0131nlanan, API&#8217;ler i\u00e7in bir sorgu dilidir. Temel amac\u0131, istemcilerin ihtiya\u00e7 duyduklar\u0131 veriyi tam olarak talep etmelerini sa\u011flayarak, sunucudan gereksiz veri \u00e7ekme veya birden fazla istek yapma sorunlar\u0131n\u0131 ortadan kald\u0131rmakt\u0131r. GraphQL&#8217;in ba\u015fl\u0131ca avantajlar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><b>Verimlilik:<\/b> \u0130stemciler tam olarak neye ihtiya\u00e7 duyduklar\u0131n\u0131 belirtir, bu da a\u011f trafi\u011fini azalt\u0131r ve performans\u0131 art\u0131r\u0131r.<\/li>\n<li><b>Tek U\u00e7 Nokta:<\/b> T\u00fcm sorgular tek bir HTTP POST u\u00e7 noktas\u0131na yap\u0131l\u0131r.<\/li>\n<li><b>G\u00fc\u00e7l\u00fc Tip Sistemi:<\/b> \u015eema tabanl\u0131 yap\u0131s\u0131 sayesinde API&#8217;nin sundu\u011fu t\u00fcm veri tipleri ve ili\u015fkileri \u00f6nceden tan\u0131mlan\u0131r, bu da geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131r\u0131r ve hata olas\u0131l\u0131\u011f\u0131n\u0131 azalt\u0131r.<\/li>\n<li><b>Geli\u015ftirici Deneyimi:<\/b> \u015eema ke\u015ffedilebilirli\u011fi ve otomatik tamamlama \u00f6zellikleri sayesinde geli\u015ftiriciler i\u00e7in daha iyi bir deneyim sunar.<\/li>\n<\/ul>\n<h3>Apollo Server Nedir?<\/h3>\n<p>Apollo Server, GraphQL API&#8217;leri olu\u015fturmak i\u00e7in kullan\u0131lan a\u00e7\u0131k kaynakl\u0131, \u00fcretim ortam\u0131na haz\u0131r bir GraphQL sunucusudur. Node.js \u00fczerinde \u00e7al\u0131\u015f\u0131r ve GraphQL \u015feman\u0131z\u0131 ve \u00e7\u00f6z\u00fcmleyicilerinizi (resolvers) kolayca entegre etmenizi sa\u011flar. Express, Koa gibi \u00e7e\u015fitli Node.js HTTP framework&#8217;leri ile uyumludur ve geli\u015ftirme s\u00fcrecini h\u0131zland\u0131ran g\u00fc\u00e7l\u00fc ara\u00e7lar (Apollo Sandbox\/GraphQL Playground) sunar.<\/p>\n<h3>Sequelize Nedir?<\/h3>\n<p>Sequelize, Node.js i\u00e7in Promise tabanl\u0131 bir ORM&#8217;dir. PostgreSQL, MySQL, MariaDB, SQLite ve MSSQL gibi \u00e7e\u015fitli ili\u015fkisel veritabanlar\u0131n\u0131 destekler. Sequelize, JavaScript nesnelerini veritaban\u0131 tablolar\u0131na e\u015fleyerek SQL sorgular\u0131 yazma ihtiyac\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r. Modeller, ili\u015fkiler, migrasyonlar ve seed&#8217;ler gibi \u00f6zellikleriyle veritaban\u0131 y\u00f6netimini basitle\u015ftirir ve daha tutarl\u0131 hale getirir.<\/p>\n<p>Bu makalede, bir Node.js projesinde Apollo Server&#8217;\u0131 kurarak GraphQL \u015femam\u0131z\u0131 tan\u0131mlayacak, Sequelize ile veritaban\u0131 modellerimizi olu\u015fturacak ve bu iki teknolojiyi birle\u015ftirerek g\u00fc\u00e7l\u00fc bir GraphQL API&#8217;si geli\u015ftirece\u011fiz.<\/p>\n<h2>\u00d6n Gereksinimler<\/h2>\n<p>Bu rehberi takip edebilmek i\u00e7in a\u015fa\u011f\u0131daki \u00f6n gereksinimlere sahip olman\u0131z gerekmektedir:<\/p>\n<ul>\n<li><b>Node.js ve npm\/yarn:<\/b> Bilgisayar\u0131n\u0131zda Node.js ve npm (Node Package Manager) veya yarn kurulu olmal\u0131d\u0131r. Node.js&#8217;in resmi web sitesinden indirebilirsiniz.<\/li>\n<li><b>Temel JavaScript\/TypeScript Bilgisi:<\/b> ES6+ JavaScript s\u00f6zdizimine a\u015fina olman\u0131z beklenir.<\/li>\n<li><b>Veritaban\u0131 Bilgisi:<\/b> \u0130li\u015fkisel veritabanlar\u0131 (PostgreSQL, MySQL, SQLite vb.) hakk\u0131nda temel bilgiye sahip olmak faydal\u0131 olacakt\u0131r. Bu rehberde SQLite&#8217;\u0131 kullanaca\u011f\u0131z, ancak di\u011fer veritabanlar\u0131na ge\u00e7i\u015f yapmak kolayd\u0131r.<\/li>\n<\/ul>\n<h2>Proje Yap\u0131land\u0131rmas\u0131 ve Temel Kurulum<\/h2>\n<p>\u0130lk ad\u0131m olarak, yeni bir Node.js projesi olu\u015fturup gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyece\u011fiz.<\/p>\n<h3>Proje Ba\u015flatma<\/h3>\n<p>Yeni bir dizin olu\u015fturun ve i\u00e7ine girin:<\/p>\n<pre><code class=\"language-bash\">mkdir graphql-sequelize-app\ncd graphql-sequelize-app<\/code><\/pre>\n<p>Projenizi ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">npm init -y<\/code><\/pre>\n<p>Bu komut, varsay\u0131lan ayarlar ile bir <code>package.json<\/code> dosyas\u0131 olu\u015fturacakt\u0131r.<\/p>\n<h3>Gerekli Paketlerin Y\u00fcklenmesi<\/h3>\n<p>\u015eimdi projemiz i\u00e7in gerekli olan temel paketleri y\u00fckleyelim:<\/p>\n<pre><code class=\"language-bash\">npm install apollo-server graphql sequelize sqlite3 dotenv nodemon<\/code><\/pre>\n<ul>\n<li><code>apollo-server<\/code>: GraphQL sunucusunu kurmak i\u00e7in ana paket.<\/li>\n<li><code>graphql<\/code>: GraphQL \u015femalar\u0131 ve sorgular\u0131 i\u00e7in temel k\u00fct\u00fcphane.<\/li>\n<li><code>sequelize<\/code>: ORM k\u00fct\u00fcphanesi.<\/li>\n<li><code>sqlite3<\/code>: SQLite veritaban\u0131 s\u00fcr\u00fcc\u00fcs\u00fc. (E\u011fer PostgreSQL kullanacaksan\u0131z <code>pg<\/code>, MySQL i\u00e7in <code>mysql2<\/code> kurmal\u0131s\u0131n\u0131z).<\/li>\n<li><code>dotenv<\/code>: Ortam de\u011fi\u015fkenlerini <code>.env<\/code> dosyas\u0131ndan y\u00fcklemek i\u00e7in.<\/li>\n<li><code>nodemon<\/code>: Geli\u015ftirme s\u0131ras\u0131nda dosya de\u011fi\u015fikliklerini alg\u0131lay\u0131p sunucuyu otomatik olarak yeniden ba\u015flatmak i\u00e7in.<\/li>\n<\/ul>\n<p><code>package.json<\/code> dosyan\u0131za <code>start<\/code> ve <code>dev<\/code> script&#8217;lerini ekleyelim:<\/p>\n<pre><code class=\"language-json\">\/\/ package.json\n{\n  \"name\": \"graphql-sequelize-app\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"src\/index.js\",\n  \"scripts\": {\n    \"start\": \"node src\/index.js\",\n    \"dev\": \"nodemon src\/index.js\",\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"apollo-server\": \"^3.13.0\",\n    \"dotenv\": \"^16.4.5\",\n    \"graphql\": \"^16.8.1\",\n    \"sequelize\": \"^6.37.3\",\n    \"sqlite3\": \"^5.1.7\"\n  },\n  \"devDependencies\": {\n    \"nodemon\": \"^3.1.0\"\n  }\n}<\/code><\/pre>\n<h3>Proje Klas\u00f6r Yap\u0131s\u0131<\/h3>\n<p>Organize bir proje i\u00e7in a\u015fa\u011f\u0131daki gibi bir klas\u00f6r yap\u0131s\u0131 \u00f6nerilir:<\/p>\n<pre><code class=\"language-\">graphql-sequelize-app\/\n\u251c\u2500\u2500 src\/\n\u2502   \u251c\u2500\u2500 index.js          \/\/ Ana sunucu dosyas\u0131\n\u2502   \u251c\u2500\u2500 graphql\/\n\u2502   \u2502   \u251c\u2500\u2500 schema.js     \/\/ GraphQL \u015fema tan\u0131mlar\u0131\n\u2502   \u2502   \u2514\u2500\u2500 resolvers.js  \/\/ GraphQL \u00e7\u00f6z\u00fcmleyicileri\n\u2502   \u2514\u2500\u2500 models\/           \/\/ Sequelize modelleri\n\u2502       \u251c\u2500\u2500 index.js      \/\/ Sequelize ba\u011flant\u0131s\u0131 ve model ili\u015fkileri\n\u2502       \u251c\u2500\u2500 user.js\n\u2502       \u2514\u2500\u2500 post.js\n\u251c\u2500\u2500 config\/\n\u2502   \u2514\u2500\u2500 config.json       \/\/ Sequelize CLI yap\u0131land\u0131rmas\u0131\n\u251c\u2500\u2500 .env                  \/\/ Ortam de\u011fi\u015fkenleri\n\u251c\u2500\u2500 package.json\n\u2514\u2500\u2500 ...<\/code><\/pre>\n<p>Bu yap\u0131, GraphQL \u015femalar\u0131n\u0131, \u00e7\u00f6z\u00fcmleyicileri ve Sequelize modellerini ayr\u0131 tutarak projenin \u00f6l\u00e7eklenebilirli\u011fini ve bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h2>Veritaban\u0131 Yap\u0131land\u0131rmas\u0131 ve Sequelize Entegrasyonu<\/h2>\n<p>\u015eimdi Sequelize&#8217;\u0131 projemize entegre edelim ve veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 kural\u0131m.<\/p>\n<h3>Ortam De\u011fi\u015fkenleri (<code>.env<\/code>)<\/h3>\n<p>Veritaban\u0131 ba\u011flant\u0131 bilgilerini g\u00fcvenli bir \u015fekilde y\u00f6netmek i\u00e7in <code>.env<\/code> dosyas\u0131n\u0131 kullanaca\u011f\u0131z. Projenizin k\u00f6k dizininde bir <code>.env<\/code> dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-dotenv\"># .env\nDATABASE_URL=sqlite::memory: # Geli\u015ftirme i\u00e7in ge\u00e7ici bellek veritaban\u0131 veya\n<h2>DATABASE_URL=sqlite:.\/database.sqlite # Kal\u0131c\u0131 dosya tabanl\u0131 veritaban\u0131<\/code><\/pre>\n<\/h2>\n<p><code>sqlite::memory:<\/code> geli\u015ftirme s\u0131ras\u0131nda h\u0131zl\u0131 testler i\u00e7in idealdir, ancak sunucu her yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda veriler kaybolur. Kal\u0131c\u0131 bir veritaban\u0131 i\u00e7in <code>sqlite:.\/database.sqlite<\/code> kullanabilirsiniz.<\/p>\n<h3>Sequelize CLI Kurulumu ve Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Sequelize CLI, model, migrasyon ve seed dosyalar\u0131n\u0131 olu\u015fturmak i\u00e7in kullan\u0131\u015fl\u0131 bir ara\u00e7t\u0131r. Geli\u015ftirme ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olarak y\u00fckleyin:<\/p>\n<pre><code class=\"language-bash\">npm install --save-dev sequelize-cli<\/code><\/pre>\n<p>\u015eimdi Sequelize CLI&#8217;\u0131 ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">npx sequelize-cli init<\/code><\/pre>\n<p>Bu komut, <code>config<\/code>, <code>models<\/code>, <code>migrations<\/code> ve <code>seeders<\/code> dizinlerini olu\u015fturacakt\u0131r. <code>config\/config.json<\/code> dosyas\u0131n\u0131 d\u00fczenleyerek veritaban\u0131 ba\u011flant\u0131 bilgilerimizi ortam de\u011fi\u015fkenlerinden alacak \u015fekilde ayarlayal\u0131m:<\/p>\n<pre><code class=\"language-json\">\/\/ config\/config.json\n{\n  \"development\": {\n    \"dialect\": \"sqlite\",\n    \"storage\": \".\/database.sqlite\",\n    \"logging\": false\n  },\n  \"test\": {\n    \"dialect\": \"sqlite\",\n    \"storage\": \":memory:\"\n  },\n  \"production\": {\n    \"dialect\": \"sqlite\",\n    \"storage\": \".\/database.sqlite\"\n  }\n}<\/code><\/pre>\n<p>Yukar\u0131daki yap\u0131land\u0131rma, <code>sqlite<\/code> kullan\u0131ld\u0131\u011f\u0131nda <code>database.sqlite<\/code> dosyas\u0131n\u0131 veritaban\u0131 olarak kullan\u0131r. E\u011fer PostgreSQL veya MySQL kullanacaksan\u0131z, <code>dialect<\/code> ve ba\u011flant\u0131 bilgilerini buna g\u00f6re g\u00fcncellemeli ve <code>use_env_variable<\/code> \u00f6zelli\u011fini kullanmal\u0131s\u0131n\u0131z. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-json\">\/\/ config\/config.json (PostgreSQL\/MySQL i\u00e7in \u00f6rnek)\n{\n  \"development\": {\n    \"use_env_variable\": \"DATABASE_URL\",\n    \"dialect\": \"postgres\", \/\/ veya \"mysql\"\n    \"logging\": false\n  },\n  \/\/ ... di\u011fer ortamlar\n}<\/code><\/pre>\n<h3>Sequelize Ba\u011flant\u0131s\u0131 ve Model Tan\u0131mlama<\/h3>\n<p><code>src\/models\/index.js<\/code> dosyas\u0131, t\u00fcm Sequelize modellerinizi bir araya getirecek ve veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131 y\u00f6netecek ana dosyad\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/models\/index.js\nrequire('dotenv').config();\nconst { Sequelize, DataTypes } = require('sequelize');\nconst UserModel = require('.\/user');\nconst PostModel = require('.\/post');\n\nconst env = process.env.NODE_ENV || 'development';\nconst config = require('..\/..\/config\/config.json')[env];\n\nlet sequelize;\nif (config.use_env_variable) {\n  sequelize = new Sequelize(process.env[config.use_env_variable], config);\n} else {\n  sequelize = new Sequelize(config.database, config.username, config.password, config);\n}\n\nconst db = {};\n\ndb.sequelize = sequelize;\ndb.Sequelize = Sequelize;\n\n\/\/ Modelleri y\u00fckle\ndb.User = UserModel(sequelize, DataTypes);\ndb.Post = PostModel(sequelize, DataTypes);\n\n\/\/ \u0130li\u015fkileri tan\u0131mla\nObject.keys(db).forEach(modelName => {\n  if (db[modelName].associate) {\n    db[modelName].associate(db);\n  }\n});\n\nmodule.exports = db;<\/code><\/pre>\n<h3>Model Olu\u015fturma<\/h3>\n<p>\u0130ki basit model olu\u015ftural\u0131m: <code>User<\/code> (Kullan\u0131c\u0131) ve <code>Post<\/code> (G\u00f6nderi). Bir kullan\u0131c\u0131 birden fazla g\u00f6nderi yazabilir.<\/p>\n<h4>User Modeli<\/h4>\n<p><code>src\/models\/user.js<\/code> dosyas\u0131n\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/models\/user.js\nmodule.exports = (sequelize, DataTypes) => {\n  const User = sequelize.define('User', {\n    username: {\n      type: DataTypes.STRING,\n      unique: true,\n      allowNull: false\n    },\n    email: {\n      type: DataTypes.STRING,\n      unique: true,\n      allowNull: false,\n      validate: {\n        isEmail: true\n      }\n    }\n  });\n\n  User.associate = (models) => {\n    User.hasMany(models.Post, {\n      foreignKey: 'userId',\n      as: 'posts'\n    });\n  };\n\n  return User;\n};<\/code><\/pre>\n<h4>Post Modeli<\/h4>\n<p><code>src\/models\/post.js<\/code> dosyas\u0131n\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/models\/post.js\nmodule.exports = (sequelize, DataTypes) => {\n  const Post = sequelize.define('Post', {\n    title: {\n      type: DataTypes.STRING,\n      allowNull: false\n    },\n    content: {\n      type: DataTypes.TEXT,\n      allowNull: false\n    }\n  });\n\n  Post.associate = (models) => {\n    Post.belongsTo(models.User, {\n      foreignKey: 'userId',\n      as: 'author'\n    });\n  };\n\n  return Post;\n};<\/code><\/pre>\n<h3>Veritaban\u0131 Migrasyonlar\u0131<\/h3>\n<p>Sequelize CLI ile modellerimiz i\u00e7in migrasyon dosyalar\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">npx sequelize-cli model:generate --name User --attributes username:string,email:string\nnpx sequelize-cli model:generate --name Post --attributes title:string,content:text,userId:integer<\/code><\/pre>\n<p>Bu komutlar, <code>migrations<\/code> klas\u00f6r\u00fcnde iki yeni dosya olu\u015fturacakt\u0131r. <code>userId<\/code> alan\u0131n\u0131n <code>Post<\/code> modelinde yabanc\u0131 anahtar olarak tan\u0131mland\u0131\u011f\u0131na dikkat edin. Migrasyon dosyalar\u0131n\u0131 inceleyip gerekirse d\u00fczenleyebilirsiniz (\u00f6rne\u011fin <code>unique<\/code> veya <code>allowNull<\/code> k\u0131s\u0131tlamalar\u0131 eklemek i\u00e7in).<\/p>\n<p>\u015eimdi migrasyonlar\u0131 \u00e7al\u0131\u015ft\u0131rarak veritaban\u0131 tablolar\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-bash\">npx sequelize-cli db:migrate<\/code><\/pre>\n<p>Bu komut, <code>database.sqlite<\/code> (veya yap\u0131land\u0131rd\u0131\u011f\u0131n\u0131z ba\u015fka bir veritaban\u0131) i\u00e7inde <code>Users<\/code> ve <code>Posts<\/code> tablolar\u0131n\u0131 olu\u015fturacakt\u0131r.<\/p>\n<h2>GraphQL \u015eema Tan\u0131mlamas\u0131<\/h2>\n<p>GraphQL \u015feman\u0131z, istemcilerin sorgulayabilece\u011fi veya de\u011fi\u015ftirebilece\u011fi verilerin yap\u0131s\u0131n\u0131 tan\u0131mlar. <code>src\/graphql\/schema.js<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/graphql\/schema.js\nconst { gql } = require('apollo-server');\n\nconst typeDefs = gql<code>\n  type User {\n    id: ID!\n    username: String!\n    email: String!\n    posts: [Post!]!\n  }\n\n  type Post {\n    id: ID!\n    title: String!\n    content: String!\n    author: User!\n  }\n\n  input CreateUserInput {\n    username: String!\n    email: String!\n  }\n\n  input UpdateUserInput {\n    username: String\n    email: String\n  }\n\n  input CreatePostInput {\n    title: String!\n    content: String!\n    userId: ID!\n  }\n\n  input UpdatePostInput {\n    title: String\n    content: String\n  }\n\n  type Query {\n    users: [User!]!\n    user(id: ID!): User\n    posts: [Post!]!\n    post(id: ID!): Post\n  }\n\n  type Mutation {\n    createUser(input: CreateUserInput!): User!\n    updateUser(id: ID!, input: UpdateUserInput!): User!\n    deleteUser(id: ID!): Boolean!\n\n    createPost(input: CreatePostInput!): Post!\n    updatePost(id: ID!, input: UpdatePostInput!): Post!\n    deletePost(id: ID!): Boolean!\n  }\n<\/code>;\n\nmodule.exports = typeDefs;<\/code><\/pre>\n<h3>\u015eema A\u00e7\u0131klamas\u0131<\/h3>\n<ul>\n<li><code>User<\/code> ve <code>Post<\/code> tipleri, veritaban\u0131ndaki kar\u015f\u0131l\u0131k gelen modellerin alanlar\u0131n\u0131 tan\u0131mlar. <code>ID!<\/code> gibi \u00fcnlem i\u015faretleri, alan\u0131n zorunlu oldu\u011funu belirtir.<\/li>\n<li><code>posts<\/code> alan\u0131 <code>User<\/code> tipinde, <code>author<\/code> alan\u0131 <code>Post<\/code> tipinde, modeller aras\u0131ndaki ili\u015fkileri yans\u0131t\u0131r.<\/li>\n<li><code>input<\/code> tipleri, <code>Mutation<\/code> i\u015flemleri i\u00e7in girdi verilerini tan\u0131mlar. Bu, daha temiz ve yeniden kullan\u0131labilir bir yap\u0131 sa\u011flar.<\/li>\n<li><code>Query<\/code> tipi, istemcilerin veri okuma (GET) i\u015flemleri i\u00e7in kullanabilece\u011fi sorgular\u0131 tan\u0131mlar. \u00d6rne\u011fin, t\u00fcm kullan\u0131c\u0131lar\u0131 (<code>users<\/code>) veya belirli bir kullan\u0131c\u0131y\u0131 (<code>user(id:)<\/code>) getirme.<\/li>\n<li><code>Mutation<\/code> tipi, istemcilerin veri olu\u015fturma, g\u00fcncelleme ve silme (POST, PUT, DELETE) i\u015flemleri i\u00e7in kullanabilece\u011fi mutasyonlar\u0131 tan\u0131mlar.<\/li>\n<\/ul>\n<h2>GraphQL \u00c7\u00f6z\u00fcmleyicileri (Resolvers) Olu\u015fturma<\/h2>\n<p>\u00c7\u00f6z\u00fcmleyiciler, GraphQL \u015femas\u0131ndaki her alan\u0131n nas\u0131l veri sa\u011flayaca\u011f\u0131n\u0131 belirleyen fonksiyonlard\u0131r. <code>src\/graphql\/resolvers.js<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/graphql\/resolvers.js\nconst resolvers = {\n  Query: {\n    users: async (parent, args, { db }) => {\n      return db.User.findAll({ include: [{ model: db.Post, as: 'posts' }] });\n    },\n    user: async (parent, { id }, { db }) => {\n      return db.User.findByPk(id, { include: [{ model: db.Post, as: 'posts' }] });\n    },\n    posts: async (parent, args, { db }) => {\n      return db.Post.findAll({ include: [{ model: db.User, as: 'author' }] });\n    },\n    post: async (parent, { id }, { db }) => {\n      return db.Post.findByPk(id, { include: [{ model: db.User, as: 'author' }] });\n    },\n  },\n  Mutation: {\n    createUser: async (parent, { input }, { db }) => {\n      return db.User.create(input);\n    },\n    updateUser: async (parent, { id, input }, { db }) => {\n      const user = await db.User.findByPk(id);\n      if (!user) throw new Error('User not found');\n      await user.update(input);\n      return user;\n    },\n    deleteUser: async (parent, { id }, { db }) => {\n      const user = await db.User.findByPk(id);\n      if (!user) throw new Error('User not found');\n      await user.destroy();\n      return true;\n    },\n    createPost: async (parent, { input }, { db }) => {\n      const { userId, ...postData } = input;\n      const user = await db.User.findByPk(userId);\n      if (!user) throw new Error('User not found');\n      return db.Post.create({ ...postData, userId });\n    },\n    updatePost: async (parent, { id, input }, { db }) => {\n      const post = await db.Post.findByPk(id);\n      if (!post) throw new Error('Post not found');\n      await post.update(input);\n      return post;\n    },\n    deletePost: async (parent, { id }, { db }) => {\n      const post = await db.Post.findByPk(id);\n      if (!post) throw new Error('Post not found');\n      await post.destroy();\n      return true;\n    },\n  },\n  User: {\n    posts: async (parent, args, { db }) => {\n      \/\/ Bu, parent.getPosts() ile ayn\u0131 i\u015fi yapar ama daha genel bir yakla\u015f\u0131md\u0131r.\n      \/\/ N+1 problemini \u00e7\u00f6zmek i\u00e7in DataLoader kullan\u0131lmas\u0131 \u00f6nerilir.\n      return db.Post.findAll({ where: { userId: parent.id } });\n    }\n  },\n  Post: {\n    author: async (parent, args, { db }) => {\n      return db.User.findByPk(parent.userId);\n    }\n  }\n};\n\nmodule.exports = resolvers;<\/code><\/pre>\n<h3>\u00c7\u00f6z\u00fcmleyici A\u00e7\u0131klamas\u0131<\/h3>\n<ul>\n<li>Her \u00e7\u00f6z\u00fcmleyici fonksiyonu <code>(parent, args, context, info)<\/code> d\u00f6rt arg\u00fcman al\u0131r. Burada <code>parent<\/code> ve <code>args<\/code> kullan\u0131l\u0131yor. <code>context<\/code> objesi, veritaban\u0131 ba\u011flant\u0131s\u0131 gibi payla\u015f\u0131lan kaynaklar\u0131 i\u00e7erir.<\/li>\n<li><code>Query<\/code> \u00e7\u00f6z\u00fcmleyicileri, <code>db.User.findAll()<\/code>, <code>db.User.findByPk()<\/code> gibi Sequelize metodlar\u0131n\u0131 kullanarak veritaban\u0131ndan veri \u00e7eker. <code>include<\/code> se\u00e7ene\u011fi, ili\u015fkili verileri (\u00f6rne\u011fin bir kullan\u0131c\u0131ya ait g\u00f6nderileri) tek bir sorguda getirmeyi sa\u011flar.<\/li>\n<li><code>Mutation<\/code> \u00e7\u00f6z\u00fcmleyicileri, <code>db.User.create()<\/code>, <code>db.User.update()<\/code>, <code>db.User.destroy()<\/code> gibi Sequelize metodlar\u0131n\u0131 kullanarak veritaban\u0131nda de\u011fi\u015fiklik yapar.<\/li>\n<li><code>User<\/code> ve <code>Post<\/code> tipleri alt\u0131ndaki \u00e7\u00f6z\u00fcmleyiciler, ili\u015fkisel verileri y\u00fcklemek i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir <code>User<\/code> sorguland\u0131\u011f\u0131nda, <code>posts<\/code> alan\u0131 ayr\u0131ca \u00e7\u00f6z\u00fcmlenir ve ilgili g\u00f6nderileri getirir. Burada N+1 sorgu problemi olu\u015fabilir; bu, &#8220;Geli\u015fmi\u015f Konular&#8221; b\u00f6l\u00fcm\u00fcnde ele al\u0131nacakt\u0131r.<\/li>\n<\/ul>\n<h2>Apollo Server Kurulumu ve Ba\u015flat\u0131lmas\u0131<\/h2>\n<p>\u015eimdi t\u00fcm par\u00e7alar\u0131 bir araya getirerek Apollo Server&#8217;\u0131m\u0131z\u0131 ba\u015flatal\u0131m. <code>src\/index.js<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/index.js\nrequire('dotenv').config();\nconst { ApolloServer } = require('apollo-server');\nconst typeDefs = require('.\/graphql\/schema');\nconst resolvers = require('.\/graphql\/resolvers');\nconst db = require('.\/models'); \/\/ Sequelize ba\u011flant\u0131s\u0131\n\nasync function startApolloServer() {\n  await db.sequelize.sync({ alter: true }); \/\/ Veritaban\u0131 tablolar\u0131n\u0131 senkronize et (dev ortam\u0131 i\u00e7in)\n\n  const server = new ApolloServer({\n    typeDefs,\n    resolvers,\n    context: () => ({ db }), \/\/ Sequelize modellerini \u00e7\u00f6z\u00fcmleyicilere aktar\n    formatError: (error) => {\n      \/\/ Hata mesajlar\u0131n\u0131 \u00f6zelle\u015ftirme veya loglama\n      console.error(error);\n      return error;\n    },\n  });\n\n  const { url } = await server.listen({ port: process.env.PORT || 4000 });\n  console.log(<code>  Server ready at ${url}<\/code>);\n}\n\nstartApolloServer();<\/code><\/pre>\n<h3>A\u00e7\u0131klama<\/h3>\n<ul>\n<li><code>dotenv.config()<\/code> ile <code>.env<\/code> dosyas\u0131ndaki ortam de\u011fi\u015fkenleri y\u00fcklenir.<\/li>\n<li><code>db.sequelize.sync({ alter: true })<\/code>: Bu, Sequelize&#8217;\u0131n veritaban\u0131 tablolar\u0131n\u0131 tan\u0131mlanan modellere g\u00f6re olu\u015fturmas\u0131n\u0131 veya mevcut tablolar\u0131 g\u00fcncellemesini sa\u011flar. Geli\u015ftirme ortam\u0131nda kullan\u0131\u015fl\u0131d\u0131r ancak \u00fcretim ortam\u0131nda migrasyonlar tercih edilir.<\/li>\n<li><code>ApolloServer<\/code> \u00f6rne\u011fi <code>typeDefs<\/code> (\u015fema) ve <code>resolvers<\/code> ile olu\u015fturulur.<\/li>\n<li><code>context<\/code> fonksiyonu \u00e7ok \u00f6nemlidir. Bu fonksiyonun d\u00f6nd\u00fcrd\u00fc\u011f\u00fc obje, her bir \u00e7\u00f6z\u00fcmleyiciye \u00fc\u00e7\u00fcnc\u00fc arg\u00fcman olarak iletilir. Burada <code>db<\/code> objemizi (Sequelize modellerimizi i\u00e7eren) <code>context<\/code>&#8216;e ekleyerek \u00e7\u00f6z\u00fcmleyicilerin veritaban\u0131na eri\u015fmesini sa\u011fl\u0131yoruz.<\/li>\n<li><code>server.listen()<\/code> sunucuyu belirtilen portta ba\u015flat\u0131r.<\/li>\n<\/ul>\n<h2>Uygulaman\u0131n Test Edilmesi<\/h2>\n<p>Her \u015fey haz\u0131r! \u015eimdi sunucuyu \u00e7al\u0131\u015ft\u0131r\u0131p GraphQL API&#8217;mizi test edelim.<\/p>\n<pre><code class=\"language-bash\">npm run dev<\/code><\/pre>\n<p>Taray\u0131c\u0131n\u0131z\u0131 <code>http:\/\/localhost:4000<\/code> adresine y\u00f6nlendirin (e\u011fer port 4000 ise). Apollo Sandbox veya GraphQL Playground aray\u00fcz\u00fc a\u00e7\u0131lacakt\u0131r.<\/p>\n<h3>\u00d6rnek Sorgular (Queries)<\/h3>\n<h4>Yeni Kullan\u0131c\u0131 Olu\u015fturma<\/h4>\n<pre><code class=\"language-graphql\">mutation CreateUser {\n  createUser(input: { username: \"john_doe\", email: \"john@example.com\" }) {\n    id\n    username\n    email\n  }\n}<\/code><\/pre>\n<h4>T\u00fcm Kullan\u0131c\u0131lar\u0131 Getirme<\/h4>\n<pre><code class=\"language-graphql\">query GetUsers {\n  users {\n    id\n    username\n    email\n    posts {\n      id\n      title\n    }\n  }\n}<\/code><\/pre>\n<h4>Belirli Bir Kullan\u0131c\u0131y\u0131 ID ile Getirme<\/h4>\n<pre><code class=\"language-graphql\">query GetUserById {\n  user(id: \"1\") {\n    id\n    username\n    email\n    posts {\n      id\n      title\n      content\n    }\n  }\n}<\/code><\/pre>\n<h4>Yeni G\u00f6nderi Olu\u015fturma<\/h4>\n<p>(\u00d6nce yukar\u0131daki <code>CreateUser<\/code> ile bir kullan\u0131c\u0131 olu\u015fturdu\u011funuzdan emin olun ve <code>userId<\/code>&#8216;\u0131 g\u00fcncelleyin.)<\/p>\n<pre><code class=\"language-graphql\">mutation CreatePost {\n  createPost(input: { title: \"My First Post\", content: \"Hello GraphQL with Sequelize!\", userId: \"1\" }) {\n    id\n    title\n    content\n    author {\n      username\n    }\n  }\n}<\/code><\/pre>\n<h4>T\u00fcm G\u00f6nderileri Getirme<\/h4>\n<pre><code class=\"language-graphql\">query GetPosts {\n  posts {\n    id\n    title\n    content\n    author {\n      id\n      username\n      email\n    }\n  }\n}<\/code><\/pre>\n<h4>Belirli Bir G\u00f6nderiyi ID ile Getirme<\/h4>\n<pre><code class=\"language-graphql\">query GetPostById {\n  post(id: \"1\") {\n    id\n    title\n    content\n    author {\n      username\n      email\n    }\n  }\n}<\/code><\/pre>\n<h3>\u00d6rnek Mutasyonlar (Mutations)<\/h3>\n<h4>Kullan\u0131c\u0131 G\u00fcncelleme<\/h4>\n<pre><code class=\"language-graphql\">mutation UpdateUser {\n  updateUser(id: \"1\", input: { username: \"john_doe_updated\" }) {\n    id\n    username\n    email\n  }\n}<\/code><\/pre>\n<h4>G\u00f6nderi Silme<\/h4>\n<pre><code class=\"language-graphql\">mutation DeletePost {\n  deletePost(id: \"1\")\n}<\/code><\/pre>\n<p>Bu sorgu ve mutasyonlar\u0131 deneyerek API&#8217;nizin bekledi\u011finiz gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulayabilirsiniz.<\/p>\n<h2>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h2>\n<h3>Kimlik Do\u011frulama ve Yetkilendirme (Authentication &#038; Authorization)<\/h3>\n<p>Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda, kullan\u0131c\u0131lar\u0131n API&#8217;ye eri\u015fimini ve belirli i\u015flemleri yapma yetkilerini kontrol etmeniz gerekir. Apollo Server, <code>context<\/code> objesini kullanarak kimlik do\u011frulama ve yetkilendirme bilgilerini \u00e7\u00f6z\u00fcmleyicilere iletmek i\u00e7in m\u00fckemmel bir yol sunar.<br \/>\n<code>context<\/code> fonksiyonunda bir kullan\u0131c\u0131n\u0131n kimlik bilgilerini (\u00f6rne\u011fin JWT token&#8217;dan) ayr\u0131\u015ft\u0131rabilir ve <code>db<\/code> objesiyle birlikte \u00e7\u00f6z\u00fcmleyicilere iletebilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/index.js (context \u00f6rne\u011fi)\nconst server = new ApolloServer({\n  typeDefs,\n  resolvers,\n  context: ({ req }) => {\n    \/\/ HTTP ba\u015fl\u0131klar\u0131ndan token'\u0131 al\n    const token = req.headers.authorization || '';\n    \/\/ Token'\u0131 do\u011frula ve kullan\u0131c\u0131 bilgilerini \u00e7\u0131kar\n    \/\/ \u00d6rne\u011fin, JWT.verify(token) ile\n    const user = { id: 1, username: 'mockUser' }; \/\/ Ger\u00e7ek bir kullan\u0131c\u0131 objesiyle de\u011fi\u015ftirin\n    return { db, user }; \/\/ Kullan\u0131c\u0131 objesini context'e ekle\n  },\n});<\/code><\/pre>\n<p>\u00c7\u00f6z\u00fcmleyicilerinizde bu <code>user<\/code> objesini kullanarak yetkilendirme kontrolleri yapabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/graphql\/resolvers.js (yetkilendirme \u00f6rne\u011fi)\nMutation: {\n  createPost: async (parent, { input }, { db, user }) => {\n    if (!user) throw new Error('Authentication required');\n    \/\/ ... post olu\u015fturma mant\u0131\u011f\u0131\n  }\n}<\/code><\/pre>\n<h3>Hata Y\u00f6netimi (Error Handling)<\/h3>\n<p>GraphQL, hata y\u00f6netimi i\u00e7in standart bir yap\u0131ya sahiptir. Apollo Server, hatalar\u0131 otomatik olarak i\u015fler. Ancak, hatalar\u0131 daha okunabilir hale getirmek veya hassas bilgileri gizlemek i\u00e7in <code>formatError<\/code> se\u00e7ene\u011fini kullanabilirsiniz:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/index.js (formatError \u00f6rne\u011fi)\nconst server = new ApolloServer({\n  \/\/ ...\n  formatError: (error) => {\n    if (error.extensions.code === 'UNAUTHENTICATED') {\n      return new Error('Authentication error: Could not authenticate with given token.');\n    }\n    \/\/ Di\u011fer hata t\u00fcrleri i\u00e7in \u00f6zel i\u015flem yapabilirsiniz\n    return error;\n  },\n});<\/code><\/pre>\n<h3>Veri Y\u00fckleyici (DataLoader) Kullan\u0131m\u0131<\/h3>\n<p>Yukar\u0131daki <code>User<\/code> ve <code>Post<\/code> \u00e7\u00f6z\u00fcmleyicilerindeki ili\u015fkisel veri y\u00fckleme y\u00f6nteminde (\u00f6rne\u011fin, bir kullan\u0131c\u0131 i\u00e7in t\u00fcm g\u00f6nderileri getirme), her kullan\u0131c\u0131 i\u00e7in ayr\u0131 bir veritaban\u0131 sorgusu yap\u0131ld\u0131\u011f\u0131n\u0131 fark etmi\u015f olabilirsiniz. Bu, N+1 sorgu problemine yol a\u00e7ar ve performans\u0131 olumsuz etkileyebilir. DataLoader k\u00fct\u00fcphanesi bu sorunu \u00e7\u00f6zmek i\u00e7in tasarlanm\u0131\u015ft\u0131r. DataLoader, ayn\u0131 anda birden fazla iste\u011fi toplar (batching) ve \u00f6nbelle\u011fe al\u0131r (caching), b\u00f6ylece veritaban\u0131na yap\u0131lan sorgu say\u0131s\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<p><code>src\/index.js<\/code> dosyas\u0131nda <code>context<\/code>&#8216;e DataLoader&#8217;\u0131 ekleyebiliriz:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/index.js (DataLoader entegrasyonu)\nconst DataLoader = require('dataloader');\n\n\/\/ ...\n\nasync function startApolloServer() {\n  await db.sequelize.sync({ alter: true });\n\n  const server = new ApolloServer({\n    typeDefs,\n    resolvers,\n    context: () => ({\n      db,\n      \/\/ DataLoader \u00f6rnekleri\n      userLoader: new DataLoader(async (ids) => {\n        const users = await db.User.findAll({ where: { id: ids } });\n        return ids.map(id => users.find(user => user.id === id));\n      }),\n      postLoader: new DataLoader(async (ids) => {\n        const posts = await db.Post.findAll({ where: { id: ids } });\n        return ids.map(id => posts.find(post => post.id === id));\n      })\n      \/\/ Di\u011fer DataLoader'lar...\n    }),\n    formatError: (error) => {\n      console.error(error);\n      return error;\n    },\n  });\n\n  const { url } = await server.listen({ port: process.env.PORT || 4000 });\n  console.log(<code>  Server ready at ${url}<\/code>);\n}<\/code><\/pre>\n<p>Ve <code>src\/graphql\/resolvers.js<\/code> dosyas\u0131nda DataLoader&#8217;\u0131 kullanabiliriz:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/graphql\/resolvers.js (DataLoader kullan\u0131m\u0131)\nconst resolvers = {\n  \/\/ ...\n  User: {\n    posts: async (parent, args, { db, postLoader }) => {\n      \/\/ Bir kullan\u0131c\u0131n\u0131n t\u00fcm g\u00f6nderilerini getirmek i\u00e7in DataLoader kullanmak daha karma\u015f\u0131kt\u0131r\n      \/\/ \u00c7\u00fcnk\u00fc DataLoader genellikle ID'ye g\u00f6re tekil \u00f6\u011feleri y\u00fckler.\n      \/\/ \u0130li\u015fkisel veriler i\u00e7in ayr\u0131 bir DataLoader yazmak gerekebilir\n      \/\/ veya Sequelize'\u0131n eager loading \u00f6zelli\u011fini Query seviyesinde kullanmak daha mant\u0131kl\u0131 olabilir.\n      \/\/ Ancak, e\u011fer bir Post'un yazar\u0131n\u0131 y\u00fcklerken N+1 problemi ya\u015fan\u0131yorsa:\n      \/\/ return postLoader.loadMany(parent.postIds); \/\/ E\u011fer parent'ta post ID'leri varsa\n      return db.Post.findAll({ where: { userId: parent.id } }); \/\/ \u015eimdilik bu \u015fekilde kalabilir\n    }\n  },\n  Post: {\n    author: async (parent, args, { userLoader }) => {\n      return userLoader.load(parent.userId); \/\/ N+1 problemini \u00e7\u00f6zer\n    }\n  }\n};<\/code><\/pre>\n<p><code>Post<\/code> tipindeki <code>author<\/code> \u00e7\u00f6z\u00fcmleyicisinde <code>userLoader.load(parent.userId)<\/code> kullan\u0131m\u0131, birden fazla g\u00f6nderinin ayn\u0131 yazara sahip olmas\u0131 durumunda yaln\u0131zca tek bir veritaban\u0131 sorgusu yap\u0131lmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>TypeScript Kullan\u0131m\u0131<\/h3>\n<p>B\u00fcy\u00fck \u00f6l\u00e7ekli projelerde TypeScript kullanmak, kod kalitesini art\u0131r\u0131r ve hatalar\u0131 derleme zaman\u0131nda yakalaman\u0131z\u0131 sa\u011flar. Apollo Server ve Sequelize, TypeScript ile m\u00fckemmel uyumludur. Bu makale JavaScript tabanl\u0131 olsa da, projeyi TypeScript&#8217;e ta\u015f\u0131mak i\u00e7in <code>@types\/apollo-server<\/code>, <code>@types\/graphql<\/code>, <code>@types\/sequelize<\/code> gibi tip tan\u0131mlamalar\u0131n\u0131 kurman\u0131z ve kodunuzu <code>.ts<\/code> uzant\u0131l\u0131 dosyalar halinde yazman\u0131z yeterlidir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makalede, Node.js ortam\u0131nda GraphQL sunucusu kurmak i\u00e7in Apollo Server&#8217;\u0131 ve ili\u015fkisel veritaban\u0131 y\u00f6netimini kolayla\u015ft\u0131ran Sequelize&#8217;\u0131 nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frendiniz. Proje yap\u0131land\u0131rmas\u0131ndan ba\u015flayarak, Sequelize modellerini tan\u0131mlad\u0131k, GraphQL \u015femam\u0131z\u0131 ve \u00e7\u00f6z\u00fcmleyicilerimizi olu\u015fturduk ve son olarak Apollo Server&#8217;\u0131 ba\u015flatarak API&#8217;mizi test ettik. Ayr\u0131ca, kimlik do\u011frulama, hata y\u00f6netimi ve N+1 sorgu problemini \u00e7\u00f6zmek i\u00e7in DataLoader gibi geli\u015fmi\u015f konulara da de\u011findik.<\/p>\n<p>GraphQL&#8217;in esnekli\u011fi, Apollo Server&#8217;\u0131n geli\u015ftirici dostu yap\u0131s\u0131 ve Sequelize&#8217;\u0131n g\u00fc\u00e7l\u00fc ORM yetenekleri birle\u015fti\u011finde, modern ve \u00f6l\u00e7eklenebilir web uygulamalar\u0131 i\u00e7in son derece etkili bir API katman\u0131 olu\u015fturabilirsiniz. Bu kurulum, projenizin temelini olu\u015fturacak ve gelecekteki geli\u015ftirmeleriniz i\u00e7in sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 sa\u011flayacakt\u0131r. Veritaban\u0131 etkile\u015fimlerinizi GraphQL ile nas\u0131l y\u00f6netece\u011finizi anlayarak, istemci taraf\u0131 uygulamalar\u0131n\u0131z i\u00e7in daha verimli ve optimize edilmi\u015f veri eri\u015fimi sa\u011flayabilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"Node.js&#8217;te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu\nGiri\u015f\nModern web uygulamalar\u0131, verilerle etkile\u015fim kurmak i\u00e7in g\u00fc\u00e7l\u00fc ve e","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[874],"tags":[],"class_list":{"0":"post-38658","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-server","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Node.js&#039;te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu - 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\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js&#039;te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu\" \/>\n<meta property=\"og:description\" content=\"Node.js&#039;te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu Giri\u015f Modern web uygulamalar\u0131, verilerle etkile\u015fim kurmak i\u00e7in g\u00fc\u00e7l\u00fc ve e\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-04T20:40:49+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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js&#8217;te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu\",\"datePublished\":\"2026-02-04T20:40:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/\"},\"wordCount\":2056,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Server\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/\",\"name\":\"Node.js'te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-04T20:40:49+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js&#8217;te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu\"}]},{\"@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":"Node.js'te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu - 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\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js'te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu","og_description":"Node.js'te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu Giri\u015f Modern web uygulamalar\u0131, verilerle etkile\u015fim kurmak i\u00e7in g\u00fc\u00e7l\u00fc ve e","og_url":"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-04T20:40:49+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js&#8217;te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu","datePublished":"2026-02-04T20:40:49+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/"},"wordCount":2056,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Server"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/","url":"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/","name":"Node.js'te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-04T20:40:49+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-jste-apollo-server-ve-sequelize-ile-graphql-sunucusu-kurulumu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js&#8217;te Apollo Server ve Sequelize ile GraphQL Sunucusu Kurulumu"}]},{"@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\/38658","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=38658"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38658\/revisions"}],"predecessor-version":[{"id":38659,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38658\/revisions\/38659"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38658"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38658"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}