Odak modu
GraphQL, REST'in üzerine inşa edilmiş ve onun eksikliklerini kapatan yeni bir anlayış, yeni bir mimaridir. Facebook tarafından geliştirilmiştir ve Facebook, Instagram, PayPal ve Netflix gibi büyük ölçekli şirketler tarafından yoğun olarak kullanılmaktadır.
İsminde Graph kelimesi geçtiğinden, genelde bir veritabanı yönetim sistemi olarak düşünülebiliyor. GraphQL, yeni bir programlama dili veya veritabanı yönetim sistemi değildir.
Bu başlık altında GraphQL'i, Rest ile karşılaştırarak avantajlarını görmeye çalışacağız.
Bir backend geliştirdiğimizi düşünelim. Bu backend'i kullanacak olan bir mobil uygulama ve bir de web uygulaması geliştirdiğimizi ve anasayfada kullanıcı postlarını listelememiz gerektiğini varsayalım. Ancak bu postları listelerken web uygulamasında id, username, description, created date, comments gibi alanları göstermemiz gerekirken mobil uygulama tarafında sadece id, username ve description kolonlarına ihtiyacımız olduğunu varsayalım.
Eğer bu backend'i Rest API olarak geliştirseydik anasayfadaki postların sahip olduğu tüm kolonlar db üzerinde select edilecekti. Ancak biz mobil uygulama tarafında sadece iki kolona ihtiyaç duyuyoruz. Böyle olmasına rağmen yine de o ihtiyacımız olmayan veriler API'dan bize gelmek durumundaydı.
Ama eğer bunu GraphQL ile yapsaydık böyle bir zorunluluğumuz olmayacaktı. Çünkü GraphQL ile sadece istediğimiz alanlar için özel Query'ler yazabiliriz.
Web uygulaması için çalıştırmamız gereken Query;
query WebAppPostsQuery{
posts{
id
username
description
created_at
comments{
id
username
}
}
}
Mobil uygulamamız için çalıştırmamız gereken Query;
query WebAppPostsQuery{
posts{
id
username
description
}
}
Görüldüğü üzere aynı backend üzerine farklı client'lar tarafından erişip, farklı farklı cevaplar bekleyebiliyoruz. Bu da bize günün sonunda bandwidth optimizasyonu olarak geri dönüyor.
Eğer backend'i REST ile geliştiriyor olsaydık oluşturmamız gereken onlarca farklı endpoint olacaktı. Sisteme kayıtlı kullanıcılarımız, bu kullanıcıların gönderileri ve bu gönderilere ait yorumların olduğunu varsayalım. Bu durumda endpointlerimiz muhtemelen şöyle olacaktı;
Bu liste daha da uzar gider elbette. Kullanıcı, gönderi veya yorumlar için ekleme, silme, güncelleme gibi endpoint'leri eklemedim bile. O endpointlerin de diğer HTTP metodları(POST,UPDATE,DELETE) ile yazılması gerekir.
Ancak işin GraphQL tarafına baktığımız zaman böyle bir endpoint karmaşası ile uğraşmamız gerekmiyor. GraphQL tarafında istekleri bekleyen tek bir endpoint bizi karşılıyor. Tüm isteklerimizi buraya yapmamız gerekiyor. Ve aynı Query içerisinde birden fazla veriyi getirme imkanımız da var.
Örneğin biz bir istek içerisinde tüm kullanıcıları, tüm gönderileri ve tüm yorumları getirmek istersek aşağıdaki Query'i çalıştırmamız yeterli olacaktır.
query getAll{
users{
id
username
}
posts{
id
description
}
comments{
id
text
}
}
GraphQL ilişkili veriler ile çalışırken size çok büyük kolaylıklar sağlar. Aşağıdaki Query, sistemde bulunan tüm kullanıcıları, her bir kullanıcının sahip olduğu gönderileri ve bu gönderilere ait yorumları listeler.
query{
users{
id
username
posts{
id
description
comments{
id
text
}
}
}
}
Aynı işi REST ile yapmak isterseniz backend üzerindeki üç ayrı endpoint'e istek atmanız gerekecekti. Veya bu verileri sağlayacak tek bir endpoint üzerinde birleştirmeniz ve artık oraya istek atamanız gerekecekti. Bu da backend geliştiricilere ek bir yük demektir.
GraphQL şemalarınızı tasarlamaya başladığınız anda sizin için otomatik olarak dokümanlar oluşturulur. Bu dokümanlar API'ı implemente edecek olan frontend geliştiricinin ihtiyaç duyduğu tek şeydir. Bu dokümanı inceleyerek hızlıca implementasyon yapmaya başlayabilir. Artık dokümanlama için de ekstra efor sarf etmenize gerek yok.
Aslında GraphQL terminolojisini üç ana başlık altında toplayabiliriz. Bunlar Query, Mutation ve Subscription.
Aslında bunu GET methoduna benzetebilirsiniz. Bir veri kaynağına erişmek istediğinizde kullanacağınız tanımdır. Aşağıda örnek bir GraphQL Query örneği verilmiştir.
Bu Query, veritabanında bulunan 3
id'li ürünün id,title,description ve price kolonlarını getirecektir.
query{
products(id: 3){
id
title
description
price
}
}
Eğer Mutation tanımını da REST mimarisinden örneklemek gerekirse; kullandığınız POST, UPDATE, PATCH, DELETE metodları da Mutation tanımına karşılık geliyor diyebiliriz. Örneğin bir kullanıcı ekleme, silme ve güncelleme işlemi Mutation tanımı ile yapılabilir.
Yeni bir kullanıcı oluşturmak istersek aşağıdaki gibi bir mutation çalıştırabiliriz.
mutation{
insertUser(
data: {
username: "Mehmet"
surname: "Seven"
isActive: false
}
){
id
username
surname
isActive
}
}
Örneğin 3
id'li kullanıcının soyismini güncellemek istersek;
mutation{
updateUser(
id: 3
data: {
surname: "Kaya"
}
){
surname
}
}
3
id'li kullanıcıyı silmek istersek;
mutation{
deleteUser(id: 3){
id
}
}
Tüm kullanıcıların isActive
kolonunu true
olarak belirlemek istersek aşağıdaki gibi bir mutation çalıştırabiliriz.
mutation{
updateUsers(
data: {
isActive: true
}
){
users{
id
isActive
}
}
}
GraphQL, gerçek zamanlı çalışan projeler geliştirirken de çok büyük kolaylıklar sağlıyor. Subscription tanımı ile herhangi ekleme, silme, güncelleme işlemi yapıldığı anda bundan gerçek zamanlı olarak haberdar olabiliriz.
Bir kullanıcı oluşturulduğunda, bu kullanıcı ile alakalı verilere ulaşmak istersek çalıştırmamız gereken query aşağıdaki gibi olacak;
subscription{
userCreated{
id
username
surname
}
}
Bir kullanıcı güncellendiğinde, bu kullanıcı ile alakalı güncel verilere ulaşmak istersek çalıştırmamız gereken query aşağıdaki gibi olacak;
subscription{
userUpdated{
id
username
surname
}
}
Bu ve bunun gibi örnekler daha da çoğaltılabilir elbette. Örneğin, gerçek zamanlı çalışan chat uygulamasını GraphQL ile geliştirmek gerçekten çok ama çok basit.
Yazılım Kariyerinde İlerlemeni Hızlandıracak Programlar
Patika+ programlarımız ile 4-8 aylık yoğun yazılım kamplarına katıl, temel bilgilerden başlayarak kapsamlı bilgiler edin, yazılım kariyerine başla!
Yorum yapabilmek için derse kayıt olmalısın!