Cohorts
  • Discover
  • About Us
  • Blog
  • Patika.dev
  • Web3

GraphQL

GraphQL Nedir? Ne Değildir?
Apollo Server'a Giriş
Non Nullable Fields
Scalar Types
Custom Types
Argümanlar ile Çalışmak
İlişkisel Veriler ile Çalışmak
İlişkisel İfadelerde Argümanlar
Comment Challenge
Ödev

Mutation Nedir? Nasıl Yazılır?
Input Type
Update Mutations
Delete Mutations
Delete All Mutations
Ödev

Subscription Server Kurulumu
User CRUD Subscriptions
Post ve Comment CRUD Subscriptions
withFilter ile Subscription Filtreleme
Redis PubSub
Ortam Değişkenleri
Ödev

Folder/Schema Structure - 1
Folder/Schema Structure - 2 (File Loader)
Babel Compiler

Apollo Client Kurulumu
Genel Görünümün Ayarlanması
React Router
Postların Listelenmesi (useQuery)
Post Detaylarının Gösterilmesi
Short Description Field'ının Tanımlanması
Post Yorumlarının Listelenmesi (useLazyQuery)
Ödev

Postların Gerçek Zamanlı Listelenmesi (subscribeToMore)
Post Sayısını Gerçek Zamanlı Göstermek (useSubscription)
Yorumların Gerçek Zamanlı Gösterilmesi
Fragments
Ödev

New Post Formunun Tasarlanması
Kullanıcı Listesinin Çekilmesi
Yeni Post Eklemek (useMutation)
Yorum Formunun Hazırlanması
Yeni Yorum Mutation'unun Hazırlanması
Spinner Delay
Ödev

MongoDB Bağlantısının Gerçekleştirilmesi
User Modelinin Oluşturulması
Post Modelinin Oluşturulması
Comment Modelinin Oluşturulması
MongoDB İlişkileri
Refactoring User Mutations
Refactoring Post Mutations
Refactoring Comment Mutations
Refactoring Subscriptions
Apollo Client Güncellemeleri

Hasura'ya Giriş ve Query
Hasura Mutations
Hasura Subscriptions
Relationships
Custom Actions - 1
Custom Actions - 2
Remote Schemas
Event Triggers

Hasura Docker Yapılandırması
Veritabanı Mimarisinin Oluşturulması
Client Entegrasyonu - 1
Client Entegrasyonu - 2
Client Entegrasyonu - 3

Hasura Backend'in Oluşturulması
Apollo Client ve React Router Kurulumu
Oylamaların Gerçek Zamanlı Listelenmesi
Yeni Oylama Oluşturma Ekranının Hazırlanması - 1
Yeni Oylama Oluşturma Ekranının Hazırlanması - 2
Oylama Detay Ekranının Hazırlanması - 1
Oylama Detay Ekranının Hazırlanması - 2

Hasura DigitalOcean Deployment
React Client Netlify Deployment

Hasura Kurulumu ve DB Yapısının Oluşturulması
Express Backending Hazırlanması
Sucrase, Hasura Client, Routing ve Error Handling
User Register Route
Hasura JWT Authentication (Register)
Hasura JWT Authentication (Login)
Me Query
Hasura Permissions
Computed Fields
Event Triggers - 1
Event Triggers - 2 (sending e-mails)
Meeting Approve Invitation
One Off Scheduled Events - 1
One Off Scheduled Events - 2
Countries GraphQL API
Rick and Morty Characters
Anonymous Chat App
Realtime Voting App

GraphQL Nedir?

GraphQL

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.


GraphQL Avatanjları


Bu başlık altında GraphQL'i, Rest ile karşılaştırarak avantajlarını görmeye çalışacağız.

1. Sadece Gerekli Kolonları Sorgulayabilmek

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.

2. Tek bir API Endpoint

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
    }
  }

3. İlişkili Veriler

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.

4. Otomatik Dokümanlama

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.




GraphQL Terminolojisi


Aslında GraphQL terminolojisini üç ana başlık altında toplayabiliriz. Bunlar Query, Mutation ve Subscription.

1. Query

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
    }
  }

2. Mutation

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
      }
    }
  }

3. Subscription

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.

Ek Kaynaklar

An Introduction to GraphQL

GraphQL is the better REST

Next

Lesson discussion

Swap insights and ask questions about “GraphQL”.

Enroll to participate
Start the course to unlock the discussion. Enrolling helps us keep conversations relevant to learners.
Cohorts
WebsiteDiscoverBlogPatika.devRise In
CoursesCircleRustSoliditySolanaWeb3 FundamentalsBlockchain Basics
CompanyAbout UsTerms of UsePrivacy PolicyGDPR NoticeCookies
Don't miss any update!

Disclaimer: The information, programs, and events provided on https://cohorts.patika.dev is strictly for upskilling and networking purposes related to the technical infrastructure of blockchain platforms. We do not provide financial or investment advice, nor do we make any representations regarding the value, profitability, or future price of any blockchain or cryptocurrency. Users are encouraged to conduct their own research and consult with licensed financial professionals before engaging in any investment activities. https://cohorts.patika.dev disclaims any responsibility for financial decisions made by users based on the information provided here.

© 2026 Cohorts, All rights reserved