Blog Yazısı

← Tüm Blog Yazılarına Dön
API Tasarımı & Web Mimarisi • 12 Kasım 2026 • 9 dk okuma

Modern API Mimarisinde Büyük Karşılaşma: GraphQL mi, Yoksa REST API mi?

REST API'nin köklü standardı ile GraphQL'in esnek sorgulama devrimi karşı karşıya: Over-fetching, under-fetching (N+1 sorunu), tek endpoint mimarisi, caching zorlukları ve projeniz için en doğru API modelini seçme rehberi.

Frontend (web ve mobil) ile Backend arasındaki köprüyü kurarken 20 yılı aşkın süredir tahtını koruyan bir kral var: REST (Representational State Transfer). Ancak 2015 yılında Facebook, devasa mobil uygulamasındaki ağ verimliliği ve karmaşık veri ilişkileri problemlerini çözmek için yeni bir mimari duyurdu: GraphQL. O günden bu yana yazılım dünyasında bitmek bilmeyen bir tartışma başladı: 'REST öldü mü? Yeni projelerde kesinlikle GraphQL mi kullanmalıyız?' Bu sorunun cevabı siyah ya da beyaz değildir; her iki teknolojinin de parladığı ve tıkandığı çok net senaryolar vardır.

REST API'nin Doğası ve Güçlü Yönleri:
REST; kaynak tabanlıdır (Resource-Based). Her varlığın kendine ait bir URL adresi vardır ('/api/users', '/api/posts/10'). İletişim standart HTTP metotları (GET, POST, PUT, DELETE) ve durum kodları (200 OK, 404 Not Found, 500 Error) üzerinden yürütülür.

REST'in en büyük avantajları:
1. Standart ve Evrensel: Dünyadaki her yazılımcı ve kütüphane REST'in nasıl çalıştığını bilir.
2. Mükemmel HTTP Caching: Tarayıcılar ve CDN'ler (Cloudflare, Varnish) '/api/users/5' GET isteğini URL bazlı olarak kolayca önbelleğe (cache) alabilir.

REST'in Modern Dünyada Yaşadığı İki Büyük Problem:
1. Over-Fetching (Gereksiz Fazla Veri Çekme): Mobil uygulamanızda kullanıcının sadece adını ve profil fotoğrafını göstermek istiyorsunuz. Ancak backend'deki '/api/users/5' endpoint'i kullanıcının adresini, TC kimliğini, sipariş geçmişini ve 50 farklı alanı birden döner. Mobil cihaz boş yere megabaytlarca veri indirir ve pil tüketir.
2. Under-Fetching ve N+1 Problemi: Bir kullanıcının profilini, onun son 3 siparişini ve o siparişlerin kargo durumunu göstermek için istemci önce '/users/5', sonra her sipariş için '/orders?user=5', ardından kargo için '/shipping/...' şeklinde ardı ardına 4-5 farklı HTTP isteği atmak zorunda kalır. Zayıf mobil ağlarda bu durum ekranın saniyelerce yüklenememesine yol açar.

GraphQL Devrimi: İstediğin Veriyi, İstediğin Şekilde İste!:
GraphQL; REST gibi bir mimari stil değil, bir sorgu dili (Query Language) ve çalışma ortamıdır (Runtime). GraphQL'de onlarca farklı endpoint yoktur; tek bir '/graphql' endpoint'i vardır. İstemci sunucuya tam olarak hangi alanları istediğini bir JSON şablonu gibi yazar:

query {
user(id: '5') {
name
avatarUrl
orders(limit: 3) {
totalPrice
status
}
}
}

Sunucu bu isteği alır ve yanıt olarak BİREBİR istenen alanları döner; ne 1 bayt eksik, ne 1 bayt fazla! Tek bir istekte tüm ilişkisel veri tertemiz toplanır.

GraphQL'in Gölgede Kalan Zorlukları (Madalyonun Diğer Yüzü):
GraphQL kulağa bir sihir gibi gelse de beraberinde ciddi zorluklar getirir:
1. Karmaşık Caching: GraphQL istekleri genellikle tek bir endpoint'e POST metoduyla atıldığı için klasik HTTP/CDN önbelleklemesi çalışmaz; istemci tarafında Apollo Client veya Relay gibi karmaşık hafıza içi önbellek kütüphaneleri yönetmek gerekir.
2. Güvenlik ve Derin Sorgu Saldırıları (DoS): Kötü niyetli bir kullanıcı iç içe geçmiş sonsuz döngülü sorgular yazarak (örneğin user -> posts -> user -> posts...) sunucu veritabanınızı saniyeler içinde kilitleyebilir. Sorgu derinliği ve maliyet analizi sınırlamaları koymak zorunludur.
3. Büyük Dosya Yüklemeleri: Resim ve video yükleme süreçleri GraphQL'de standart REST multipart/form-data kadar doğal ve pratik değildir.

Karar Matrisi: Hangi Projede Hangisini Seçmelisiniz?:
* REST Seçin Eğer: Projeniz klasik CRUD (Ekle, Sil, Güncelle) işlemlerinden oluşuyorsa, küçük veya orta ölçekli bir web siteniz varsa, CDN üzerinden agresif HTTP önbelleklemesi yapmak istiyorsanız veya harici üçüncü taraf geliştiricilere genel (public) bir API sunuyorsanız.
* GraphQL Seçin Eğer: Birden fazla farklı istemciniz varsa (örneğin Web, iOS, Android, Akıllı Saat - her biri farklı alanlara ihtiyaç duyuyorsa), mikroservis mimarisinde onlarca farklı servisin verisini tek bir geçitte (BFF - Backend for Frontend) birleştirmek istiyorsanız ve ilişkisel karmaşık veri modelleriniz varsa.

Sonuç:
GraphQL, REST'in katili değil; karmaşık istemci-sunucu ilişkilerini çözmek için tasarlanmış güçlü bir evrimdir. En başarılı modern şirketler ikisini bir arada kullanarak statik ve dosya odaklı işlerde REST'ten, dinamik ve esnek arayüz ekranlarında ise GraphQL'den güç almaktadır.

← Diğer Yazılar Fikirlerini Paylaş →