GraphQL nedir? Şema, sorgu ve mutasyon mantığı
GraphQL, istemcinin yalnızca ihtiyaç duyduğu veriyi tek bir istekle sorguladığı API sorgu dilidir. Şema, sorgu, mutasyon ve çözümleyici nasıl çalışır.
GraphQL nedir?
GraphQL, API'ler için geliştirilmiş bir sorgu dili ve bu sorguları çalıştıran sunucu tarafı çalışma ortamıdır. İstemci, sunucudan tam olarak hangi alanları istediğini bir sorguyla belirtir ve yanıt, sorgunun şekliyle birebir uyumlu gelir. Tek bir uç noktaya gönderilen tek bir istek, birbiriyle ilişkili birçok kaynağın verisini birlikte getirebilir.
GraphQL bir veritabanı ya da depolama teknolojisi değildir. Mevcut veritabanlarının, servislerin ve hatta REST API'lerinin önüne konulabilen bir erişim katmanıdır.
Nasıl çalışır? Şema, çözümleyici ve sorgu
Her GraphQL API'nin merkezinde bir şema bulunur. Şema, sorgulanabilecek tipleri, bu tiplerin alanlarını ve aralarındaki ilişkileri tanımlar. Şema istemci ile sunucu arasındaki sözleşmedir; tipler kesin olduğu için geçersiz bir sorgu çalışmadan önce reddedilir.
Çalışma akışı şöyledir: • İstemci, şemaya uygun bir sorgu yazar. • Sunucu sorguyu şemaya göre doğrular. • Her alan için bir çözümleyici (resolver) fonksiyonu çalışır; bu fonksiyon veriyi veritabanından, başka bir servisten ya da önbellekten alır. • Sonuçlar, istenen şekle göre birleştirilip tek yanıt olarak döner.
Bu yapı, ön yüz ekiplerinin sunucu ekibini beklemeden yeni alan kombinasyonları istemesine imkân verir.
Sorgu, mutasyon ve abonelik
GraphQL'de üç işlem türü vardır.
Sorgu (query): veriyi okur. Örneğin bir müşterinin adını ve son siparişlerinin durumunu aynı istekte isteyebilirsiniz.
Mutasyon (mutation): veriyi değiştirir. Yeni sipariş oluşturmak ya da bir kaydı güncellemek mutasyonla yapılır.
Abonelik (subscription): sunucudan gerçek zamanlı bildirim almak için kullanılır. Bir siparişin durumu değiştiğinde istemcinin otomatik haberdar olması buna örnektir.
Küçük bir örnek
Örneğin bir mobil uygulamanın profil ekranı yalnızca kullanıcının adını ve profil fotoğrafını gösteriyor. GraphQL sorgusu bu iki alanı ister ve yanıt yalnızca bu iki alanı içerir. Kullanıcıya ait onlarca başka alan sunucuda dursa bile ağ üzerinden taşınmaz.
Bir yönetim ekranı aynı kullanıcıdan adresleri ve siparişleri de istediğinde, sunucuda yeni bir uç nokta yazmaya gerek kalmaz; istemci sorgusuna yeni alanları ekler. Bu esneklik, aynı API'yi kullanan farklı ekranların farklı veri ihtiyaçlarını tek şemada karşılar.
Sık karşılaşılan zorluklar
GraphQL esneklik getirir, ancak bazı konularda dikkat ister.
Performans: iç içe sorgular çözümleyicilerde birçok küçük veritabanı çağrısına yol açabilir (iç içe sorgu sorunu). Veri yükleyici (DataLoader) gibi gruplama teknikleri bu sorunu azaltır. Çok derin ya da pahalı sorguları sınırlamak için derinlik ve maliyet limitleri de uygulanır.
Güvenlik: tek uç nokta olduğu için yetkilendirme alan seviyesinde düşünülmelidir. Kimin hangi alanı görebileceği çözümleyici ya da şema katmanında denetlenir.
Önbellekleme: tek uç noktaya gelen isteklerin ortak ağ önbelleğiyle saklanması REST kadar basit değildir; istemci tarafı önbellekler bu işi üstlenir.
Nerede kullanılır, ne zaman tercih edilir?
GraphQL; birden çok istemcinin (web, mobil, üçüncü taraf) farklı veri ihtiyaçlarını tek bir API'den karşılaması gereken, ilişkili verinin yoğun olduğu uygulamalarda tercih edilir. Büyük kurumlarda birden çok servisin şemasını tek bir birleşik grafikte toplayan federasyon yaklaşımı da kullanılır.
Basit, kaynak odaklı ve önbelleklenmesi kolay API'ler için REST çoğu zaman yeterli ve daha sade kalır. İki yaklaşım birbirinin yerine değil, ihtiyaca göre seçilen alternatifler olarak düşünülmelidir.
Mindset programlarında GraphQL
Mindset kataloğundaki GraphQL ile API Geliştirme programı şema tasarımı, çözümleyici geliştirme, kimlik doğrulama ve yetkilendirme, performans ve güvenlik, gerçek zamanlı abonelikler, üretim ve federasyon ile GraphQL temelleri ve REST karşılaştırması başlıklarını içerir. Apollo GraphQL ile İstemci ve Sunucu Geliştirme programında Apollo Server ve Apollo Client, GraphQL Şema Tasarımı ve Federasyon programında ise ilişkiler, sayfalama, federasyon mimarisi ve gözlemlenebilirlik konuları işlenir.
İlgili Mindset programı
GraphQL ile API Geliştirme
Sık sorulan sorular
GraphQL, REST'in yerine mi geçer?
Hayır, ikisi farklı ihtiyaçlara hitap eder. GraphQL esnek veri sorgusu gereken, ilişkili veri yoğun uygulamalarda avantaj sağlar. Basit kaynak odaklı API'lerde REST çoğu zaman yeterlidir. Birçok sistem ikisini bir arada kullanır.
GraphQL bir veritabanı mıdır?
Hayır. GraphQL bir sorgu dili ve çalışma ortamıdır. Veri, çözümleyiciler aracılığıyla veritabanlarından, servislerden veya başka API'lerden getirilir. Örneğin bir sipariş sorgusu siparişi ilişkisel bir veritabanından, müşteri bilgisini ayrı bir servisten çekebilir; istemci bu kaynakların farkını görmez.
GraphQL hangi dillerde kullanılabilir?
Birçok programlama dili için sunucu ve istemci kütüphaneleri bulunur. Dilden bağımsız bir şartname olduğu için JavaScript, Java, Python gibi çeşitli ortamlarda uygulanabilir. Sunucu tarafında çözümleyiciler o dilin veri erişim kütüphaneleriyle yazılır; istemci tarafında web ve mobil uygulamalar için hazır kütüphaneler sorguyu gönderir ve yanıtı önbelleğe alır.
İç içe sorgu sorunu nedir?
İç içe bir sorguda her üst kayıt için ayrı bir veritabanı sorgusu çalışması durumudur. Çözümleyiciler veriyi tek tek getirdiğinde istek sayısı gereksiz artar. Gruplayan veri yükleyiciler bu sorunu azaltır.