Episode ini membedah cara kerja GraphQL di bawah kap: parsing, validasi, dan eksekusi query, komponen utama seperti SDL dan resolver, tiga operasi dasar query mutation subscription, serta pola arsitektur gateway dan federation.

Di episode 1 kalian sudah tahu kenapa GraphQL ada. Sekarang saatnya memahami bagaimana GraphQL bekerja dari dalam. Episode 2 membedah arsitektur dan konsep fundamental GraphQL secara menyeluruh.
Kita akan menelusuri alur request dari client hingga data dikembalikan: parsing, validation, dan execution. Lalu kita mengenali komponen-komponen utama — schema, type system, resolver, data source, context, dan execution engine. Terakhir, kita membahas tiga operasi dasar dan pola arsitektur yang dipakai di industri, termasuk gateway dan federation.
Selain memahami alur teknisnya, ada satu prinsip yang akan berulang di sepanjang series ini: dalam GraphQL, schema adalah sumber kebenaran. Semua kemampuan GraphQL — validasi, autocomplete, dokumentasi, dan eksekusi — berakar pada schema yang kalian tulis.
Setiap operasi GraphQL melewati tiga tahap di dalam runtime:
query string -> parse -> validate -> execute -> JSON responseKonsekuensi penting: GraphQL tidak pernah mengeksekusi query yang gagal validasi. Karena itulah schema harus didefinisikan dengan tepat — schema adalah contract sekaligus guard.
Supaya alur ini terasa nyata, bayangkan sebuah restoran. Menu adalah schema, pramusaji adalah parser yang menerjemahkan pesanan, dan dapur adalah resolver yang menyiapkan setiap hidangan. Kalau ada item yang tidak ada di menu, pramusaji langsung menolak pesanan sebelum masuk dapur — persis seperti GraphQL yang menolak query yang tidak sesuai schema.
Kalian bisa melihat sendiri bagaimana sebuah query diubah menjadi AST dengan node -e "const g=require('graphql');console.log(g.parse('{hello}'))". Perhatikan bahwa parser bekerja tanpa perlu tahu isi schema — validasi yang memakai schema, dan itu terjadi setelah parsing selesai.
GraphQL mengeksekusi resolver secara paralel bila memungkinkan. Resolver yang saling independen dijalankan bersamaan melalui Promise.all, sementara resolver bertingkat (nested) menunggu parent selesai dulu karena butuh nilai dari parent. Pemahaman ini penting saat mengoptimasi performa di episode 19, dan saat menghadapi masalah N+1 di episode 9.
SDL adalah bahasa untuk mendefinisikan schema. Ini adalah jantung GraphQL:
type Query {
hello: String
users: [User]
}
type User {
id: ID!
name: String!
age: Int
}Dari schema inilah seluruh type system dibangun. Kita akan membedah SDL dan semua tipe yang tersedia secara mendalam di episode 3.
Jika schema menjawab pertanyaan "bentuknya seperti apa", resolver menjawab "datanya dari mana". Setiap field di schema bisa memiliki resolver yang bertugas mengambil data dari data source — database, REST API, atau service lain. Sementara itu, context adalah objek yang dibagikan ke semua resolver dalam satu request, biasanya berisi user yang sedang login, koneksi database, dan data loader. Rincian lengkapnya akan kalian pelajari di episode 6.
Execution engine adalah runtime yang menyatukan semuanya. Dia menerima query, memvalidasi dengan schema, lalu menelusuri AST dan memanggil resolver field per field. Di ekosistem JavaScript, implementasi referensinya adalah library graphql yang dihasilkan dari spesifikasi. Ketika kalian memakai Apollo Server nanti, kalian sebenarnya menyalakan execution engine di atas HTTP server.
GraphQL mendefinisikan tiga tipe operasi, masing-masing masuk ke root type yang berbeda:
Query.Mutation.Subscription.type Query {
getPost(id: ID!): Post
}
type Mutation {
createPost(title: String!): Post
}
type Subscription {
postCreated: Post
}Aturan penting: operasi query dieksekusi secara paralel, sementara mutation dieksekusi secara serial. Ini menjamin bahwa mutation yang berurutan dalam satu request melihat hasil mutation sebelumnya — kita akan membahasnya di episode 5.
Pilihan antara query, mutation, dan subscription bukan sekadar perbedaan sintaks; ia menegaskan kontrak semantik. Klien dan server sama-sama tahu bahwa mutation mengubah state, sehingga tooling bisa meminta konfirmasi sebelum mengirim, dan caching bisa diperlakukan berbeda. Nuansa semantik ini membuat API GraphQL lebih ekspresif daripada sekadar daftar endpoint.
Ketika aplikasi tumbuh menjadi banyak service, kalian bisa menempatkan GraphQL Gateway di depan service-service tersebut. Gateway meng-agregasi schema dari setiap service menjadi satu schema global, sehingga client tetap berinteraksi dengan satu endpoint. Ada dua pendekatan utama: schema stitching dan federation yang akan dibahas di episode 22.
Pola paling sederhana dan paling umum: GraphQL berdiri sebagai API layer di antara client dan data. Client hanya mengenal GraphQL, sementara di belakangnya bisa ada database, REST API legacy, atau third-party service. Pola ini bagus untuk mulai mengadopsi GraphQL tanpa mengubah seluruh arsitektur, dan menjadi fondasi strategi migrasi di episode 47.
Inti yang harus dibawa pulang:
Di episode 3 selanjutnya kalian akan mempelajari Schema Definition Language dan Type System — scalar types, object types, input types, enum, interface, union, serta list types dan modifiers. Ini adalah fondasi yang menentukan bentuk seluruh API GraphQL kalian, jadi pastikan kalian fokus!