GraphQL 101 — GQL vs. REST API

Uğur Can Çeribaşı
blutv
Published in
4 min readOct 4, 2021

Herkese merhabalar, bu yazımızda GraphQL’in kısa tarihinden başlayarak, ne olduğundan ve ne işe yaradığından, REST API mimarisine göre bize neler kazandırdığından ve modern teknoloji trendleri içerisinde nasıl bir yeri olduğundan bahsedeceğiz. Ardından bazı kod örnekleri ile bahsetmiş olduğumuz teorik konuları pratiğe dönüştürerek daha net anlaşılmasını sağlamaya çalışacağız.

GraphQL, Facebook’un 2012 yılında başlangıçta kendi projelerinde kullanmak için geliştirdiği ve 2015 yılı itibarıyla genel kullanıma açık hale getirdiği bir API sorgu dilidir. Burada karşımıza önemli bir soru çıkıyor. GraphQL nedir ve neden ihtiyaç duyuldu?

Teorik açıklama ile başlayalım. GraphQL, REST API mimarisi üzerine inşa edilmiş ve bu mimarinin bazı eksiklerini kapatarak, yeni bazı özellikler kazanmasına olanak sağlayan bir teknolojidir. Örnek senaryolar üzerinden kazandırdığı yeni özellikleri ve kapattığı eksikleri inceleyebiliriz.

Resim için kaynak : Mobilive.ca

Örnek vermek için Rick and Morty çizgi dizisine ait açık kaynaklı bir API kullanacağız. Aynı API için hem REST hem de GraphQL linklerini aşağıya bırakıyorum.

REST : https://rickandmortyapi.com/api/
GraphQL : https://rickandmortyapi.com/graphql

Örneğin projemiz içerisinde bir web uygulaması, bir de aynı API endpointlerini kullanan mobil uygulaması olduğunu varsayalım. Karakterleri çekeceğimiz bir sayfa var ve daha sonra karakter detay sayfasında web tarafında bize dönen tüm karakter bilgilerini gösterirken, mobilde yalnızca name, status ve species değerlerini istiyoruz. REST API mimarisinde örnek karakteri çekerken kullanacağımız URL character/karakter id olacak, web ve mobil projelerinin ikisi için de aşağıdaki gibi bir result dönecek.
https://rickandmortyapi.com/api/character/1

REST mimarisinde mobil tarafında da aynı endpoint’i kullandığımız koşulda biz yalnızca 3 sütunu kullanıcıya sunacakken, bize aslında ihtiyacımız olmayan bir çok verinin geldiğini görüyoruz. Bu durum çok fazla verinin bulunduğu koşullarda istek süresini daha da yavaşlatacaktır. Burada GraphQL’in bize sağladığı sorgu yapısıyla bu sorunu nasıl gidereceğimize bakalım.
https://rickandmortyapi.com/graphql
GraphQL yapısında bize verinin istediğimiz kadarını alabilmemizi sağlayan bir sorgu dili sunar. Yukarıda mobilde sadece name, status ve species değerlerine ihtiyacımız olduğunu söylemiştik. Bunun sorgusunu aşağıdaki şekilde yazabiliriz. Solda yazmış olduğumuz sorgu ile id değeri 1 olan karakterin name, status ve species değerlerini döndürmek istediğimizi belirtiyoruz. Çalıştırdığımızda dönen sonuç gördüğümüz gibi sağdaki gibidir.

GraphQL’in sağladığı avantajlardan ilkinin bize istediğimiz değerleri döndürmek olduğunu belirtmiş olduk. İkinci avantajını ise yeni bir örnek üzerinden inceleyelim. Bir karakteri ve karakterin oynadığı tüm bölümlerin adını ve yayın tarihini çekeceğimizi varsayalım. Yine yukarıdaki gibi karakter detaylarını çektiğimiz sayfaya bakalım.

Burada oynadığı bölümlerin detayını çekebilmek için REST API mimarisinde character/karakter id URL’ine yapılan istekten sonra gördüğümüz episodes alanındaki tüm URL’lere ayrıca istek yapılması gerekiyor. Böylece karakter detayları dahil 42 farklı istek yapılmış olacak. İşte burada tekrar karşımıza GraphQL çıkıyor. Sadece aşağıda soldaki kadar basit bir sorgu ile tüm bu işlemleri tek bir istek yaparak çözebiliyoruz.

Biraz önce REST mimarisinde 42 farklı request kullandığımız yapıyı GraphQL tek bir request ile çok kısa bir sorgu yazarak sağlıyor. Bunlar dışında veri yapılarımızı dökümante etme aşamasında GraphQL, oluşturduğumuz şema üzerinden bize otomatik bir dökümantasyon oluşturuyor. Aşağıdaki gibi arayüzümüzde ilgili dökümantasyonu görebiliyoruz.

Oluşturulmuş olan dökümantasyon frontend yazılımcıları için hangi tabloda hangi sütunların olduğu ve hangi tipte olduğu gibi detayları içeren çok önemli bir kılavuz haline geliyor. Ek olarak eski servisimizde bulunan bir sütunun değişmesi durumunda bu dökümantasyon bize yeni serviste deprecated olan alanları da gösteriyor. REST mimarisinde servis değişikliklerinde v2, v3 gibi yeni versiyonlar olarak sunulurken, burada deprecated olan alanların arayüzde görülmesi frontend tarafı ile backend tarafı arasındaki olası iletişim kopukluğundan oluşabilecek problemleri de minimize ediyor.

Yazımızı bitirmeden önce şu ana kadar belirlemiş olduğumuz aradaki farkları bir özetleyelim.

  • REST API mimarisinde bir endpoint üzerindeki tüm verileri çekerken, GraphQL mimarisinde bunları özelleştirerek sadece istediğimiz sütunları seçebiliyoruz. İstediğimiz kadarını almamıza olanak sağlıyor.
  • REST API mimarisinde birden fazla tablodan sorgu yapıldığında bu birden fazla istek anlamına gelirken, GraphQL mimarisinde yazdığımız kısa bir sorgu ile tek bir istek göndererek aynı işlemi yapabiliyoruz.
  • GraphQL mimarisi bize kılavuz olarak kullanabileceğimiz bir dökümantasyon sunar. Bu dökümantasyon içerisinde yapılan değişiklikleri ve deprecated olan sütunları görebilmemizi sağlar.

Bu yazımızda kısaca GraphQL’in ne olduğundan ve REST API mimarisine ek olarak neler sunduğundan bahsettik. Bir sonraki yazımızda NodeJS kullanarak GraphQL sunucusunun hazır hale getirilirken geçirdiği programlama süreçlerinden bahsedecek ve basit bir sunucuyu hazır hale getireceğiz. Vakit ayırıp okuduğunuz için teşekkür ederim.

--

--