Sürekli duyduğum bu GraphQL denen şey de ne?

Melek Kalyoncu
10 min readJun 27, 2017

Başlığı söyleyip GraphQL’i araştırmaya karar verdiğimde rastladığım en güzel açıklama Sacha Greif‘in “So what’s this GraphQL thing I keep hearing about?” isimli yazısında idi. Ben de madem yazar bu kadar güzel açıklamış, Türkçe’ye çevireyim de benim gibi merak edenler olursa okumak isterler belki dedim. Birkaç kelimeyi bilerek çevirmedim çünkü yerine ne koysam dolmuyormuş gibi hissettirdi. Keyifli okumalar! :)

Eğer benim gibiyseyniz, yeni teknolojiler hakkında konuşurken muhtemelen üç aşamadan geçersiniz.

1.Reddetmek

Bir tane daha Javascript kütüphanesi?! jQuery kullansana işte!

2.İlgilenmek

Belki de sürekli duyduğum şu kütüphaneye bir bakmalıyım..

3.Paniklemek

Yardım edin! Hemen yeni bir kütüphane öğrenmeliyim yoksa tamamen işe yaramaz biri olacağım!

Bu hızlı hareket eden zamanda zihin sağlığınızı korumanın püf noktası; ikinci ve üçüncü aşamaların tam ortasında hala ortalamanın üstünde bilgiye sahipken yeni şeyler sizde bir kere merak uyandırdığında bunları öğrenmektir.

İşte bu yüzden duyduğunuz bu GraphQL öğesinin tam olarak ne olduğunu öğrenmenin zamanı geldi.

Temel Olarak

Kısaca GraphQL, verileri istemeyi açıklayan bir syntaxtır ve genelde sunucudaki verileri bir istemciye yüklemek için kullanılır. GraphQL üç ana özelliğe sahiptir:

  • İstemcinin ihtiyaç duyduğu verilerin tam olarak belirtilmesini sağlar.
  • Birden fazla kaynaktan veriye ulaşmanızı kolaylaştırır.
  • Veriyi açıklamak için bir tür sistem kullanır.

Peki GraphQL nasıl başladı? Uygulamada neye benziyor? Ve kullanmaya nasıl başlayabilirsiniz? Cevapları bulabilmek için okumaya devam edin.

Problem

GraphQL Facebook’ta başladı ancak daha basit uygulamalar bile sıklıkla geleneksel REST API’lerin kısıtlamalarıyla karşılaşabilir.

Örneğin, posts listesini görüntülemeniz gerekiyor ve her gönderinin altında kullanıcıların kullanıcı adlarını ve profil fotoğraflarını içeren bir likes listesi var. Kullanıcı nesnelerini içeren bir likes dizisi ekleyebilmeniz için posts API’leri çekebilmeniz yeterince kolay:

Şimdi mobil uygulamalarda çalışmanın zamanı geldi ve biliyoruz ki fazla veri yüklememiz işleri yavaşlatıyor. Bu yüzden iki adet endpointe ihtiyacımız var, biri beğenileri içeren ve diğeri de içermeyen.

Şimdi de karışıma bir faktör daha ekleyelim: posts MySQL veritabanında saklanıyorken ve diğer taraftan da likesRedis’te bulunuyor. Peki şimdi ne yapacaksın?

Facebook’un yönetmesi gereken bir çok data kaynağı ve API istemcileri için bu durumdan sonuca ulaşabilir ve eski, iyi REST API’lerin neden sınırlarını göstermeye başladığını kavrayabilirsin.

Çözüm

Facebook’un getirdiği çözüm kavramsal olarak çok basit: birden fazla “yetersiz” endpointler kullanmak yerine karmaşık sorgulara cevap verebilen tek bir “akıllı” endpointe sahip olmak ve ardından verilerin çıktısını istemcinin istediği şekilde iletmek.

Uygulamalı olarak söylemek gerekirse, GraphQL katmanı bir veya birden fazla veri kaynağı ile istemcinin arasında yaşar, istemci isteklerini alır ve talimatlarınıza uygun olarak gereken verileri size getirir. Şaşırdınız mı?

