Modern API Geliştirme Rehberi: REST, GraphQL ve gRPC Karşılaştırması
REST, GraphQL ve gRPC mimarilerini derinlemesine inceliyoruz: Temel çalışma prensipleri, avantajları, dezavantajları ve projeniz için doğru protokolü seçme rehberi.
# Modern API Geliştirme Rehberi: REST, GraphQL ve gRPC Karşılaştırması
Günümüzün dağıtık sistemler ve mikroservis mimarileri dünyasında, servisler ve istemciler arasındaki iletişim yöntemi; bir uygulamanın performansını, ölçeklenebilirliğini ve geliştirici deneyimini doğrudan belirler. Yıllar boyunca web dünyasının tartışmasız standardı olan REST, modern ihtiyaçların çeşitlenmesiyle birlikte tahtını GraphQL ve gRPC gibi güçlü alternatiflerle paylaşmaya başladı.
Peki, yeni bir mimari tasarlarken hangisini seçmelisiniz? Bu makalede **REST**, **GraphQL** ve **gRPC** teknolojilerini; temel prensipleri, güçlü ve zayıf yönleri, performans karakteristikleri ve kullanım senaryoları açısından derinlemesine karşılaştırıyoruz.
---
## 1. REST (Representational State Transfer)
2000 yılında Roy Fielding'in doktora tezinde tanımlanan REST, web'in mevcut altyapısını ve HTTP protokolünün yeteneklerini temel alan mimari bir yaklaşımdır.
### Temel Prensipler
* **Kaynak Odaklılık (Resource-Oriented):** Her varlık (örneğin kullanıcılar, siparişler) benzersiz bir URI ile temsil edilir.
* **Standart HTTP Metotları:** CRUD işlemleri için standart HTTP fiilleri (`GET`, `POST`, `PUT`, `PATCH`, `DELETE`) kullanılır.
* **Durumsuzluk (Statelessness):** İstemciden sunucuya gönderilen her istek, o isteği işlemek için gereken tüm bilgiyi içermelidir; sunucu istemci oturum durumu tutmaz.
* **Önbelleklenebilirlik (Cacheability):** HTTP başlıkları (`Cache-Control`, `ETag`) sayesinde yanıtlar istemci veya ara katman (CDN, proxy) düzeyinde önbelleğe alınabilir.
### Avantajları
* **Evrensellik ve Olgunluk:** Hemen her programlama dili, framework ve HTTP istemcisi tarafından yerel olarak desteklenir.
* **Mükemmel Önbellekleme (Caching):** HTTP standartları sayesinde tarayıcı ve CDN düzeyinde ek maliyetsiz önbellekleme sağlar.
* **Kolay Hata Ayıklama:** JSON formatında metin tabanlı transfer yapıldığı için cURL, Postman veya tarayıcı üzerinden kolayca incelenebilir.
### Dezavantajları ve Sınırları
* **Over-fetching (Aşırı Veri Çekme):** İstemci yalnızca bir kullanıcının adına ihtiyaç duysa bile, uç nokta tüm kullanıcı nesnesini (adres, profil detayları vb.) döner.
* **Under-fetching ve N+1 Problemi:** Bir kullanıcının siparişlerini ve her siparişin ürün detaylarını almak için birden fazla ardışık HTTP isteği yapılması gerekir.
* **Gevşek Tip Güvenliği:** OpenAPI/Swagger gibi harici araçlar kullanılmadığında katı bir veri sözleşmesi (schema contract) sunmaz.
---
## 2. GraphQL
2012 yılında Meta (Facebook) tarafından mobil uygulamaların veri tüketim sorunlarını çözmek amacıyla geliştirilen ve 2015 yılında açık kaynak olarak paylaşılan GraphQL, hem bir API sorgulama dili hem de bir çalışma zamanı (runtime) motorudur.
### Temel Prensipler
* **İstemci Odaklı Veri Getirme:** İstemci, sunucudan tam olarak hangi alanları (field) istiyorsa onu talep eder; fazlası veya eksiği gelmez.
* **Tek Uç Nokta (Single Endpoint):** Tüm sorgu ve mutasyonlar genellikle tek bir HTTP POST uç noktası (`/graphql`) üzerinden yürütülür.
* **Şema ve Tip Sistemi (Schema Definition Language - SDL):** Veri modelleri, sorgular (`Query`), mutasyonlar (`Mutation`) ve abonelikler (`Subscription`) katı bir tip sistemiyle tanımlanır.
### Avantajları
* **Over-fetching ve Under-fetching'e Son:** İstemci tek bir istekte hiyerarşik olarak ilişkili tüm verileri (örneğin kullanıcı, son 5 siparişi ve her siparişteki ürünler) çekebilir.
* **Güçlü Tip Doğrulaması:** Şema, sunucu ve istemci arasında yaşayan bir sözleşmedir; derleme veya geliştirme aşamasında otomatik tip üretimi (code generation) sağlar.
* **Geliştirici Deneyimi:** GraphiQL ve Apollo Studio gibi araçlarla etkileşimli dokümantasyon, otomatik tamamlama ve anlık sorgu testi sunar.
### Dezavantajları ve Sınırları
* **Karmaşık Önbellekleme:** İstekler dinamik gövdeli POST istekleri olduğundan, geleneksel HTTP düzeyinde önbellekleme doğrudan çalışmaz; istemci tarafında normalleştirilmiş önbellek mekanizmaları gerektirir.
* **Sorgu Karmaşıklığı ve Güvenlik:** Kötü niyetli veya optimize edilmemiş derinlemesine iç içe sorgular sunucuyu kilitleyebilir (query depth limiting ve cost analysis mekanizmaları zorunludur).
* **N+1 Çözümleyici (Resolver) Problemi:** Arka planda veritabanı sorgularını birleştirmek için DataLoader gibi ek soyutlamalar kurulmalıdır.
---
## 3. gRPC (Google Remote Procedure Call)
Google tarafından 2015 yılında geliştirilen gRPC; yüksek performanslı, açık kaynaklı ve diller arası çalışan modern bir Uzaktan Yordam Çağrısı (RPC) çerçevesidir.
### Temel Prensipler
* **Sözleşme Odaklı Tasarım (Contract-First):** Servis arabirimleri ve veri modelleri `.proto` dosyalarında Protocol Buffers (Protobuf) kullanılarak tanımlanır.
* **HTTP/2 Altyapısı:** Çoklama (multiplexing), tek TCP bağlantısı üzerinden paralel akışlar, çift yönlü akış (bidirectional streaming) ve başlık sıkıştırması sağlar.
* **İkili Veri Formatı (Binary Serialization):** JSON yerine ikili (binary) Protobuf formatı kullanılır; bu da çok daha küçük paket boyutu ve ultra hızlı serileştirme demektir.
### Avantajları
* **Maksimum Performans ve Düşük Gecikme:** Protobuf serileştirmesi, JSON'a kıyasla 5 ila 10 kat daha hızlıdır ve ağ üzerinden çok daha az bayt aktarır.
* **Gelişmiş Akış (Streaming) Desteği:** Tek yönlü (istemci veya sunucu akışı) ve çift yönlü (bidirectional streaming) veri akışlarını doğal olarak destekler.
* **Diller Arası Kod Üretimi:** Tek bir `.proto` dosyasından Go, Java, Python, C#, Node.js gibi onlarca dilde istemci ve sunucu iskeletleri otomatik olarak derlenebilir.
### Dezavantajları ve Sınırları
* **Sınırlı Tarayıcı Desteği:** Web tarayıcıları doğrudan HTTP/2 çerçevelerine erişemediği için doğrudan gRPC çağıramaz; gRPC-Web veya Envoy proxy gibi ara katmanlara ihtiyaç duyar.
* **İnsan Tarafından Okunamazlık:** Veri ikili formatta aktarıldığı için özel eklentiler veya proxy araçları olmadan ağ paketlerini incelemek ve hata ayıklamak zordur.
* **Öğrenme Eğrisi:** Protobuf araçları ve gRPC yaşam döngüsü, REST'e kıyasla daha karmaşık bir yapılandırma gerektirir.
---
## Karşılaştırma Matrisi
| Özellik | REST | GraphQL | gRPC |
| :--- | :--- | :--- | :--- |
| **İletişim Modeli** | Kaynak Odaklı (CRUD) | Sorgu Odaklı (İstemci Seçimli) | Yordam/İşlem Odaklı (RPC) |
| **Protokol / Taşıma** | HTTP/1.1, HTTP/2 | Genellikle HTTP/1.1 veya HTTP/2 | Zorunlu HTTP/2 |
| **Veri Formatı** | Çoğunlukla JSON (XML, metin) | JSON | Protocol Buffers (İkili / Binary) |
| **Şema / Tipler** | İsteğe Bağlı (OpenAPI/Swagger) | Katı Tip Sistemi (GraphQL SDL) | Katı Tip Sistemi (Protobuf) |
| **Ağ Verimliliği** | Orta (Başlık yükü, metin tabanlı) | Yüksek (Yalnızca istenen alanlar) | En Yüksek (İkili sıkıştırma, multiplexing) |
| **Tarayıcı Desteği** | Mükemmel (Evrensel) | Mükemmel | gRPC-Web / Proxy gerektirir |
| **Önbellekleme** | HTTP düzeyinde mükemmel | İstemci tarafında yönetim gerektirir | Uygulama düzeyinde özel yönetim |
| **Akış (Streaming)** | Sınırlı (SSE, WebSockets) | Abonelikler (Subscriptions) | Çift Yönlü Akış (Yerel HTTP/2) |
---
## Hangi Durumda Hangisi Tercih Edilmeli?
### Ne Zaman REST Seçilmeli?
* **Genel Kullanıma Açık (Public) API'lar:** Dış geliştiricilerin kolayca entegre olabileceği, sıfır ek araç gerektiren genel servisler.
* **Yoğun Önbellekleme İhtiyacı:** CDN ve proxy önbelleklemesinin kritik olduğu içerik dağıtım sistemleri ve e-ticaret katalogları.
* **Basit CRUD Servisleri:** Veri modellerinin doğrudan kaynaklara karşılık geldiği standart web servisleri.
### Ne Zaman GraphQL Seçilmeli?
* **Karmaşık Frontend ve Mobil Uygulamalar:** Ağ bant genişliğinin hassas olduğu mobil cihazlarda birden çok veri kaynağını tek ekranda toplayan arayüzler.
* **Backend-For-Frontend (BFF) Katmanı:** Çeşitli mikroservislerden gelen verileri toplayıp ön yüze tek bir formatta sunmak için ideal orkestrasyon katmanı.
* **Sık Değişen İstemci Gereksinimleri:** Frontend ekiplerinin backend API'larını her yeni ekranda değiştirmeden bağımsızca veri çekmesini sağlamak istendiğinde.
### Ne Zaman gRPC Seçilmeli?
* **Mikroservisler Arası İletişim (East-West Trafiği):** Veri merkezleri veya Kubernetes podları arasındaki iç hat iletişiminde ultra düşük gecikme ve yüksek bant genişliği verimliliği.
* **Gerçek Zamanlı ve Çift Yönlü Akışlar:** Telemetri veri akışı, finansal işlem akışları veya oyun sunucuları gibi sürekli veri transferi gerektiren durumlar.
* **Çok Dilli (Polyglot) Sistemler:** Farklı programlama dillerinde yazılmış servisler arasında ortak ve tip güvenli bir iletişim sözleşmesi kurmak istendiğinde.
---
## Hibrit Yaklaşım: Gerçek Dünyada En İyi Pratik
Gerçek dünya mimarilerinde tek bir protokolü her yere zorlamak yerine sıklıkla **hibrit bir mimari** benimsenir:
1. **İç Mikroservisler:** Kendi aralarında maksimum verimlilik için **gRPC** ile haberleşir.
2. **Orkestrasyon / BFF Katmanı:** İstemcilerin ihtiyaç duyduğu veriyi gRPC servislerinden toplayıp ön yüze **GraphQL** ile sunar.
3. **Genel Entegrasyonlar:** Dış dünyaya açılan servisler için standart ve erişilebilir **REST** uç noktaları sağlanır.
Doğru teknoloji seçimi projenizin ölçeğine, ekibinizin uzmanlığına ve sisteminizin darboğazlarına bağlıdır. Her protokol belirli bir problemi çözmek için tasarlanmıştır; sisteminizi bu güçlere göre optimize etmek mimarinizin uzun vadeli başarısını getirecektir.
From the blog
View all postsblog.categories.teknoloji
Programlama Dillerinin Evrimi: C'den Rust'a Uzanan Yolculuk
1970'lerin donanıma hükmeden C dilinden modern çağın bellek güvenliği standardı Rust'a: Sistem programlamasında hız, soyutlama ve güvenlik arayışının yarım asırlık anatomisi.

blog.categories.teknoloji
2026'da Mobil Uygulama Geliştirme: Flutter ve React Native Karşılaştırması
2026 yılı itibarıyla mobil uygulama geliştirme ekosisteminde Flutter ve React Native'in geldiği son nokta: Impeller motoru, React 19, Bridgeless mimari ve modern teknoloji seçimi rehberi.
