tutorial

101 Apa Itu gqlgen? GraphQL Code Generation untuk Go

101 Apa Itu gqlgen? GraphQL Code Generation untuk Go

Sejak kehadiran GraphQL sebagai alternatif REST API, banyak pengembang mulai merasakan kemudahan dalam memanage data yang kompleks dan efisien. Namun, implementasi GraphQL pada bahasa Go sempat menjadi tantangan tersendiri—khususnya soal type safety dan penulisan boilerplate yang cukup melelahkan. Dari permasalahan inilah, gqlgen hadir sebagai solusi.

Artikel ini akan membahas apa itu gqlgen, kenapa harus digunakan, dan bagaimana cara memulainya. Mari masuk lebih dalam mengenai ‘GraphQL Code Generation’ untuk Go beserta contoh kode, simulasi alur, tabel, dan diagram. Siap? Let’s dive!


Apa itu gqlgen?

gqlgen adalah sebuah framework library open source untuk membangun server GraphQL di Go. Berbeda dengan pendekatan lain yang biasanya code-first (mendefinisikan skema dari kode), gqlgen mengambil pendekatan schema-first — artinya, Anda mendefinisikan schema GraphQL menggunakan file .graphql, lalu gqlgen akan mengenerate kode Go-nya untuk Anda.

Dengan strategi code generation ini, gqlgen memberikan:

  • Type Safety — Semua operasi GraphQL langsung terhubung ke model Go.
  • Minim Boilerplate — Fungsi-fungsi penanganan resolver otomatis di-generate.
  • Integrasi mudah — Dukungan middleware, directives, dan custom scalar.
  • Simple to get started — Konfigurasi sederhana, reset dengan satu perintah.

Mengapa Menggunakan gqlgen?

Mari lihat tabel di bawah sebagai perbandingan dengan alternatif lain:

LibraryPendekatanType SafetyOtomasi KodePopularitas
gqlgenSchema-first✔️✔️⭐⭐⭐⭐⭐
graphql-goCode-first⭐⭐⭐
ent+entgqlCode/schema✔️Partial⭐⭐⭐⭐

Kelebihan utama gqlgen adalah code yang dihasilkan sesuai dengan schema, sehingga refactor schema tidak perlu risau tentang kode yang tertinggal — cukup generate ulang.


Arsitektur dan Flow gqlgen

Sebelum lanjut, pahami diagram alur sederhananya berikut dengan mermaid:

flowchart TD
    A[Schema.graphql] -->|gqlgen generate| B[Resolver Stubs]
    B --> C[Kode Go]
    C --> D[API GraphQL Siap Digunakan]
  1. Anda menulis schema di schema.graphql.
  2. Perintah gqlgen generate menghasilkan kode Go dan “stub” untuk setiap resolver.
  3. Anda melengkapi fungsi resolver sesuai kebutuhan bisnis.
  4. Server API GraphQL siap digunakan.

Studi Kasus: Membuat API Book Store Sederhana

Langkah berikut akan memandu Anda membuat API sederhana untuk daftar buku.

1. Inisialisasi Project

Buat folder, inisialisikan Go module, dan install gqlgen:

mkdir bookapi-gql && cd bookapi-gql
go mod init bookapi-gql
go get github.com/99designs/gqlgen

Inisialisasi struktur project gqlgen:

go run github.com/99designs/gqlgen init

Akan terbuat beberapa file penting:

  • schema.graphqls
  • resolver.go
  • generated.go, dsb.

2. Definisikan Schema

Edit schema.graphqls:

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

type Query {
    books: [Book!]!
    book(id: ID!): Book
}

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

3. Generate Kode

Jalankan:

go run github.com/99designs/gqlgen generate

Ini akan menghasilkan stub handler di resolver.go, model di model/models_gen.go, dan kode GraphQL lainnya.

4. Lengkapi Resolver

Edit resolver.go

package graph

import (
    "bookapi-gql/graph/model"
    "context"
    "strconv"
)

// Simulasi database in-memory
var books = []*model.Book{
    {ID: "1", Title: "Clean Code", Author: "Robert C. Martin"},
    {ID: "2", Title: "The Pragmatic Programmer", Author: "Andy Hunt"},
}

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

func (r *queryResolver) Book(ctx context.Context, id string) (*model.Book, error) {
    for _, book := range books {
        if book.ID == id {
            return book, nil
        }
    }
    return nil, nil
}

// Mutation Resolver Implementation
func (r *mutationResolver) AddBook(ctx context.Context, title string, author string) (*model.Book, error) {
    id := strconv.Itoa(len(books) + 1)
    book := &model.Book{ID: id, Title: title, Author: author}
    books = append(books, book)
    return book, nil
}

5. Konfigurasikan Server

Biasanya file starter server.go sudah ada:

package main

import (
    "log"
    "net/http"
    "os"

    "bookapi-gql/graph"
    "bookapi-gql/graph/generated"

    "github.com/99designs/gqlgen/graphql/handler"
    "github.com/99designs/gqlgen/graphql/playground"
)

func main() {
    srv := handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{Resolvers: &graph.Resolver{}}))

    http.Handle("/", playground.Handler("GraphQL playground", "/query"))
    http.Handle("/query", srv)

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

Jalankan server:

go run .

Simulasi Operasi

Dengan Playground di http://localhost:8080/, coba operasi berikut:

Query Semua Buku

query {
  books {
    id
    title
    author
  }
}

Response:

{
  "data": {
    "books": [
      {"id": "1", "title": "Clean Code", "author": "Robert C. Martin"},
      {"id": "2", "title": "The Pragmatic Programmer", "author": "Andy Hunt"}
    ]
  }
}

Mutation Tambah Buku

mutation {
  addBook(title: "Go in Action", author: "William Kennedy") {
    id
    title
    author
  }
}

Custom Scalar & Directive

Salah satu kekuatan gqlgen adalah dukungan custom scalar dan directive. Misal ingin memakai DateTime sebagai scalar baru atau control auth dengan directive:

scalar DateTime

directive @auth(role: String) on FIELD_DEFINITION

Konfigurasikan di Go dan mapkan via file gqlgen.yml—dengan full type safety!


Kelebihan & Kekurangan gqlgen

KelebihanKekurangan
OtomatisasiCode selalu sync dengan schemaPerubahan schema → regenerate
Type SafetyDeteksi error di compile-timeBelajar schema-first
PerformanceNyaris zero overhead, tipe-nya Go nativeKonfigurasi awal agak detail
CommunityEkosistem luas, sering diupdateDokumentasi kadang belum update

Kesimpulan

gqlgen adalah game changer untuk developer Go yang ingin membangun layanan GraphQL tanpa harus menulis boilerplate tak berujung. Dengan pendekatan schema-first dan type-safe code generation, Anda bisa fokus ke logika bisnis dan refactor schema tanpa khawatir codebase berantakan.

Jika Anda mengutamakan maintainability dan type-safety, gqlgen adalah pilihan utama untuk membangun GraphQL API di Go.


Referensi


Saya harap tulisan ini memperjelas konsep gqlgen dan mengilustrasikan betapa powerful-nya code generation dalam ekosistem Go. Jangan ragu untuk diskusi atau sharing pengalaman di kolom komentar. 🚀

#gqlgen #graphql #golang #backenddevelopment

comments powered by Disqus