Debat GraphQL vs REST bukan tentang "mana yang lebih baik secara absolut" — keduanya adalah arsitektur API yang valid dengan trade-off yang berbeda. Masalahnya, banyak developer memilih GraphQL karena hype atau REST karena kebiasaan, bukan karena analisis kebutuhan yang jernih. Artikel ini mencoba memberikan framework pengambilan keputusan yang lebih objektif.
REST API: Fondasi yang Sudah Teruji
REST (Representational State Transfer) mengorganisasi API di sekitar resource yang diakses via HTTP methods standar:
GET /api/posts → Daftar posts
GET /api/posts/{id} → Detail post
POST /api/posts → Buat post baru
PUT /api/posts/{id} → Update post
DELETE /api/posts/{id} → Hapus post
GET /api/posts/{id}/comments → Komentar dari post tertentu
Prinsip REST yang sering dilupakan:
- Stateless — Setiap request membawa semua informasi yang dibutuhkan, server tidak menyimpan state session
- Uniform Interface — Konsistensi dalam naming, HTTP methods, dan response format
- Cacheable — Response bisa di-cache oleh CDN, browser, atau reverse proxy
GraphQL: Satu Endpoint, Query Fleksibel
GraphQL membalik paradigma: alih-alih server yang mendefinisikan struktur response, client yang menentukan data apa yang dibutuhkan:
query {
post(id: 1) {
title
excerpt
author {
name
avatar_url
}
categories {
name
slug
}
comments(first: 5, orderBy: CREATED_AT_DESC) {
body
author {
name
}
}
}
}
Satu query ini menggantikan beberapa endpoint REST: GET /posts/1, GET /users/{author_id}, GET /posts/1/categories, GET /posts/1/comments.
Masalah yang Diselesaikan GraphQL
Over-fetching
REST endpoint GET /api/users/{id} mengembalikan seluruh profil user (50+ field), padahal halaman hanya butuh nama dan avatar. Dengan GraphQL, client hanya request field yang dibutuhkan — menghemat bandwidth, terutama di mobile.
Under-fetching dan N+1 Request
Untuk menampilkan list post dengan nama author, REST memerlukan: 1 request untuk posts + N request untuk setiap author. GraphQL menyelesaikannya dalam satu query (dengan DataLoader untuk optimasi N+1 di sisi server).
Rapid Frontend Iteration
Saat frontend butuh field baru, tidak perlu meminta backend developer membuat atau memodifikasi endpoint. Frontend cukup update query-nya.
Masalah yang GraphQL Ciptakan
Kompleksitas Server-side
Implementasi GraphQL jauh lebih kompleks dari REST. Anda perlu: schema definition, resolvers untuk setiap field, DataLoader untuk mencegah N+1, dan authorization per-field (bukan per-endpoint).
Caching Lebih Sulit
REST memanfaatkan HTTP caching secara natural (CDN bisa cache GET /api/posts). GraphQL menggunakan POST untuk semua query, sehingga HTTP caching tidak berlaku. Anda perlu implementasi persisted queries atau client-side caching (Apollo Client).
File Upload
GraphQL tidak secara native mendukung file upload — perlu workaround via multipart request atau upload ke URL pre-signed terpisah.
Overkill untuk API Sederhana
Jika API Anda hanya punya 5-10 endpoint dengan struktur yang stabil, overhead setup GraphQL (schema, resolvers, tooling) tidak sepadan.
Rekomendasi Berdasarkan Konteks
| Konteks | Pilihan | Alasan |
|---|---|---|
| Public API untuk third-party | REST | Familiar, caching mudah, dokumentasi lebih simple |
| Mobile app dengan bandwidth terbatas | GraphQL | Kurangi over-fetching |
| Dashboard admin internal | REST | Simpler, cukup untuk kebutuhan |
| Aplikasi dengan banyak klien berbeda (web, iOS, Android) | GraphQL | Setiap klien bisa request sesuai kebutuhan |
| Microservices | REST atau gRPC | GraphQL federation kompleks |
| E-commerce dengan product catalog kompleks | GraphQL | Flexible product queries |
Pendekatan Hibrida
Tidak harus pilih salah satu. Beberapa arsitektur yang berhasil:
- REST untuk operasi sederhana (auth, CRUD dasar) + GraphQL untuk query kompleks
- GraphQL sebagai API gateway yang memanggil beberapa REST microservice di belakang
- REST dengan field selection via query parameter:
GET /api/posts?fields=id,title,excerpt
Kesimpulan Pragmatis
Mulai dengan REST. REST lebih mudah diimplementasikan, lebih mudah di-debug, lebih mudah di-cache, dan sudah familiar bagi sebagian besar developer. Migrasi ke GraphQL atau tambahkan GraphQL endpoint tertentu hanya jika Anda benar-benar mengalami masalah over-fetching atau under-fetching yang signifikan di production. Jangan optimasi prematur arsitektur.