GraphQL -Ne Vereyim Abime?

Adil Deveci
Doğuş Teknoloji
Published in
7 min readMay 11, 2023

Bu yazımızda GraphQL hakkında öğrendiğim bazı teorik bilgileri derleyerek sizlerle paylaşmak ve sonrasında güzel bir uygulama ile bu bilgileri pekiştirmek istiyorum.

GraphQL, veri kaynaklarına (API’ler, veritabanları vb.) yapılan sorguları ve mutasyonları tanımlamak için kullanılan bir sorgulama dilidir.

Geleneksel API’lerin aksine, GraphQL API’leri yalnızca istemcilerin ihtiyacı olan verileri almasına izin verir. Bu, ağ trafiğinin azaltılmasına, istemci kodunun daha basit olmasına ve uygulama performansının artmasına yardımcı olur.

GraphQL, istemcilerin ihtiyaç duydukları verileri sorgulayabilecekleri bir sorgu dilidir. İstemci, istediği verileri sorgulama sırasında belirtir ve sunucu, sadece istemcinin ihtiyaç duyduğu verileri yanıt olarak döndürür.

GraphQL, bir şema (schema) oluşturulmasına izin verir. Şema, API’nin kullanımı hakkında bilgi içeren bir belgedir. Şema, API’ye gönderilebilecek sorguların türlerini, parametrelerini ve döndürülecek verilerin tiplerini tanımlar.

GraphQL sorguları, JSON formatında gönderilir ve sunucu da JSON formatında yanıt verir. GraphQL, birçok programlama dili tarafından desteklenir ve birden fazla platformda kullanılabilir.

GraphQL, Facebook tarafından geliştirilmiştir ve açık kaynaklıdır. GraphQL, özellikle tek sayfa uygulamaları gibi modern uygulama geliştirme yaklaşımlarında popülerdir.

GraphQL vs REST

GraphQL vs Rest

GraphQL ve REST, web uygulamalarının veri alışverişi yapmak için kullandığı iki farklı API protokolüdür. Her ikisi de belirli avantajlara ve dezavantajlara sahiptir.

REST, standart HTTP protokolünü kullanır ve genellikle tek bir kaynak üzerinde işlemler yapmak için tasarlanmıştır. REST, kaynakların URI’larına dayalı bir arayüz kullanarak kaynaklar arasındaki etkileşimi yönetir. REST API’leri, genellikle GET, POST, PUT ve DELETE gibi HTTP yöntemlerini kullanarak veriye erişir.

GraphQL, bir sorgulama dilidir ve API istemcilerinin ihtiyaç duydukları verileri belirlemelerine olanak tanır. GraphQL API’leri, yalnızca istemcilerin talep ettiği verileri yanıt olarak gönderir. Bu, ağ trafiğinin azaltılmasına, istemci kodunun daha basit olmasına ve uygulama performansının artmasına yardımcı olur.

GraphQL, REST’e göre bazı avantajlara sahiptir. Örneğin, GraphQL API’leri, istemcilerin yalnızca ihtiyaç duydukları verileri almasına izin verir. Bu, ağ trafiğini azaltır ve daha hızlı uygulama performansı sağlar. Ayrıca, GraphQL API’leri, istemci tarafında karmaşık bir mantık içermesi gerekmeksizin, uygulama veri gereksinimlerine özelleştirilebilir.

Bununla birlikte, REST API’leri de birçok avantaja sahiptir. REST API’leri, çok sayıda veri kaynağına sahip uygulamalarda daha iyi ölçeklenebilirlik sağlar. Ayrıca, REST API’leri, HTTP yöntemlerinin basitliği nedeniyle daha kolay anlaşılabilir ve uygulanabilir olabilir.

Özetlemek gerekirse, GraphQL ve REST, uygulamanın gereksinimlerine bağlı olarak kullanılabilir. GraphQL, tek sayfalı uygulamalar ve hızlı veri gereksinimlerinin olduğu durumlarda faydalı olabilirken, REST API’leri, çok sayıda veri kaynağına sahip uygulamalar ve basit CRUD işlemleri için daha iyi bir seçenek olabilir.

GraphQL sorguları ve mutasyonları nasıl oluşturulur?

GraphQL sorguları ve mutasyonları, GraphQL sorgulama dilini kullanarak oluşturulur. GraphQL sorguları, istemcinin sunucudan belirli verileri sorgulamasını sağlar. Mutasyonlar ise, sunucuda değişiklik yapmak için kullanılır.

