tutorial

2 Perbandingan Singkat: GraphQL vs REST API

2 Perbandingan Singkat: GraphQL vs REST API

Perkembangan teknologi web dan mobile membuat kebutuhan akan data yang efisien dan mudah diatur semakin meningkat. Dalam dunia pengembangan API, terdapat dua teknologi populer yang sering kita jumpai: REST API dan GraphQL. Keduanya menawarkan solusi untuk transfer data antara client dan server, namun dengan paradigma yang berbeda.

Sebagai seorang engineer yang sudah beberapa tahun membangun produk digital, saya sering dihadapkan pada diskusi: “Pilih REST API atau GraphQL ya?” Artikel ini akan membahas dua perbandingan utama antara GraphQL dan REST API dengan contoh kode, simulasi, dan ilustrasi tabel serta diagram. Mudah-mudahan dapat membantu Anda memilih mana yang tepat untuk proyek Anda!


1. Cara Meminta & Mendapatkan Data

REST API

REST (Representational State Transfer) mendesain endpoint untuk setiap resource. Misalnya, untuk resource users, setiap aksi memiliki endpoint berbeda:

GET /users       // Mendapatkan data semua user
GET /users/1     // Mendapatkan data user dengan id=1
POST /users      // Menambah user baru
PUT /users/1     // Mengupdate user dengan id=1
DELETE /users/1  // Menghapus user dengan id=1

Biasanya, saat client butuh data nested (misal, user dan semua post miliknya), client harus melakukan beberapa kali request:

// Mengambil user
fetch('/users/1')
  .then(res => res.json())
  .then(user => {
    // Mengambil post milik user tsb
    fetch(`/users/1/posts`)
      .then(res => res.json())
      .then(posts => {
        // gabungkan post ke objek user
        user.posts = posts;
        console.log(user);
      });
  });

GraphQL

GraphQL hanya punya satu endpoint (/graphql). Client dapat menentukan sendiri data apa saja yang ingin diminta, bahkan dengan nested sekalipun, dalam satu request:

query {
  user(id: 1) {
    id
    name
    posts {
      id
      title
    }
  }
}

Server akan merespons permintaan dengan struktur data persis seperti yang diminta:

{
  "data": {
    "user": {
      "id": 1,
      "name": "Budi",
      "posts": [
        { "id": 101, "title": "Belajar REST" },
        { "id": 102, "title": "GraphQL itu Mudah" }
      ]
    }
  }
}

Simulasi Diagram Alur

Mari kita lihat perbandingan alur permintaan data dengan REST dan GraphQL menggunakan diagram alur (Mermaid):

sequenceDiagram
    participant Client
    participant Server

    Client->>Server: GET /users/1
    Server-->>Client: {id, name}
    Client->>Server: GET /users/1/posts
    Server-->>Client: [post1, post2, ...]
    Note right of Client: Harus dua kali request (REST)

    Client->>Server: POST /graphql {user dan posts}
    Server-->>Client: {id, name, posts}
    Note right of Client: Satu kali request (GraphQL)

Tabel Perbandingan

FiturREST APIGraphQL
EndpointBanyak (tiap resource/aksi)Satu (/graphql)
Data responseSemua data di model/endpointHanya field yang diminta
Nested resourcePerlu beberapa requestSatu query saja
Over-fetching/Under-fetching dataSering terjadiJarang terjadi

2. Versi API & Evolusi Skema

REST API

REST API biasanya menggunakan versi pada URL, misalnya /api/v1/users. Setiap perubahan besar (breaking change) biasanya memerlukan penambahan endpoint versi baru agar client-client lama tetap berjalan.

/api/v1/users
/api/v2/users

Saat ada atribut baru di resource (misal menambah username), biasanya seluruh client yang tidak perlu field ini akan tetap mendapatkan datanya (over-fetching).

Kelebihan

  • Skema API jelas tertulis di dokumentasi.
  • Mudah di-cache via HTTP caching (karena endpoint fix).

