GraphQL #
Dalam dunia software engineering modern, API adalah tulang punggung komunikasi antar sistem. Selama bertahun-tahun, REST menjadi standar de-facto. Namun, seiring berkembangnya kebutuhan aplikasi (mobile, SPA, microservices), muncul berbagai pain point: over-fetching, under-fetching, dan kebutuhan endpoint yang semakin kompleks.
Dari problem inilah GraphQL lahir.
Artikel ini akan membahas apa itu GraphQL, sejarahnya, nilai pentingnya, perbandingan kelebihan dan kekurangan GraphQL dibanding metode lain, serta best practice dalam penggunaannya.
Apa Itu GraphQL? #
GraphQL adalah query language dan runtime untuk API yang memungkinkan client menentukan sendiri data apa yang dibutuhkan, defined by a strongly typed schema.
Alih-alih banyak endpoint seperti REST, GraphQL biasanya memiliki satu endpoint dengan berbagai query, mutation, dan subscription.
Contoh sederhana:
- Client REST:
/users/1→ server menentukan response - Client GraphQL:
query { user(id: 1) { id name email } }→ client menentukan response
Sejarah Singkat GraphQL #
2012 – Dikembangkan secara internal oleh Facebook
- Latar belakang: aplikasi mobile Facebook membutuhkan data fleksibel dengan jaringan terbatas
2015 – GraphQL di-open source oleh Facebook
2018 – GraphQL menjadi spesifikasi di bawah GraphQL Foundation
Sekarang – Digunakan luas oleh perusahaan besar (GitHub, Shopify, Netflix, Airbnb)
GraphQL lahir bukan untuk menggantikan REST sepenuhnya, tetapi untuk menyelesaikan problem tertentu yang sulit ditangani REST.
Nilai Penting GraphQL #
1. Client-Driven API #
Client memiliki kontrol penuh terhadap data yang dibutuhkan.
- Tidak ada over-fetching
- Tidak ada under-fetching
2. Strongly Typed Schema #
Schema menjadi kontrak eksplisit antara backend dan frontend.
- Mudah divalidasi
- Mudah didokumentasikan
- Aman untuk refactor
3. Evolvability #
- Penambahan field tidak merusak client lama
- Deprecation bisa dilakukan secara gradual
4. Cocok untuk Aplikasi Kompleks #
Terutama:
- Mobile apps
- Single Page Application (SPA)
- BFF (Backend for Frontend)
Perbandingan GraphQL dengan Metode Lain #
GraphQL vs REST #
| Aspek | GraphQL | REST |
|---|---|---|
| Endpoint | Umumnya 1 endpoint | Banyak endpoint |
| Kontrol data | Client menentukan | Server menentukan |
| Over-fetching | Hampir tidak ada | Umum terjadi |
| Under-fetching | Hampir tidak ada | Umum terjadi |
| Versioning | Jarang diperlukan | Umumnya via /v1, /v2 |
| Caching HTTP | Lebih kompleks | Sangat mudah |
| Learning curve | Lebih tinggi | Lebih rendah |
Kesimpulan:
- REST unggul untuk API sederhana dan public
- GraphQL unggul untuk API kompleks dan client beragam
GraphQL vs gRPC #
| Aspek | GraphQL | gRPC |
|---|---|---|
| Protokol | HTTP | HTTP/2 |
| Schema | SDL (human-readable) | Protobuf |
| Client flexibility | Sangat tinggi | Rendah |
| Performance | Baik, tapi bisa berat | Sangat tinggi |
| Use case utama | Frontend-facing API | Internal service-to-service |
Kesimpulan:
- GraphQL cocok untuk frontend
- gRPC cocok untuk internal microservices
GraphQL vs JSON-RPC #
| Aspek | GraphQL | JSON-RPC |
|---|---|---|
| Query fleksibel | Ya | Tidak |
| Schema eksplisit | Ya | Opsional |
| Tooling | Sangat matang | Terbatas |
Kelebihan GraphQL #
1. Tidak Over-Fetching #
Client hanya menerima data yang dibutuhkan.
2. Mengurangi Round Trip #
Satu query bisa mengambil banyak resource sekaligus.
3. Dokumentasi Otomatis #
Schema = dokumentasi.
4. Frontend Friendly #
Frontend bisa berkembang tanpa bergantung pada perubahan backend yang sering.
5. Ekosistem Tooling Kuat #
- GraphiQL / GraphQL Playground
- Apollo
- Relay
- Code generation
Kekurangan GraphQL #
1. Kompleksitas di Backend #
- Resolver
- Query planning
- Performance tuning
2. Risiko Query Terlalu Berat #
Tanpa kontrol, client bisa membuat query:
- Terlalu dalam (deep nesting)
- Terlalu luas (field explosion)
3. Caching Lebih Sulit #
Tidak semudah REST yang mengandalkan HTTP cache.
4. Tidak Selalu Cocok #
Untuk:
- CRUD sederhana
- API public yang stateless dan cache-heavy
Best Practice #
Desain Schema adalah Kunci #
- Fokus pada domain, bukan database
- Gunakan nama field yang jelas dan konsisten
❌ getUserData
✅ user
Batasi Kompleksitas Query #
- Depth limit
- Complexity scoring
- Timeout
Ini penting untuk mencegah abuse.
Gunakan DataLoader #
Untuk menghindari:
- N+1 Query Problem
DataLoader membantu batching dan caching di level request.
Jangan Takut Menggunakan REST Bersama GraphQL #
Hybrid approach sering lebih sehat:
- GraphQL untuk frontend
- REST/gRPC untuk internal service
Versioning dengan Deprecation #
Gunakan:
deprecated(reason: "Use newField instead")
Bukan /v2.
Monitoring dan Observability #
Pantau:
- Query time
- Resolver latency
- Error rate per field
GraphQL tanpa observability = blind spot.
Jangan Jadikan GraphQL Sekadar Query Wrapper #
GraphQL bukan ORM over HTTP.
- Tetap enforce business logic
- Tetap validasi
Kapan Sebaiknya Menggunakan GraphQL? #
Gunakan GraphQL jika:
- Banyak jenis client (web, mobile, partner)
- UI sangat dinamis
- Over-fetching menjadi masalah nyata
Hindari GraphQL jika:
- API sangat sederhana
- Fokus utama adalah caching HTTP
- Tim belum siap dengan kompleksitas tambahan
Penutup #
GraphQL adalah alat yang sangat kuat, tetapi bukan silver bullet.
Dipakai dengan tepat, GraphQL:
- Membuat API lebih fleksibel
- Mempercepat development frontend
- Mengurangi coupling antar tim
Dipakai tanpa disiplin, GraphQL justru:
- Menjadi sumber masalah performa
- Menambah kompleksitas tanpa nilai
Kuncinya bukan REST vs GraphQL, tetapi: memilih alat yang tepat untuk problem yang tepat.