11 Apa Itu Skema GraphQL? Konsep dan Komponen
11 Apa Itu Skema GraphQL? Konsep dan Komponen
GraphQL telah mengubah cara kita membangun API. Tidak hanya memberi cara baru dalam query data, GraphQL menawarkan fleksibilitas yang sulit didapat dari REST API biasa. Di balik kekuatan GraphQL, terdapat elemen penting yang menjadi fondasinya: skema. Pada artikel ini, saya akan membahas secara mendalam tentang apa itu skema GraphQL, konsep dasar yang mendukungnya, serta komponen utama yang harus dipahami oleh setiap engineer yang ingin membangun sistem handal dengan GraphQL.
1. Pengantar Skema GraphQL
Sederhananya, skema GraphQL adalah kontrak antara server dan client. Ia mendeskripsikan keseluruhan kemampuan API - tipe data apa saja yang bisa di-query, relasi antar data, operasi apa saja yang bisa dijalankan, dan bagaimana bentuk hasilnya.
Bayangkan ketika membangun REST API, Anda harus mendokumentasikan endpoint, parameter, dan response-nya. Dalam GraphQL, seluruh detail itu tertuang dalam satu skema yang selalu up-to-date dan valid secara otomatis.
2. Mengapa Skema Penting?
- Otomatisasi Dokumentasi: Skema dapat didokumentasikan dan diinspeksi secara otomatis, salah satunya melalui tool seperti GraphQL Playground atau GraphiQL.
- Validasi Data: Setiap permintaan (query/mutation) yang tidak sesuai skema akan ditolak server.
- Introspeksi: Client bisa mengeksplorasi skema untuk mengetahui tipe data dan operasi yang tersedia.
3. Struktur Dasar Skema
Skema GraphQL ditulis dalam Schema Definition Language (SDL), yang bentuknya menyerupai definisi tipe pada TypeScript atau bahasa pemrograman modern lainnya.
Contoh Skema Sederhana
1type Query {
2 user(id: ID!): User
3}
4
5type User {
6 id: ID!
7 name: String!
8 email: String
9}Di sini, skema menentukan ada satu query (user) yang menerima id bertipe ID! (wajib), dan mengembalikan tipe User.
4. Diagram Alur Kerja Skema
Mari kita visualisasikan bagaimana skema memproses query menggunakan diagram mermaid:
graph TD
A[Client Kirim Query] --> B[Validasi Terhadap Skema]
B -- Valid --> C[Eksekusi Resolver]
B -- Tidak Valid --> D[Return Error]
C --> E[Return Data]
D --> F[Selesai]
E --> F
5. Komponen Utama Skema GraphQL
- Type (Tipe Data)
- Query
- Mutation
- Subscription
- Input Type
- Enum
- Interface
- Union
- Scalar
- Directive
- Resolver
Kita akan bahas satu per satu.
6. Type: Membangun Struktur Data
Setiap data di GraphQL didefinisikan sebagai type. Tipe dapat berupa objek, scalar, enum, atau gabungan.
1type Book {
2 id: ID!
3 title: String!
4 author: Author!
5}7. Query: Pintu Masuk Pengambilan Data
Semua pengambilan data dalam GraphQL lewat Query.
1type Query {
2 books: [Book]
3 book(id: ID!): Book
4}8. Mutation: Manipulasi Data
Untuk menciptakan, mengubah, atau menghapus data, gunakan Mutation.
1type Mutation {
2 addBook(title: String!, authorId: ID!): Book!
3 deleteBook(id: ID!): Boolean!
4}9. Subscription: Real-Time Data
Subscription memungkinkan client menikmati perubahan data secara real-time lewat WebSocket atau transport lainnya.
1type Subscription {
2 bookAdded: Book
3}10. Scalar, Enum, dan Input Type
Scalar
Tipe dasar (primitive) seperti Int, Float, String, Boolean, dan ID.
Enum
Untuk value yang terbatas.
1enum BookStatus {
2 AVAILABLE
3 CHECKED_OUT
4 LOST
5}Input Type
Digunakan agar input lebih terstruktur.
1input AddBookInput {
2 title: String!
3 authorId: ID!
4}
1input AddBookInput {
2 title: String!
3 authorId: ID!
4}11. Interface dan Union: Polymorphism ala GraphQL
Interface
Definisi contract untuk beberapa type.
1interface Character {
2 id: ID!
3 name: String!
4}
5type Human implements Character {
6 id: ID!
7 name: String!
8 homePlanet: String
9}
10type Droid implements Character {
11 id: ID!
12 name: String!
13 primaryFunction: String
14}Union
Untuk field yang mungkin hasilnya lebih dari satu type.
1union SearchResult = Book | Author12. Resolver: Implementasi Bisnis Logic
Setiap field dalam Query, Mutation, atau Subscription harus punya resolver, yang berfungsi mengeksekusi permintaan.
1const resolvers = {
2 Query: {
3 books: () => getBooksFromDB(),
4 book: (_, { id }) => getBookById(id),
5 },
6 Mutation: {
7 addBook: (_, { title, authorId }) => insertBook(title, authorId),
8 }
9};13. Directive: Customisasi di Level Skema
Directive adalah anotasi pada skema untuk modifikasi perilaku, misal @deprecated atau membuat directive sendiri seperti @auth.
1type Book {
2 title: String!
3 published: Boolean! @deprecated(reason: "Field diganti dengan publishDate")
4}14. Skema Sebagai Sumber Kebenaran (Source of Truth)
Perlu diingat, skema GraphQL adalah pusat dari semua interaksi API. Perubahan pada skema (misal: menambah field baru, mengubah type) akan langsung berdampak ke seluruh ekosistem aplikasi.
15. Simulasi Query & Response
Agar lebih jelas, berikut simulasi query dan responsenya sesuai skema di atas.
Query:
1query {
2 books {
3 id
4 title
5 author {
6 name
7 }
8 }
9}Response: 1{
2 "data": {
3 "books": [
4 {
5 "id": "1",
6 "title": "GraphQL in Action",
7 "author": { "name": "John Doe" }
8 },
9 {
10 "id": "2",
11 "title": "Learning GraphQL",
12 "author": { "name": "Jane Doe" }
13 }
14 ]
15 }
16}
1{
2 "data": {
3 "books": [
4 {
5 "id": "1",
6 "title": "GraphQL in Action",
7 "author": { "name": "John Doe" }
8 },
9 {
10 "id": "2",
11 "title": "Learning GraphQL",
12 "author": { "name": "Jane Doe" }
13 }
14 ]
15 }
16}16. Tabel Perbandingan Komponen Skema
| Komponen | Fungsi | Contoh Syntax |
|---|---|---|
| Type | Struktur data utama | type Book { id: ID!... } |
| Query | Pengambilan data | type Query { book(id:ID!):Book } |
| Mutation | Manipulasi data | type Mutation { addBook... } |
| Subscription | Data real time | type Subscription { bookAdded... } |
| Enum | Daftar value tetap | enum BookStatus { ... } |
| Input | Input structured | input AddBookInput { ... } |
| Interface | Kontrak untuk type | interface Character { ... } |
| Union | Hasil multitype | `union SearchResult = Book |
| Scalar | Tipe data dasar | String, Int, Float... |
| Directive | Modifikasi perilaku skema | @deprecated |
17. Kesimpulan
Memahami skema GraphQL adalah langkah paling fundamental dalam membangun API berbasis GraphQL. Skema bukan hanya mendeskripsikan data, tapi juga menentukan bagaimana client dan server harus berinteraksi. Dengan pemahaman yang kuat tentang konsep dan komponen skema, Anda bisa merancang API yang scalable, robust, dan mudah dikembangkan.
Sebagai engineer, jangan ragu mengeksplorasi skema dengan mencoba, menginspeksi, dan memanfaatkan auto-documentation yang tersedia di banyak ecosystem GraphQL. Selalu ingat: Skema adalah kontrak. Pastikan ia jelas, ketat, dan selalu menjadi source of truth di projek Anda.
Salam,
Engineer yang selalu belajar dari skema.