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

KonteksPilihanAlasan
Public API untuk third-partyRESTFamiliar, caching mudah, dokumentasi lebih simple
Mobile app dengan bandwidth terbatasGraphQLKurangi over-fetching
Dashboard admin internalRESTSimpler, cukup untuk kebutuhan
Aplikasi dengan banyak klien berbeda (web, iOS, Android)GraphQLSetiap klien bisa request sesuai kebutuhan
MicroservicesREST atau gRPCGraphQL federation kompleks
E-commerce dengan product catalog kompleksGraphQLFlexible 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.