Episode 47 memandu migrasi REST ke GraphQL: assessment dan perencanaan, strategi incremental dengan strangler fig, GraphQL wrapper untuk REST dengan RESTDataSource, migrasi client dengan backward compatibility, hingga monitoring dan evaluasi pasca migrasi.

Kebanyakan tim yang mengadopsi GraphQL tidak mulai dari nol — mereka punya sistem REST yang sudah berjalan. Episode 47 membahas migrasi dari REST ke GraphQL dengan strategi yang aman dan bertahap, tanpa menghentikan layanan.
Kita akan merencanakan migrasi, menerapkan pola strangler fig, membangun wrapper GraphQL untuk REST, memigrasi client, dan mengevaluasi hasil setelahnya.
Migrasi dimulai dari pemetaan, bukan dari kode. Buat inventaris lengkap:
/users -> query user(id)
/users/:id/posts -> query user(id) { posts }
/posts -> query posts(first, after)
POST /posts -> mutation createPostDari sini tentukan prioritas: pilih use case yang paling diuntungkan GraphQL (over-fetching tinggi, N+1 request) untuk dimigrasi pertama, sebagai bukti keberhasilan (quick win).
Tentukan timeline realistis (mingguan, bukan "sekali jadi"), identifikasi risiko (client yang tidak bisa diubah, layanan lama yang tidak terurus), dan definisikan kriteria sukses yang terukur: latensi turun sekian persen, jumlah request per tampilan berkurang, dan tidak ada regresi fungsional.
Pola strangler fig menggeser sistem lama sedikit demi sedikit: sistem baru "menjalari" yang lama sampai akhirnya menggantikan. Untuk GraphQL:
Jalankan keduanya bersamaan — ini menghilangkan tekanan "semua atau tidak sama sekali". Gunakan feature flags untuk mengarahkan sebagian client ke GraphQL, lalu memperluas cakupan bertahap. Setiap rilis kecil bisa di-rollback tanpa menghentikan layanan.
Saat REST API tidak bisa diubah, bungkus dengan GraphQL. RESTDataSource (episode 8) menjadi jembatan utama:
import { RESTDataSource } from "@apollo/datasource-rest";
export class UsersAPI extends RESTDataSource {
baseURL = "https://legacy-api.example.com/";
async getUser(id) {
return this.get(`/users/${id}`);
}
async getPosts(userId) {
return this.get(`/users/${userId}/posts`);
}
}Pertama lihat bentuk response REST-nya, misalnya dengan curl https://legacy-api.example.com/users/1. Petakan response REST ke bentuk GraphQL di data source atau resolver, dan terjemahkan error REST ke error GraphQL (episode 11). Perhatikan juga caching: REST API lama mungkin sudah punya header cache — manfaatkan di data source.
Migrasi client dilakukan bertahap:
const useGraphQL = featureFlags.get("graphql-profile");
if (useGraphQL) {
return useGetUserQuery({ variables: { id } });
}
return useLegacyRestUser(id);Siapkan rollback di dua level: feature flag untuk mematikan GraphQL kapan saja, dan versi deploy yang bisa kembali. Komunikasikan jadwal pemindahan ke pengguna internal — perubahan API jarang menimbulkan masalah teknis, sering menimbulkan masalah komunikasi.
Setelah client berpindah:
Bandingkan dengan kriteria sukses: ukur pengurangan round-trip, latensi, dan kemudahan development. Tulis pelajaran yang dipetik (episode 49) dan perbarui dokumentasi — schema GraphQL yang baru menjadi kontrak utama tim sekarang.
Inti yang harus dibawa pulang:
Di episode 48 selanjutnya kalian akan mempelajari GraphQL di berbagai bahasa — Graphene dan Strawberry untuk Python, GraphQL Java dan Spring Boot, gqlgen untuk Go, GraphQL Ruby untuk Rails, Lighthouse untuk Laravel, Hot Chocolate untuk .NET, hingga Juniper untuk Rust. GraphQL tidak hanya untuk JavaScript!