GraphQL Nedir? REST API'ye Modern Alternatif
Frontend'iniz ihtiyacından fazla veri mi çekiyor? Birden fazla endpoint'e istek atarak sayfayı mı oluşturuyorsunuz? GraphQL ile tam ihtiyacınız olan veriyi, tek bir istekle alın.
GraphQL Tanımı
GraphQL, Facebook tarafından 2015'te açık kaynak yapılan bir API sorgu dili ve çalışma zamanıdır. İstemci, hangi veriyi istediğini kendisi tanımlar; sunucu tam o kadar veri döner.
REST vs GraphQL
REST: GET /users/42 → Tüm user verisi (gereksiz alanlar dahil)
GET /users/42/posts → İkinci istek
GET /users/42/comments → Üçüncü istek
GraphQL: POST /graphql → Tek istekle tam ihtiyacınız olan veri
| Özellik | REST | GraphQL | |---------|------|---------| | Endpoint | Birden fazla | Tek endpoint | | Veri miktarı | Over/Under-fetching | Tam ihtiyaç kadar | | Versiyon | /v1/, /v2/ | Versionsuz | | Dökümantasyon | Ayrı (Swagger) | Otomatik (Schema) | | Öğrenme eğrisi | Düşük | Orta |
Temel Kavramlar
Schema
API'nizin tip güvenli sözleşmesi:
type User {
id: ID!
name: String!
email: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
content: String!
author: User!
createdAt: String!
}
type Query {
user(id: ID!): User
posts(limit: Int): [Post!]!
}
type Mutation {
createPost(title: String!, content: String!): Post!
deletePost(id: ID!): Boolean!
}
Query (Okuma)
query {
user(id: "42") {
name
email
posts {
title
createdAt
}
}
}
Yanıt:
{
"data": {
"user": {
"name": "Ali",
"email": "ali@example.com",
"posts": [
{ "title": "GraphQL 101", "createdAt": "2026-02-14" }
]
}
}
}
Mutation (Yazma)
mutation {
createPost(title: "Yeni Yazı", content: "İçerik...") {
id
title
}
}
Subscription (Gerçek Zamanlı)
subscription {
newPost {
id
title
author {
name
}
}
}
Apollo Server Örneği
const { ApolloServer, gql } = require('apollo-server');
const typeDefs = gql`
type User {
id: ID!
name: String!
email: String!
}
type Query {
users: [User!]!
user(id: ID!): User
}
`;
const resolvers = {
Query: {
users: () => db.users.findAll(),
user: (_, { id }) => db.users.findById(id),
},
};
const server = new ApolloServer({ typeDefs, resolvers });
server.listen().then(({ url }) => {
console.log(`GraphQL API: ${url}`);
});
Ne Zaman GraphQL, Ne Zaman REST?
GraphQL Tercih Edin:
- Birden fazla istemci (web, mobil, IoT) farklı veri ihtiyacına sahipse
- İç içe ilişkili veri yapıları varsa
- Frontend ekibi bağımsız çalışmak istiyorsa
REST Tercih Edin:
- Basit CRUD operasyonları
- Dosya upload/download
- Cache mekanizması kritikse (HTTP cache)
- Ekip GraphQL deneyimine sahip değilse
Best Practices
- N+1 problemini çözün — DataLoader kullanarak batch sorgular yapın
- Depth limiting uygulayın — Aşırı derin sorguları engelleyin
- Pagination kullanın — Büyük listelerde cursor-based pagination
- Error handling standardize edin — Consistent error response formatı
- Schema-first design benimseyin — Önce schema tasarlayın, sonra implement edin
Sonuç
GraphQL, frontend-backend iletişimini devrimleştiren güçlü bir araçtır. Over-fetching ve under-fetching sorunlarını ortadan kaldırır. Ancak her proje için doğru seçim olmayabilir — basit API'ler için REST hâlâ mükemmel çalışır.
API tasarımı ve GraphQL'i LabLudus platformunda pratik yaparak öğrenin.