Eski REST modeli pizza sipariş etmeniz, ardından bakkaldaki siparişlerinizi almanız, sonra da kıyafetlerinizi alabilmeniz için kuru temizlemecinizi aramanız gibidir. Üç dükkan, üç telefon, üç arama.

Diğer yandan GraphQL kişisel asistana sahip olmak gibidir: GraphQL’e bu yerlerin adreslerini veriyorsunuz sonra da sadece ne istediğinizi (“bana temiz kıyafetlerimi, büyük boy pizzamı ve iki düzine yumurtamı getir”) söyleyip isteklerinizin gelmesini bekliyorsunuz.

Başka bir deyişle, GraphQL bu büyülü kişisel asistan ile konuşmanız için standart bir dil oluşturur.

Bileşenler

Uygulamada, bir GraphQL API’si üç temel yapı etrafında düzenlenmiştir: şema, sorgular ve resolvers.

Sorgular

GraphQL asistanınıza bulunduğunuz talep bir sorgudur ve şu şekilde görünür:

query {
stuff
}

query anahtar kelimesini kullanarak yeni bir sorgu açıyoruz sonra da stuff adında bir alan istiyoruz. GraphQL sorguları ile ilgili harika olan bir şey de şu; iç içe geçmiş alanları destekledikleri için bir adım daha ileri gidebiliyoruz:

query {
stuff {
eggs
shirt
pizza
}
}

Gördüğünüz gibi, sorguyu yapan istemcinin verilerin hangi dükkandan geldiğini önemsemesi gerekmiyor. Sadece ihtiyacınız olan şeyi isteyin ve GraphQL sunucusunun geri kalan her şeyi halletmesine izin verin.

Ayrıca sorgu alanlarının dizileri point edebileceğini belirtmek gerekir. Mesela, burada bir posts listesini sorgulamak için kullanılabilecek ortak bir model var:

query {
posts { # bu bir dizidir.
title
body
author { # daha derine inebiliriz!
name
avatarUrl
profileUrl
}
}
}

Sorgu alanları ayrıca argümanları da desteklemektedir. Belirli bir gönderiyi görüntülemek istediğimde posts alanına id argümanını ekleyebilirim.

query {
post(id: "123foo"){
title
body
author{
name
avatarUrl
profileUrl
}
}
}

Son olarak, eğer id argümanını dinamik yapmak istersem, bir değişken tanımlayabilir ve bunu sorgu içerisinde tekrar kullanabilirim (ayrıca burada sorguyu isimlendirdiğimizi dikkate alın):

query getMyPost($id: String) {
post(id: $id){
title
body
author{
name
avatarUrl
profileUrl
}
}
}

Tüm bunları uygulamaya dökmenin iyi bir yolu GitHub’ın GraphQL API Explorer’ını kullanmaktır. Örneğin, aşağıdaki sorguyu deneyebilirsiniz:

query {
repository(owner: "graphql", name: "graphql-js"){
name
description
}
}
GraphQL otomatik tamamlama

descriptionın altına yeni bir isim yazmayı denediğinizde, IDE otomatik olarak GraphQL API’nin tamamladığı olası isimleri size sunar. Temiz!

Bir GraphQL Sorgusunun Anatomisi

GraphQL sorgularıyla ilgili daha fazlasını “The Anatomy of a GraphQL Query” isimli makaleden öğrenebilirsiniz.

Resolvers

Dünyanın en iyi kişisel asistanı bile onlara bir adres vermediğiniz sürece kuru temizlemeden kıyafetlerinizi alamaz.

Benzer olarak, GraphQL sunucusu da ona bir resolver kullanmasını söylemediğiniz sürece gelen sorgu ile ne yapacağını bilemeyecektir.

Bir resolver, GraphQL’e belirli bir alana karşılık gelen verileri nasıl ve nereden alacağını söyler. Örneğin, yukarıda yazılan alan için bir resolverın nasıl göründüğünü inceleyelim(GraphQL-Tools kullanılarak oluşturulmuştur):

Query: {
post(root, args) {
return Posts.find({ id: args.id });
}
}

Query‘ye resolver bırakıyoruz çünkü root seviyesindeki posts için doğrudan bir sorgu oluşturmak istiyoruz. Ayrıca, bir post‘un author (yazar) gibi alt-alanları için de resolverınız olabilir.

