JSON-REST tabanlı API’ler günümüzde en çok tercih edilen API iletişim protokolleri arasında yer almaktadırlar. Ancak hızlı değişen ve gittikçe karmaşıklaşan API tabanlı iletişim ihtiyacını karşılamada yetersiz kalabileceği durumlar da olabilmektedir.
API’lerin esnekliğini ve verimliliğini artırabilmek fikriyle tasarlanan GraphQL, sorgulanan verinin döneceği yanıtı şekillendirebilmesi ve aynı API ile farklı client gereksinimlerini adresleyebilmesi gibi yetenekleri ile popülarite kazanmaya başladı.
GraphQL Nedir?
GraphQL temelde bir API sorgulama dili ve çalışma zamanı (runtime) olarak düşünülebilir. Geleneksel REST API’lerden farklı olarak, gerekenden fazla veya az veri çekme durumlarına karşı daha esnek ve hassas olabilen bir yaklaşım sunmaktadır. Client uygulamalar, GraphQL ile tam olarak ihtiyaçları olan veriyi ve alanları sorgulayabilirler. Yani bir GraphQL API’si ile yapılan bir sorgu, tam anlamıyla client bakış açısıyla ihtiyaç olan veriyi tanımlamaktadır.
GraphQL’in geliştirilmesine 2012 yılında Facebook tarafından başlandı ve 2015 yılında artık açık-kaynak olarak dağıtılacağı duyuruldu. Şuradan sitesine bir göz gezdirebilirsiniz.
Veri Sorgulama
GraphQL ile yapılan API sorgularında, client uygulama tam olarak ihtiyacı olan veri listesini ve veri yapısını server’a gönderir. Tam da bu sayede, gerekenden fazla veri sorgulanması ya da yanıtta bulunmayan alanlar nedeniyle tekrar tekrar sorgu yapılması durumları yaşanmaz. Ayrıca verimliliği de artıracağı için veri transfer performansı yükselir.
Tek Endpoint Kullanımı ve Yığın Sorguları (Batched Queries)
GraphQL’in veri sorgulamada esnek olması, aynı zamanda bir çok operasyonun tek bir endpoint ile yapılabilmesine de olanak sağlamaktadır. Bu durum, client implementasyonlarında ayrık endpointler ile iletişime geçmek yerine tek endpoint ile çalışılacağından daha pratik olarak düşünülebilir.
Ayrıca GraphQL sorgularında bir grup sorgu, gruplaranak tek bir istek (request) ile de sunucuya gönderilebilmektedir. Bu sayede açılması gereken bağlantı sayısı, ya da bağlantı havuzundan kullanılan bağlantı sayısı düşmekte, network performansında iyileşme sağlanmaktadır.
Yeni Versiyon Esnekliği
REST API’ler için yeni alanlar devreye almak, değişiklikler oluşturmak genelde veriyonlama gerektirir, hatta uyumsuzluk (compatibility) sorunları oluşturabilir. GraphQL kullanımında bu gibi durumlara karşı, şemada artırımlı değişiklikler yapma olanağı bulunmaktadır. Bu sayede mevcut istemcilerin erişimleri ve kullanımları bozulmadan, yeni veri alanları kolayca devreye alınabilmektedir.
Gerçek Zamanlı Sorgulamalar
GraphQL ile abonelik (subscription) tabanlı mimariler de kullanılabilmektedir. REST API’ler genellikle tekrar tekrar sorgulama yaklaşımıyla anlık veri değişimlerini görüntüleyebilmekte kullanılırken, GraphQL ile gerçek zamanlı kullanım varsayılan olarak desteklenmektedir.
Kullanım Alanı
GraphQL, özellikle Backend for Frontend (BFF) mimarisinde oldukça etkili bir şekilde kullanılabilir. BFF, farklı istemcilerin ihtiyaçlarına özgü API istekleri yapmayı kolaylaştırmak için pozisyonlandırılmış bir mimari katman olduğu için ve GraphQL, istemcilerin ihtiyaç duyduğu verileri tek bir istekle almasına olanak sağladığı için frontend geliştiricileri tarafından da tercih edilmektedir. GraphQL kullanımında istemci ve frontend tarafında daha ölçeklenebilir uygulamalar geliştirebilir.