I'm always excited to take on new projects and collaborate with innovative minds.
Kayseri/Turkey
GraphQL, modern web uygulamalarında REST API’ye güçlü bir alternatif sunar. Bu yazıda GraphQL’de caching ve subscription mantığını; verilerin önbellekte nasıl tutulduğunu ve gerçek zamanlı güncellemelerin WebSocket üzerinden nasıl aktarıldığını keşfedeceksiniz.
Frontend geliştiriciler olarak genelde API’lerle REST yapısı üzerinden iletişim kurarız. Ancak modern uygulamalarda, daha dinamik, gerçek zamanlı ve esnek veri akışı gerektiğinde GraphQL öne çıkıyor.
Bu yazımda, GraphQL’de cache ve subscription nasıl çalışır,
RESTful API ile farkları nelerdir, örneklerle adım adım deneyimlerimden bahsedicem.
GraphQL, Facebook tarafından geliştirilen bir API sorgulama dilidir.
REST’ten farklı olarak, istemci (frontend) sadece ihtiyacı olan alanları sorgular.
Yani backend ne gönderirse değil, frontend ne isterse onu alır (backend kardeşim işine bak xD ).
REST:
GET /users/1
{
"id": 1,
"name": "Ahmet",
"email": "[email protected]",
"posts": [
{ "id": 101, "title": "React Eğitimi" },
{ "id": 102, "title": "Next.js Rehberi" }
]
}
GraphQL:
query {
user(id: 1) {
name
posts {
title
}
}
}
Sonuç:
{
"data": {
"user": {
"name": "Ahmet",
"posts": [
{ "title": "React Eğitimi" },
{ "title": "Next.js Rehberi" }
]
}
}
}
GraphQL üç temel yapı üzerine kuruludur:
| Yapı | Açıklama | Örnek |
|---|---|---|
| Query | Veri okuma | query { users { id name } } |
| Mutation | Veri oluşturma/güncelleme | mutation { createUser(name: "Ahmet") { id } } |
| Subscription | Gerçek zamanlı veri | subscription { newUser { id name } } |
GraphQL’de cache, Apollo Client gibi kütüphaneler tarafından yönetilir.
REST’te olduğu gibi “URL bazlı” değil, veri tipi (type) + id bazlı çalışır.
query {
users {
id
name
}
}
Yanıt:
{
"data": {
"users": [
{ "id": "1", "name": "Ahmet" },
{ "id": "2", "name": "Mehmet" }
]
}
}
Apollo Client bu veriyi bellekte şöyle saklar:
{
User: {
"1": { id: "1", name: "Ahmet" },
"2": { id: "2", name: "Mehmet" }
}
}
Yani aynı kullanıcı verisi farklı sorgularda tekrar geldiğinde,
Apollo Client veriyi yeniden çekmek yerine cache’ten getirir
ve ayrıca restfull API gibi bir veriyi tekrardan cekmek için gidip
websocket kurmamız gerekmiyor + bir kütüphane kullanımı olmuyor.
GraphQL’de cache politikası fetchPolicy ile belirlenir:
| fetchPolicy | Açıklama |
|---|---|
cache-first | Varsa cache’ten getir, yoksa sunucudan çek |
network-only | Her zaman sunucudan çek |
cache-only | Sadece cache’ten al |
cache-and-network | Önce cache’i göster, sonra günceli getir |
Örnek kullanım:
useQuery(GET_USERS, {
fetchPolicy: "cache-first",
});
Subscription, GraphQL’in REST’ten en büyük farkıdır.
Gerçek zamanlı veri iletişimi sağlar — tıpkı WebSocket mantığı gibi.
GET /messages gibi istekleri tekrar tekrar atmak gerekir (polling).Örnek:
subscription {
newMessage {
id
text
sender {
name
}
}
}
GraphQL’in büyülü tarafı burada başlar ✨
Subscription’dan gelen veri, Apollo Client tarafından otomatik olarak cache’e yazılır.
Yani senin UI bileşenin yeni veriyi otomatik olarak gösterir.
query { users { id name } } → cache’e kullanıcılar kaydedilirsubscription { newUser { id name } } → yeni kullanıcı geldiğindeimport { gql, useQuery, useSubscription } from "@apollo/client";
const GET_USERS = gql`
query {
users {
id
name
}
}
`;
const NEW_USER_SUB = gql`
subscription {
newUser {
id
name
}
}
`;
export default function Users() {
const { data, loading } = useQuery(GET_USERS);
useSubscription(NEW_USER_SUB, {
onData: ({ client, data }) => {
const newUser = data.data.newUser;
client.cache.modify({
fields: {
users(existingUsers = []) {
const newUserRef = client.cache.writeFragment({
data: newUser,
fragment: gql`
fragment NewUser on User {
id
name
}
`,
});
return [...existingUsers, newUserRef];
},
},
});
},
});
if (loading) return <p>Yükleniyor...</p>;
return (
<ul>
{data.users.map((u) => (
<li key={u.id}>{u.name}</li>
))}
</ul>
);
}
Bu kodda:
useQuery() ilk veriyi çekeruseSubscription() yeni kullanıcıları dinler| Özellik | REST | GraphQL |
|---|---|---|
| Endpoint yapısı | Çoklu (/users, /posts) | Tek (/graphql) |
| Cache sistemi | URL bazlı (HTTP) | Type + ID bazlı (Apollo Cache) |
| Gerçek zamanlı veri | Yok | Var (Subscription) |
| Fazla veri çekme riski | Yüksek | Yok |
| Veri güncelleme | Manuel | Otomatik cache sync |
type + id bazlı saklar.Bu sayede:
✅ Fazladan API isteği atmazsın
✅ State yönetimi basitleşir
✅ Gerçek zamanlı bir kullanıcı deneyimi sunarsın
GraphQL, REST’ten daha karmaşık görünse de,
cache ve subscription özellikleriyle modern frontend dünyasında
daha hızlı, daha verimli ve gerçek zamanlı uygulamalar geliştirmeni sağlar.
Artık REST’te olduğu gibi “sayfayı yenilemeden” veriyi güncelleyen,
gerçek zamanlı sistemler oluşturabilirsin hadi hayırlara vesile olsun. ⚡
E-posta hesabınız yayımlanmayacak. Gerekli alanlar işaretlendi *