Query: {
post(root, args) {
return Posts.find({ id: args.id });
}
},
Post: {
author(post) {
return Users.find({ id: post.authorId})
}
}

Ve şunu da not edelim resolverın veritabanı dökümanlarını döndürmesi konusunda bir sınırı yok. Örneğin, post‘a bir commentCount eklemek istediniz:

Post: {
author(post) {
return Users.find({ id: post.authorId})
},
commentsCount(post) {
return Comments.find({ postId: post.id}).count()
}
}

Burada GraphQL ile ilgili anlamanız gereken kilit kavram, API şemalarınız ve veritabanı şemalarınız ayrılmıştır. Diğer yandan, veritabanımızda author ve commentCount alanları olmayabilir ama biz resolver sayesinde bunları “taklit” edebiliriz.

Gördüğünüz gibi, bir resolverda istediğiniz herhangi bir kodu yazabilirsiniz. Bu sebeple, mutation resolver olarak bilindikleri durumda, onların veritabanınız üzerinde değişiklik yapmalarına izin verebilirsiniz.

Şema

Tüm bu iyi şeyler GraphQL’in şema sistemi tarafından mümkün kılınmıştır. Bugün hedefim size kapsamlı bir tanıtımdan çok hızlı bir genel bakış açısı kazandırmaktır, bu nedenle çok fazla detaya girmeyeceğim.

Söylediğim gibi, daha fazla bilgi edinmek isterseniz GraphQL dökümantasyonunu incelemenizi öneririm.

Sık Sorulan Sorular

Birkaç genel soruyu cevaplamak için bir ara verelim.

GraphQL ile graph veritabanı arasındaki ilişki nedir?

Çok değil, gerçekten, GraphQL, Neo4j gibi graph veritabanı ile hiçbir ilgisi yok. “graph” kısmı, alanlar ve alt-alanlar kullanarak API graph’ınızda gezinme fikrinden gelir; “QL” ise “sorgu dili”(query language) anlamına gelmektedir.

REST ile inanılmaz derecede mutluyum, neden GraphQL’e geçmeliyim?

GraphQL’in ele aldığı REST’in eziyetli noktalarına henüz girmediysen, o halde sana bunun iyi bir şey olduğunu söyleyebilirim!

REST üzerinden GraphQL’i kullanmak, uygulamanın kullanıcı deneyimini çok fazla etkilemeyecektir, bu sebeple geçişin herhangi bir ölüm-kalım meselesi değildir. Söylediğim gibi, şansın olursa kesinlikle küçük bir projede GraphQL’i denemeni tavsiye ederim.

GraphQL’i React/Relay/herhangi bir kütüphane olmadan da kullanabilir miyim?

Evet, kullanabilirsin! GraphQL yalnızca bir özellik olduğu için, herhangi bir platformdaki herhangi bir kütüphane ile kullanabilirsin, bir istemci ile(örneğin, Apollo’nun web, iOS, Angular, vb. için GraphQL istemcileri vardır) web, iOS ya da bir GraphQL sunucusuna kendi çağrılarını yaparak kullanabileceğin gibi.

GraphQL Facebook tarafından yapıldı ve Facebook’a güvenmiyorum.

Tekrar söylüyorum, GraphQL bir özelliktir yani Facebook tarafından yazılan tek bir kod satırını bile çalıştırmadan GraphQL uygulamalarını kullanabilirsiniz.

Ve Facebook’un destek vermesi GraphQL ekosistemi için kesinlikle güzel bir artıdır, bu noktada, eğer bir gün Facebook bunu kullanmayı bıraksa bile topluluğun GraphQL’in gelişimi için yeterince büyük olduğuna inanıyorum.

Bana kalırsa, tüm bu “istemcinin ihtiyaç duyduğu verileri çekmesine izin ver” işi kulağa pek güvenli gelmiyor..

Kendi resolverlarınızı yazdığınızdan beri, bu seviyedeki herhangi bir güvenlik endişesini gidermek size bağlıdır.

