Pernah panggil REST API dapet response 50 field padahal kamu cuma butuh `name` + `avatar`? Atau sebaliknya, butuh data dari 3 endpoint berbeda (user → posts → comments) sehingga harus 3x request? Ini namanya **over-fetching** + **under-fetching** — masalah klasik REST yang Facebook hadapi tahun 2012 saat scale mobile app. Solusi mereka: **GraphQL** — query language yang membiarkan client deklarasiin "data yang aku butuhkan", server kasih persis itu. Gak lebih, gak kurang.
💡 GraphQL bukan magic. Bagus untuk: aggregating dari banyak data source, mobile (hemat bandwidth), tipikal "complex nested data". Bukan silver bullet: kalau cuma CRUD sederhana, REST lebih simpel + cache-friendly. Pilih sesuai kebutuhan, bukan tren.
Apa itu GraphQL?
GraphQL adalah query language untuk API yang dikembangkan oleh Facebook (2012, open-sourced 2015). Berbeda dari REST, client menentukan data apa yang dibutuhkan — tidak lebih, tidak kurang.
Masalah REST yang GraphQL Selesaikan
// REST: Over-fetching
GET /api/users/123
// Return 20+ fields, padahal cuma butuh name dan avatar
// REST: Under-fetching (multiple roundtrips)
GET /api/users/123 // user info
GET /api/users/123/posts // user posts
GET /api/posts/456/comments // post comments
// GraphQL: Satu request, data tepat yang dibutuhkan
query {
user(id: 123) {
name
avatar
posts {
title
comments {
text
}
}
}
}
Konsep Utama
- Schema — Kontrak antara client dan server (typed)
- Query — Membaca data (seperti GET)
- Mutation — Mengubah data (seperti POST/PUT/DELETE)
- Subscription — Real-time updates (WebSocket)
- Resolver — Fungsi yang mengambil data untuk setiap field
Single Endpoint
// REST: banyak endpoint
GET /api/users
GET /api/users/:id
POST /api/users
GET /api/posts
// GraphQL: satu endpoint
POST /graphql
// Semua query dan mutation dikirim ke sini
Siapa yang Pakai?
- GitHub — GitHub API v4 sepenuhnya GraphQL
- Shopify — Storefront API
- Airbnb, Twitter, Netflix, Spotify
🎭 Analogi sehari-hari
REST = menu paket di restoran fast food. Kamu pesan "Paket A" — dapet burger + kentang + minuman, semua sekaligus walau lo gak butuh kentang. GraphQL = buffet self-service. Lo isi piring sendiri sesuai mau: cuma nasi + ayam, tanpa sayur. Hemat tempat di piring + waktu mengonsumsi. Trade: butuh ngerti menu lengkap dulu sebelum bisa milih.
⚠️ Jebakan yang sering ditemui
- N+1 query problem — query nested resolve satu per satu = ratusan query DB. Pakai DataLoader (batching)
- HTTP caching susah — semua POST ke `/graphql`, cache layer (CDN) sulit. Beda dari REST yang URL-based
- Over-engineering — kalau API simple CRUD, GraphQL = overkill. REST cukup
- Authorization complex — di REST per-endpoint, di GraphQL per-field. Lebih ribet
- "GraphQL replace REST" = SALAH. Banyak company hybrid: REST untuk public API, GraphQL untuk internal
TL;DR: GraphQL = query language. Client deklarasiin data yang dibutuhkan, server return exactly itu. Solve over/under-fetching REST. Single endpoint `/graphql`. Cocok untuk aggregation, mobile, complex nested data. Bukan replace REST universal — alat berbeda. Awas N+1, caching susah, authorization complex.