Skip to content
Santekno.com | Level Up Your Engineering Skills
ID
📖 0%
03 Jul 2025 · 5 mnt baca ·Artikel 3 / 125
Go

3 Mengenal graphql-go: Library GraphQL untuk Go

IH
Ihsan Arif
Penulis di Santekno · Backend Engineer

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

shell
1go get github.com/graph-gophers/graphql-go
2go get github.com/graph-gophers/graphql-go/relay

2. Definisikan Skema GraphQL

Buat file schema.graphql:

graphql
 1type Book {
 2    id: ID!
 3    title: String!
 4    author: String!
 5}
 6
 7type Query {
 8    books: [Book!]!
 9}
10
11type Mutation {
12    createBook(title: String!, author: String!): Book!
13}

3. Mapping Skema ke Struct Go

Buat file schema.go:

go
 1package main
 2
 3import (
 4    "context"
 5    "github.com/graph-gophers/graphql-go"
 6)
 7
 8type Book struct {
 9    ID     graphql.ID
10    Title  string
11    Author string
12}
13
14type Resolver struct {
15    books []*Book
16}
17
18func (r *Resolver) Books(ctx context.Context) ([]*Book, error) {
19    return r.books, nil
20}
21
22type mutationResolver struct{ resolver *Resolver }
23
24func (m *mutationResolver) CreateBook(ctx context.Context, args struct{ Title, Author string }) (*Book, error) {
25    book := &Book{
26        ID:     graphql.ID(fmt.Sprintf("B%d", len(m.resolver.books)+1)),
27        Title:  args.Title,
28        Author: args.Author,
29    }
30    m.resolver.books = append(m.resolver.books, book)
31    return book, nil
32}

4. Inisialisasi Schema & Jalankan HTTP Server

Buat file main.go:

go
 1package main
 2
 3import (
 4    "fmt"
 5    "io/ioutil"
 6    "log"
 7    "net/http"
 8
 9    "github.com/graph-gophers/graphql-go"
10    "github.com/graph-gophers/graphql-go/relay"
11)
12
13func main() {
14    schemaBytes, err := ioutil.ReadFile("schema.graphql")
15    if err != nil {
16        log.Fatal(err)
17    }
18    resolver := &Resolver{books: []*Book{
19        {ID: "B1", Title: "Golang for Beginners", Author: "John Doe"},
20    }}
21    schema := graphql.MustParseSchema(string(schemaBytes), resolver)
22    http.Handle("/query", &relay.Handler{Schema: schema})
23
24    log.Println("connect to http://localhost:8080/query for GraphQL playground")
25    log.Fatal(http.ListenAndServe(":8080", nil))
26}

Simulasi Query & Mutation

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

Query Daftar Buku

graphql
1query {
2  books {
3    id
4    title
5    author
6  }
7}

Response:

json
 1{
 2  "data": {
 3    "books": [
 4      {
 5        "id": "B1",
 6        "title": "Golang for Beginners",
 7        "author": "John Doe"
 8      }
 9    ]
10  }
11}

Menambah Buku Baru

graphql
1mutation {
2  createBook(title: "Machine Learning with Go", author: "Jane Smith") {
3    id
4    title
5    author
6  }
7}

Response:

json
1{
2  "data": {
3    "createBook": {
4      "id": "B2",
5      "title": "Machine Learning with Go",
6      "author": "Jane Smith"
7    }
8  }
9}


Diagram Alur GraphQL di graphql-go

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

MERMAID
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:

Artikel Terkait

💬 Komentar