Örneğin, istemcinin teslim aldığı belgelerin sayısını kontrol etmek amacıyla bir limit parametresi belirtmesine izin verirseniz, istemcilerin milyonlarca belge talep ettikleri yerde, bu ‘limit’ sayısını denial-of-service-style saldırılarından(DoS) korumak için kapatmak isteyeceksinizdir.

Peki başlamak için neye ihtiyacım var?

Genel olarak, GraphQL tabanlı bir uygulamayı çalıştırmak için en az iki bileşene ihtiyacınız olacak:

Sizin API’nizi servis eden bir GraphQL sunucusu

endpoint’inize bağlanan bir GraphQL istemcisi

Mevcut çeşitli seçenekler hakkında daha fazla bilgi edinmek için okumaya devam edin.

GraphQL’in nasıl çalıştığına dair fikir edindiğinize göre biraz da ana oyuncular hakkında konuşalım.

GraphQL Sunucuları

İhtiyacınız olacak ilk şey bir GraphQL sunucusudur. GraphQL’in kendisi sadece bir özelliktir, bu yüzden birkaç rakip uygulamaya açık kapı bırakır.

GraphQL-JS (Düğüm/Node)

Bu GraphQL’in orijinal başvuru uygulamasıdır. API sunucunuzu oluşturmak için express-graphql ile beraber kullanabilirsiniz.

GraphQL-Server (Düğüm/Node)

Apollo ekibinin, kendi hepsi bir arada GraphQL sunucu uygulaması vardır. Henüz orjinali kadar yaygın değil ama yine de çok iyi belgelendirilmiş ve desteklenmedir, aynı zamanda da hızlı bir şekilde yer kazanmaktadır.

Diğer Platformlar

GraphQL.org’da çeşitli platformlar için(PHP, Ruby, vb) GraphQL uygulamaları listesi vardır.

GraphQL İstemcileri

Özel bir istemci kütüphanesine ihtiyaç duymadan teknik olarak GraphQL API’nizi doğrudan sorgulayabilmeniz mutlaka hayatınızı kolaylıştıracaktır.

Relay

Relay, Facebook’un bir GraphQL aracıdır. Ben kullanmadım, ama duyduklarıma göre Facebook’un kendi ihtiyaçlarına göre derlenmiş ve çoğu kullanım için biraz fazla mühendislik sürecine uğradığı söyleniyor.

Apollo İstemcisi

Apollo bu alanda yeni bir katılımcı ve hızlı bir şekilde devralındı. Özgün Apollo istemci kümesi iki maddeden oluşur:

Varsayılan olarak, Apollo istemcisi verilerini Redux’ı kullanarak depolar. Redux, zengin bir ekosistem ile kurulmuş bir state yönetim kütüphanesidir.

Apollo DevTools Chrome Extension

Açık Kaynak Uygulamalar

GraphQL oldukça yeni olmasına rağmen umut vaadeden bazı açık kaynak uygulamaları tarafından da kullanılmaktadır.

VulcanJS

Öncelikle, bir sorumluluk reddi beyanı: Ben VulcanJS’in öncü geliştiricilerindenim. İnsanların çok fazla kalıplaşmış metinler olmadan React/GraphQL kümesinin gücünden yararlanmalarını sağlamak için VulcanJS’i oluşturdum. Birkaç saat içinde CRUD uygulamaları(İnstagram’ın kopyası gibi) oluşturmanızı sağlaması yönünden bunu, “Modern web ekosistemi için Rails” diye de düşünebilirsiniz.

Gatsby

Gatsby, 1.0 versiyonundan itibaren GraphQL tarafından beslenen bir React statik site üreticisidir. İlk bakışta garip bir kombinasyon gibi görünse de aslında oldukça güçlüdür. Oluşturma işlemleri(build process) sırasında Gatsby, birden fazla GraphQL API’leriden veri getirebilir ve sonra da bunları statik bir istemci React uygulaması oluşturmak için kullanabilir.

Diğer GraphQL Araçları

GraphiQL

GraphiQL, GraphQL’in endpointlerini sorgulamak için tarayıcı içi çok kullanışlı bir IDE’dir.

GraphiQL

DataLoader

GraphQL sorgularının iç içe geçmiş yapısından dolayı, tek bir sorgu kolaylıkla onlarca veritabanı çağrısına neden olabilir. Performansı düşürmekten kaçınmak için Facebook tarafından geliştirilmiş DataLoader gibi bir toplu işleme ve ön belleğe alma kütüphanesi kullanabilirsiniz.