GraphQL sorguları, şu şekilde oluşturulur:

  • Sorgu adını belirleme: Sorgunun adını belirleyin, böylece daha sonra sorgunun sonuçlarını referans alabilirsiniz.
  • Alanları belirleme: İstediğiniz veri alanlarını (fields) belirleyin. Her alanın adı ve veri tipi belirtilir.
  • Parametreleri belirleme: Sorgulara, değişkenler, filtreler ve sıralama gibi parametreler ekleyebilirsiniz.

Örneğin, bir GraphQL sorgusu, şu şekilde görünebilir:

Bu sorgu, “GetUser” adında bir sorgudur ve “id” adında bir değişken alır. Sorgu, “user” alanından “name”, “email” ve “posts” alanlarını sorgulamaktadır. “posts” alanı altında, “title” ve “content” alanları da sorgulanmaktadır.

Mutasyonlar, sunucudaki verileri değiştirmek için kullanılır. Mutasyonlar, GraphQL sorgularına benzer şekilde oluşturulur. Ekleme, silme ve güncelleme olmak üzere üç çeşit mutasyon vardır.

Ancak, mutasyonlar, genellikle “mutation” anahtar kelimesi ile başlar ve değişiklik yapılacak verileri belirten alanlar içerir.

Örneğin, bir GraphQL mutasyonu, şu şekilde görünebilir:

GraphQL örnek update mutation

Bu mutasyon, “UpdateUser” adında bir mutasyondur ve “id”, “name” ve “email” adında üç değişken alır. “updateUser” alanı, sunucudaki verileri güncelleştirmek için kullanılır ve “id”, “name” ve “email” alanları da güncellenen verileri döndürür.

GraphQL şema tasarımı

GraphQL şeması, bir uygulamanın API’sinde bulunan tüm verilerin yapısal bir tanımını sağlar. Şema, veri kaynaklarından alınan verilerin nasıl alınacağını, hangi alanların alınacağını ve verilerin nasıl ilişkilendirileceğini tanımlar.

GraphQL şeması tasarımında, birkaç önemli noktaya dikkat edilmelidir:

  • Şema, uygulamanın kullanımını yansıtmalıdır. Kullanıcılar tarafından sıklıkla erişilen veriler, şemada öncelikli olarak tanımlanmalıdır.
  • Şema, yeterince esnek olmalıdır, böylece gelecekteki işlevsellik de ekleyebilirsiniz. Ancak, gereksiz detaylara yer verilmemelidir.
  • Şema, uygun bir şekilde organize edilmelidir. Ayrık veri kaynaklarının ayrı ayrı tanımlanması ve gereksiz verilerin atılması, şema tasarımını optimize etmek için kullanılacak tekniklerdir.

GraphQL’de güvenlik

Kimlik Doğrulama

GraphQL API’leri, kimlik doğrulama yöntemleri kullanılarak korunabilir. API istekleri, kullanıcı kimlik bilgileriyle imzalanarak gönderilebilir. Bu kimlik bilgileri, kullanıcı adı ve parolayı içerebilir. GraphQL sunucuları, kullanıcıların kimlik bilgilerini doğrulayarak, sadece doğrulanmış kullanıcıların API’ye erişmesine izin verir. Kimlik doğrulama, JWT (JSON Web Token) gibi standart kimlik doğrulama yöntemleri kullanılarak gerçekleştirilebilir.

Yetkilendirme

Kimlik doğrulama yapıldıktan sonra, kullanıcının API’ye erişim seviyesini belirlemek için yetkilendirme yapılması gerekir. Yetkilendirme, kullanıcının API’de hangi kaynaklara erişebileceğini ve hangi işlemleri yapabileceğini belirler. GraphQL, belirli bir kaynağa erişimi kısıtlama yeteneği sağlar. Bununla birlikte, GraphQL sunucusu, sorguları yürütürken hangi verilere erişilebileceğini belirlemek için bir yetkilendirme mekanizması gerektirir. Bu yetkilendirme mekanizması, uygulamanın gereksinimlerine bağlı olarak özelleştirilebilir.

GraphQL sunucuları, kimlik doğrulama ve yetkilendirme konularında çeşitli güvenlik önlemleri sunar. Bu önlemler, API’ye erişim seviyesini sınırlandırmak, sorguların performansını artırmak ve hassas verilerin yetkisiz erişimini önlemek için gereklidir.

GraphQL araçları ve çerçeveleri

GraphQL’i kullanmak için birçok araç ve çerçeve bulunmaktadır. İşte bazıları:

Apollo: Apollo, JavaScript tabanlı bir GraphQL istemci ve sunucu kütüphanesidir. Hem web hem de mobil uygulamalar için kullanılabilir. Apollo, GraphQL sunucusunu geliştirmek için bir dizi araç da sağlar.

Relay: Relay, Facebook tarafından geliştirilen bir GraphQL istemci kütüphanesidir. React ile entegre edilebilir ve büyük ölçekli uygulamalar için tasarlanmıştır.

