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:
| Library | Pendekatan | Type Safety | Otomasi Kode | Popularitas |
|---|---|---|---|---|
| gqlgen | Schema-first | ✔️ | ✔️ | ⭐⭐⭐⭐⭐ |
| graphql-go | Code-first | ❌ | ❌ | ⭐⭐⭐ |
| ent+entgql | Code/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]
- Anda menulis schema di
schema.graphql. - Perintah
gqlgen generatemenghasilkan kode Go dan “stub” untuk setiap resolver. - Anda melengkapi fungsi resolver sesuai kebutuhan bisnis.
- 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:
1mkdir bookapi-gql && cd bookapi-gql
2go mod init bookapi-gql
3go get github.com/99designs/gqlgenInisialisasi struktur project gqlgen:
1go run github.com/99designs/gqlgen initAkan terbuat beberapa file penting:
schema.graphqlsresolver.gogenerated.go, dsb.
2. Definisikan Schema
Edit schema.graphqls:
1type Book {
2 id: ID!
3 title: String!
4 author: String!
5}
6
7type Query {
8 books: [Book!]!
9 book(id: ID!): Book
10}
11
12type Mutation {
13 addBook(title: String!, author: String!): Book!
14}3. Generate Kode
Jalankan:
1go run github.com/99designs/gqlgen generateIni akan menghasilkan stub handler di resolver.go, model di model/models_gen.go, dan kode GraphQL lainnya.
4. Lengkapi Resolver
Edit resolver.go
1package graph
2
3import (
4 "bookapi-gql/graph/model"
5 "context"
6 "strconv"
7)
8
9// Simulasi database in-memory
10var books = []*model.Book{
11 {ID: "1", Title: "Clean Code", Author: "Robert C. Martin"},
12 {ID: "2", Title: "The Pragmatic Programmer", Author: "Andy Hunt"},
13}
14
15// Query Resolver Implementation
16func (r *queryResolver) Books(ctx context.Context) ([]*model.Book, error) {
17 return books, nil
18}
19
20func (r *queryResolver) Book(ctx context.Context, id string) (*model.Book, error) {
21 for _, book := range books {
22 if book.ID == id {
23 return book, nil
24 }
25 }
26 return nil, nil
27}
28
29// Mutation Resolver Implementation
30func (r *mutationResolver) AddBook(ctx context.Context, title string, author string) (*model.Book, error) {
31 id := strconv.Itoa(len(books) + 1)
32 book := &model.Book{ID: id, Title: title, Author: author}
33 books = append(books, book)
34 return book, nil
35}5. Konfigurasikan Server
Biasanya file starter server.go sudah ada:
1package main
2
3import (
4 "log"
5 "net/http"
6 "os"
7
8 "bookapi-gql/graph"
9 "bookapi-gql/graph/generated"
10
11 "github.com/99designs/gqlgen/graphql/handler"
12 "github.com/99designs/gqlgen/graphql/playground"
13)
14
15func main() {
16 srv := handler.NewDefaultServer(generated.NewExecutableSchema(generated.Config{Resolvers: &graph.Resolver{}}))
17
18 http.Handle("/", playground.Handler("GraphQL playground", "/query"))
19 http.Handle("/query", srv)
20
21 log.Printf("connect to http://localhost:8080/ for GraphQL playground")
22 log.Fatal(http.ListenAndServe(":8080", nil))
23}Jalankan server:
1go run .Simulasi Operasi
Dengan Playground di http://localhost:8080/, coba operasi berikut:
Query Semua Buku
1query {
2 books {
3 id
4 title
5 author
6 }
7}Response:
1{
2 "data": {
3 "books": [
4 {"id": "1", "title": "Clean Code", "author": "Robert C. Martin"},
5 {"id": "2", "title": "The Pragmatic Programmer", "author": "Andy Hunt"}
6 ]
7 }
8}Mutation Tambah Buku
1mutation {
2 addBook(title: "Go in Action", author: "William Kennedy") {
3 id
4 title
5 author
6 }
7}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:
1scalar DateTime
2
3directive @auth(role: String) on FIELD_DEFINITIONKonfigurasikan di Go dan mapkan via file gqlgen.yml—dengan full type safety!
Kelebihan & Kekurangan gqlgen
| Kelebihan | Kekurangan | |
|---|---|---|
| Otomatisasi | Code selalu sync dengan schema | Perubahan schema → regenerate |
| Type Safety | Deteksi error di compile-time | Belajar schema-first |
| Performance | Nyaris zero overhead, tipe-nya Go native | Konfigurasi awal agak detail |
| Community | Ekosistem luas, sering diupdate | Dokumentasi 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.
Referensi
#gqlgen #graphql #golang #backenddevelopment