Create GraphQL Server

Create GraphQL Server, bir Node sunucu ve bir Mongo veritabanı tarafından desteklenen bir GraphQL sunucusunun kurulumunu kolaylaştıran bir komut satırı yardımcı programıdır.

GraphQL-up

Create GraphQL Server ile benzer şekilde GraphQL-up, GraphCool tarafından desteklenen yeni bir GraphQL back-endini hızlıca ön yükleyebilmenizi sağlar.

GraphQL Hizmetleri

Son olarak, sizin için sunucu tarafındaki tüm işlerle ilgilenecek bir dizi “GraphQL-backend-hizmeti” şirketleri vardır ve bu şirketler GraphQL ekosistemine adım atmanızın güzel bir yolu olabilir.

Graphcool

Graphcool, GraphQL ve AWS Lambda’yı bir developer planı ile birleştiren esnek bir backend platformudur.

Scaphold

Diğer bir GraphQL backend hizmetidir. Graphcool ile bir çok ortak özelliğe sahiptir.

Kaynaklar

Burada GraphQL hakkında bilgilerinizi tazeleyebilmeniz için bir kaç kaynak var.

GraphQL.org

Başlangıç için harika dökümanlara sahip GraphQL’in resmi sayfası.

LearnApollo

Graphcool tarafından yapılmış başka bir ücretsiz kurstur.

The Apollo Blog

Apollo blogunda genel olarak Apollo ve GraphQL hakkında tonlarca detaylı ve iyi yazılmış yayınlar var.

GraphQL Weekly

Graphcool ekibi tarafından düzenlenen, GraphQL hakkında her şeyi konu alan haftalık bir bülten.

Hashbang Weekly

GraphQL’e ilave olarak React ve Meteor’u da kapsayan bir diğer önemli bülten.

Freecom

Bu eğitim serisinde size GraphQL kullanarak bir Intercom klonunun nasıl oluşturulacağını öğretir.

Awesome GraphQL

GraphQL bağlantılarının ve kaynaklarının kapsamlı bir listesi.

Sonraki Adımlar

Peki yeni edindiğiniz GraphQL bilgilerinizi nasıl uygulama koyarsınız? Deneyeceğiniz birkaç tarifi aşağıya bırakıyorum.

Apollo + Graphcool + Next.js

Next.js ve React’ı zaten biliyorsanız, bu örnek Graphcool’u kullanarak GraphQL endpointinizi ayarlamanıza ve ardından Apollo ile sorgulamanızı sağlayacaktır.

VulcanJS

Vulcan eğitimi hem sunucu hem de istemci üzerinde basit bir GraphQL veri katmanı kurmanızı sağlar. Vulcan hepsi bir arada bir platform olduğundan dolayı herhangi bir kurulum olmadan başlamak için güzel bir yol. Yardıma ihtiyacınız olursa, Slack kanalımıza katılmaktan çekinmeyin!

GraphQL ve React Tutorial

Chroma blogunda, bir React/GraphQL uygulaması oluşturma üzerine altı bölümden oluşan bir eğitim serisi bulunmaktadır.

Sonuç

GraphQL, başlangıçta karmaşık görünebilir, çünkü modern geliştirmenin birçok alanına yayılmış bir teknolojidir. Ancak, altta yatan kavramları anlamak için zaman ayırırsanız, birçoğunun anlam ifade ettiğini göreceksiniz.

Aslında bunu kullanmaya ya da kullanmamaya karar verseniz de GraphQL’i tanımak için zaman ayırmaya değer. Gittikçe daha fazla sayıda şirket ve framework GraphQL’i benimsiyor ve önümüzdeki birkaç yıl içinde web’in temel yapı taşlarından biri haline gelebilir.

İlk defa yazılım hakkında bir makaleyi çevirdim, bazı terimler zorladı itiraf edeyim :D Bu sebeple hatalarım olabilir ama umarım fazla değillerdir, fark ettiğiniz hatalar olursa doğrusunu öğrenmek isterim. Okuduğunuz için teşekkürler :)

--

--