tutorial

3 Mengenal graphql-go: Library GraphQL untuk Go

Mengenal graphql-go: Library GraphQL untuk Go

GraphQL telah merevolusi cara pengembang membangun API dalam beberapa tahun terakhir. Dengan pendekatan deklaratif dan query yang fleksibel, GraphQL menjadi pilihan populer menggantikan REST, tidak terkecuali dalam ekosistem bahasa Go (Golang). Salah satu implementasi terkemuka GraphQL di Golang adalah graphql-go, library yang sederhana namun powerful untuk membangun server GraphQL.

Pada artikel ini, saya akan membahas apa itu graphql-go, mengapa Anda perlu mempertimbangkannya saat membangun API di Go, serta contoh implementasi, simulasi kueri, hingga visualisasi alur permintaan GraphQL menggunakan kode mermaid.


Apa itu graphql-go?

graphql-go adalah sebuah pustaka open source yang dikembangkan oleh komunitas Go dengan inspirasi dari implementasi GraphQL utama di ekosistem JavaScript (graphql-js). Library ini menyediakan tools untuk mendefinisikan schema, mengatur resolver, serta memproses query GraphQL secara aman dan cepat di backend Go.

Beberapa keunggulan graphql-go:

  • Schema Type-safe: Skema didefinisikan secara eksplisit menggunakan Go struct dan field tag.
  • Resolver sederhana: Fungsi resolver dapat mengakses data dengan mudah, mendukung context dan argumen.
  • Integrasi dengan HTTP: Cocok untuk diintegrasikan langsung dengan net/http.
  • Performansi dan Skalabilitas: Sangat cepat dan efisien, ideal untuk aplikasi real-time dan scale-up.
  • Dukungan Middleware: Mudah diintegrasikan dengan middleware Go lain (mis. logging, auth, tracer).

Mengapa Memilih graphql-go?

Sebagai engineer, memilih tools bukan sekedar ikut tren — melainkan bagaimana tool tersebut menunjang kebutuhan aplikasi kita sekarang dan ke depan. Berikut beberapa alasan memilih graphql-go:

Kriteriagraphql-goREST (pakai Gorilla Mux dkk.)
FlexibilitasQuery dapat difilter, sorting, agregasi sekaligus. Klien hanya ambil data yang dibutuhkan.Response kaku dan endpoint bervariasi
TypingSchema dan resolver Go type-safe, cocok untuk codebase yang strict type.Umumnya tidak strict, tergantung JSON
EcosystemBanyak library pelengkap (validation, auth, dataloader).Lebih mature, banyak contoh.
Learning CurveAwalnya menantang, dokumentasi lengkap.Relatif mudah, banyak tutorial.
PerformanceFast! Dipakai di perusahaan besar streaming, bank, fintech.Sudah teruji & reliable.

Contoh Implementasi graphql-go API Sederhana

Kita akan praktek membangun API GraphQL sederhana untuk aplikasi perpustakaan. Endpoint-nya bisa meng-query daftar buku dan menambah buku baru.

1. Instalasi Dependency

go get github.com/graph-gophers/graphql-go
go get github.com/graph-gophers/graphql-go/relay

2. Definisikan Skema GraphQL

Buat file schema.graphql:

type Book {
    id: ID!
    title: String!
    author: String!
}

type Query {
    books: [Book!]!
}

type Mutation {
    createBook(title: String!, author: String!): Book!
}

3. Mapping Skema ke Struct Go

Buat file schema.go:

package main

import (
    "context"
    "github.com/graph-gophers/graphql-go"
)

type Book struct {
    ID     graphql.ID
    Title  string
    Author string
}

type Resolver struct {
    books []*Book
}

func (r *Resolver) Books(ctx context.Context) ([]*Book, error) {
    return r.books, nil
}

type mutationResolver struct{ resolver *Resolver }

func (m *mutationResolver) CreateBook(ctx context.Context, args struct{ Title, Author string }) (*Book, error) {
    book := &Book{
        ID:     graphql.ID(fmt.Sprintf("B%d", len(m.resolver.books)+1)),
        Title:  args.Title,
        Author: args.Author,
    }
    m.resolver.books = append(m.resolver.books, book)
    return book, nil
}

4. Inisialisasi Schema & Jalankan HTTP Server

Buat file main.go:

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"

    "github.com/graph-gophers/graphql-go"
    "github.com/graph-gophers/graphql-go/relay"
)

func main() {
    schemaBytes, err := ioutil.ReadFile("schema.graphql")
    if err != nil {
        log.Fatal(err)
    }
    resolver := &Resolver{books: []*Book{
        {ID: "B1", Title: "Golang for Beginners", Author: "John Doe"},
    }}
    schema := graphql.MustParseSchema(string(schemaBytes), resolver)
    http.Handle("/query", &relay.Handler{Schema: schema})

    log.Println("connect to http://localhost:8080/query for GraphQL playground")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Simulasi Query & Mutation

Mari uji API GraphQL menggunakan tools seperti GraphQL Playground atau curl:

Query Daftar Buku

query {
  books {
    id
    title
    author
  }
}

Response:

{
  "data": {
    "books": [
      {
        "id": "B1",
        "title": "Golang for Beginners",
        "author": "John Doe"
      }
    ]
  }
}

Menambah Buku Baru

mutation {
  createBook(title: "Machine Learning with Go", author: "Jane Smith") {
    id
    title
    author
  }
}

Response:

{
  "data": {
    "createBook": {
      "id": "B2",
      "title": "Machine Learning with Go",
      "author": "Jane Smith"
    }
  }
}

Diagram Alur GraphQL di graphql-go

Visualisasi mermaid di bawah ini menggambarkan alur request GraphQL pada server yang kita bangun tadi:

flowchart TD
    A[Client] -- HTTP POST /query --> B[Go HTTP router]
    B -- kirim payload ke relay.Handler --> C[graphql-go ParseSchema]
    C -- Temukan Query / Mutation --> D[Resolver Function]
    D -- Akses Data (slice, DB, atau API) --> E[Tulis Response JSON]
    E -- Response JSON --> A

Tips Pengembangan dan Best Practice

  1. Gunakan Context untuk Auth dan Tracing Perhatikan bahwa setiap resolver menerima context.Context. Gunakan ini untuk inject user info (JWT claims), timeout, dan memonitor trace request.

  2. Testing Resolver secara mandiri Karena schema dan resolver terpisah, Anda bisa unit test setiap resolver (misal mock data ke database).

  3. Integrasi Middleware Integrasikan dengan middleware Go populer, seperti logging, limiter, dan metrics.

  4. Schema-First atau Code-First Dengan graphql-go, Anda bisa mulai dari file schema (*.graphql) atau generate schema dari struct Go. Pilih yang sesuai tim Anda.


Kesimpulan

graphql-go memberikan fleksibilitas, performa, dan kesederhanaan membangun GraphQL API dalam ekosistem Go. Dengan schema type-safe, mapping mudah antara struct dan skema, serta integrasi lancar dengan HTTP dan middleware, library ini sangat cocok untuk microservice modern dan backend realtime.

Jika Anda membutuhkan API yang fleksibel dan powerful, pertimbangkan graphql-go sebagai fondasi layer API Anda berikutnya. Belajar dan eksplorasi lebih lanjut di repositori graphql-go, dan bangun API yang scalable untuk masa depan!


Referensi:

comments powered by Disqus