Kekurangan

  • Evolusi API lambat dan harus hati-hati jika menghapus/mengganti atribut.
  • Penambahan field bisa bikin response besar (over-fetching).

GraphQL

Di GraphQL, versi endpoint biasanya tidak perlu berubah, karena query yang dikirim client menentukan sendiri field apa saja yang dibutuhkan. Developer backend dapat menambah field baru kapan saja, tanpa mengganggu client lama.

Misalnya, kita menambahkan field username pada type User, client lama yang hanya query id dan name tidak akan terkena dampaknya sama sekali.

// Query lama (client lama)
query {
  user(id: 1) {
    id
    name
  }
}

// Query baru (client baru)
query {
  user(id: 1) {
    id
    name
    username
  }
}

Kelebihan

  • Evolusi schema lebih fleksibel & minim breaking change.
  • Tidak perlu versi baru untuk perubahan non-breaking.
  • Dokumentasi serta autocompletion langsung dari schema (SDL).

Kekurangan

  • Caching HTTP standar (seperti REST) tidak bisa langsung digunakan.
  • Potensi query terlalu dalam dan berat jika tidak dibatasi.

Perbandingan Evolusi API

ConcernREST APIGraphQL
Perubahan schemaPerlu versi baru (breaking change)Tambah field tanpa breaking
DokumentasiManual (Swagger, Postman)Otomatis dari schema SDL
CachingHTTP caching mudahPerlu custom caching

Contoh Implementasi Sederhana

Saya akan tunjukkan contoh backend sederhana menggunakan Node.js. Kode berikut memperlihatkan perbedaan antara route REST dan resolvers GraphQL.

REST API (Express.js):

const express = require('express');
const app = express();

const users = [{ id: 1, name: "Budi" }];
const posts = [{ id: 101, title: "Belajar REST", userId: 1 }];

app.get('/users/:id', (req, res) => {
  const user = users.find(u => u.id === Number(req.params.id));
  res.json(user);
});

app.get('/users/:id/posts', (req, res) => {
  const userPosts = posts.filter(p => p.userId === Number(req.params.id));
  res.json(userPosts);
});

app.listen(3000);

GraphQL (Apollo Server):

const { ApolloServer, gql } = require('apollo-server');

const users = [{ id: 1, name: "Budi" }];
const posts = [{ id: 101, title: "Belajar REST", userId: 1 }];

const typeDefs = gql`
  type User {
    id: Int
    name: String
    posts: [Post]
  }
  type Post {
    id: Int
    title: String
  }
  type Query {
    user(id: Int!): User
  }
`;

const resolvers = {
  Query: {
    user: (_, args) => users.find(u => u.id === args.id),
  },
  User: {
    posts: (parent) => posts.filter(p => p.userId === parent.id),
  },
};

const server = new ApolloServer({ typeDefs, resolvers });
server.listen({ port: 4000 });

Kapan Menggunakan REST? Kapan GraphQL?

GraphQL cocok jika:

  • Produk Anda frontend-heavy (web/mobile apps) dengan kebutuhan data berbeda-beda.
  • Sering terjadi over-fetching/under-fetching pada REST API Anda.
  • Ingin API evolusi cepat tanpa sering breaking change.

REST lebih tepat jika:

  • API Anda sederhana dengan bentuk resource yang sudah pasti.
  • Ingin manfaat dari HTTP caching yang sederhana.
  • Banyak client legacy yang mengandalkan endpoint tetap.

Kesimpulan

GraphQL dan REST API mempunyai keunggulan serta tantangan masing-masing. Tidak ada satu solusi untuk semua masalah, melainkan tergantung pada kebutuhan aplikasi, tim, dan infrastruktur Anda.

Dari pengalaman pribadi, GraphQL sangat membantu di aplikasi yang kompleks dan sering berubah. Namun REST tetap pilihan aman untuk sistem yang stabil dan mature. Pahami perbedaannya lewat dua perbandingan singkat di atas agar Anda bisa menentukan pilihan terbaik untuk proyek selanjutnya!


Referensi Tambahan:


Happy coding! 🚀

comments powered by Disqus