Prisma: Prisma, GraphQL API’leri için bir ORM (Nesne İlişkisel Eşleme) aracıdır. Veri tabanı sorgularını otomatik olarak oluşturarak ve GraphQL API’lerini otomatik olarak dökümleyerek geliştirme sürecini hızlandırır.

Hasura: Hasura, bir GraphQL sunucusu sağlar ve PostgreSQL veri tabanlarını GraphQL API’leriyle birleştirmeyi kolaylaştırır. Veri tabanındaki değişiklikleri otomatik olarak GraphQL API’sine yansıtır.

GraphCMS: GraphCMS, GraphQL API’leri için bir headless CMS (İçerik Yönetim Sistemi) sağlar. Verilerinizi ve içeriğinizi GraphQL API’leri aracılığıyla yönetmenize olanak tanır.

PostGraphile: PostGraphile, PostgreSQL veri tabanlarından GraphQL API’leri oluşturmak için kullanılır. Otomatik olarak GraphQL şeması oluşturur ve GraphQL API’lerini hızlı bir şekilde hazırlamanıza yardımcı olur.

Bu, sadece birkaç GraphQL aracı ve çerçevesi örneğidir. Farklı kullanım senaryoları ve gereksinimler için daha fazla seçenek mevcuttur.

Örnek Çalışma (Film sitesi)

Bu kadar teorik bilgi ardından ufak bir demo ile bilgilerimizi pekiştirelim.

Şu anda en güncel versiyon olan DotNet Core 7 ile GraphQL kullanarak örnek bir proje yapacağız. Konu olarak IMDB benzeri bir sitenin GraphQL ile yazılmış backendi olarak düşünebilirsiniz.

Öncelikle projenin kodlarına buradan ulaşabilirsiniz: https://github.com/adildeveci/SampleGraphQL

Not: .net core sürüm değiştikçe Program.cs’de yapacağımız ayarlamalar değişebilmektedir bu nedenle özellikle proje .net core 7’de yazıldığını belirtmekte fayda var.

Client’ların kullanabilmesi için graphql sorgularını manuel yazabileceğimiz gibi bu sorguları yazmak için GraphiQL, Playground gibi hazır arayüzlerde var. Ben birkaç hazır arayüz denedikten sonra en çok hoşuma giden Playground arayüzü ile ilerlemeya karar verdim.

Projemizi indirip ayağa kaldırdığımızda /ui/playground url’inden playground arayüzüne erişim sağlayarak, proje içinde kullandığımız şema detaylarına erişebiliriz. Bu şema’da proje içinde hangi sorgular ve hangi tip nesnelerin olduğunu görebiliriz.

Aşağıdaki basit bir sorgu ile sistemdeki film kategorilerini çekebiliriz

Daha detaylı bir sayfada kullanmak üzere filme ait daha fazla detay istersek aşağıdaki gibi sorgumuza daha fazla alan ekleyebiliriz.

Şimdi basit birkaç filtreleme örneği yapalım. Filteleme yapmak için Rest’de olduğu gibi doğrudan string yada int field’lar kullanabileceğimiz gibi daha gelişmiş filtrelemeler için filtre modeli kullanabiliriz. Film objesi içinde filtrelemebilecek çok alan olduğu için ben Filtereleme modeli kullanarak ilerlemek istedim.

Benim gibi aksiyon sevenler için kategorisi aksiyon(6) olan filmleri listeleyelim

Kategorisi Crime(1) olan filmlerin sadece isimlerini ve imdb puanlarını listeleyelim

Kategorisi Crime(1) olan ve Imdb puanı en az 9.1 olan filmlerin sadece isimlerini ve imdb puanlarını listeleyelim

Bu sorguların projemizde karşılık bulabilmesi için en önemli kod parçasını aşağıda paylaşmak isterim.

MovieQuery sınıfında dışarıya açtığımız sorgular bulunmakta. Dikkat ederseniz Movies sorgusunda filtre uyguladık fakat Genres sorgusunda filtre uygulamadık, bu nedenle UI tarafında da Genres listesini çekerken verileri filtreleyemeyiz.

Bir yazının daha sonuna geldik. Basit gibi görünse de detaya girdikçe incelenmesi gereken birçok konu çıkıyor. Dikkat ettiyseniz örnekler kısmında mutasyonlara hiç giremedik bile.

Yazdığımız demoda sadece sunucu tarafı için proje geliştirdik, bir de bu verileri kullanan bir ya da daha fazla client uygulaması olması gerekir. UI tarafında geliştirdiğimiz sorguları client uygulamasına entegre ederek istediğimiz client uygulamasında istediğimiz alanları çekip gösterebiliriz.

--

--