105 Cara Mengatur `gqlgen.yml` untuk Kustomisasi
105 Cara Mengatur gqlgen.yml untuk Kustomisasi
Golang telah lama jadi primadona backend berkat performanya yang kencang dan ekosistem tooling-nya yang terus berkembang. Salah satunya, untuk membuat GraphQL server di Go, kita punya gqlgen
— framework yang powerful dan banyak digunakan. Tapi tahukah kamu, kekuatan sebenarnya dari gqlgen justru ada dalam file konfigurasinya, gqlgen.yml?
Pada artikel ini, saya akan membedah 105 cara untuk mengatur gqlgen.yml, mulai dari yang paling esensial sampai hacky tweaks untuk production-ready GraphQL API-mu. Lengkap dengan contoh kode, mini-simulasi, hingga diagram flow dengan Mermaid. Siap? Mari kita eksplorasi gqlgen.yml seperti engineer profesional!
Apa Itu gqlgen.yml?
Sebelum ke 105 customizations, kita refresh dulu apa itu file config ini:
- letak: biasanya di root project.
- fungsi: mendefinisikan schema path, tempat resolver, mapping type, hooks, plugins, dan berbagai tweak lain.
Contoh paling dasar gqlgen.yml:
1# gqlgen.yml
2schema:
3 - graph/schema.graphqls
4
5exec:
6 filename: graph/generated/generated.go
7 package: generated
8
9model:
10 filename: graph/model/models_gen.go
11 package: model
12
13resolver:
14 layout: follow-schema
15 dir: graph/resolver
16 package: resolverMengatur schema dan Directory Structure
Cara #1-#5
Schema Path Tunggal
Langsung tunjuk file master schema:1schema: 2 - graph/schema.graphqlsMultiple Schema Files
Pisah per modul/microservice:1schema: 2 - graph/user/schema.graphqls 3 - graph/product/schema.graphqlsGlobbing Schema Files
Otomasi load seluruh schema di folder:1schema: 2 - "graph/**/*.graphqls"Schema dengan Preprocessing
Bisa diubah manual sebelum generate.Versioning Schema
Pisahkan per versi jika API-mu versioned.
Custom File dan Package Output
Cara #6-#15
| Setting | Fungsi | Contoh |
|---|---|---|
exec | File generated Go | exec: {filename: graph/generated/generated.go} |
model | File model type Go | model: {filename: graph/model/models_gen.go} |
resolver | Resolver directory | resolver: {dir: graph/resolver} |
Kamu juga bisa custom package name agar lebih idiomatic.
1exec:
2 filename: internal/graph/gen.go
3 package: graphgen
4
5model:
6 filename: internal/graph/model.go
7 package: graphmodelType Mapping (models dan bindings)
Cara #16-#25
Ini bagian paling powerful!
Mapping Tipe GraphQL ke Struct Go
Misal, schema:
1scalar DateTime
2type User {
3 id: ID!
4 createdAt: DateTime!
5}Mappingnya:
1models:
2 DateTime:
3 model:
4 - github.com/yourapp/pkg/datetime.TimeBeberapa opsi mapping:
model: ganti type yang digunakanbind: map ke type yang diimport saat scan inputfield: mapping per field
Opsional: Kamu juga bisa set kustom untuk array/matrix type.
Custom Unmarshal/Marshal untuk Scalar
Cara #26-#30
Default scalar hanya diproses otomatis. Untuk scalar custom, wajib buat Marshaller-Unmarshaller.
Misal mapping ke time.Time:
1models:
2 DateTime:
3 model: time.Time
4 marshal: github.com/yourapp/pkg/datetime.MarshalDateTime
5 unmarshal: github.com/yourapp/pkg/datetime.UnmarshalDateTimeMenentukan Resolver Layouts
Cara #31-#35
1resolver:
2 layout: follow-schema
3 dir: graph/resolver
4 package: resolverOpsi layout:
- follow-schema: Per-type per-file (paling populer)
- single-file: Semua resolver dalam satu file
- custom: Path bebas yang kamu tentukan sendiri
Memakai Plugin Custom
Cara #36-#40
gqlgen mendukung plugin third-party untuk enhance kode yang dihasilkan:
Misalnya, plugin untuk open-tracing, error-wrapping, atau codegen yang kompatibel GraphQL Federation.
1plugins:
2 - name: github.com/99designs/gqlgen/plugin/federationScalar dan Directive Hooks
Cara #41-#55
Tambahkan hooks custom saat proses parsing:
1directives:
2 upper:
3 implementation: github.com/yourapp/graph/directives.UpperCase
4 location: FIELD_DEFINITIONCustom scalar hooks juga bisa tambahkan validator atau sanitizer ke custom scalar.
Tag Struct kustom (JSON/DB/CustomTag)
Cara #56-#65
Kadang, field pada GraphQL butuh tag struct berbeda di Go.
Tambahkan mapping tag lewat config:
1# Membuat custom tag JSON
2models:
3 User:
4 fields:
5 email:
6 tag: json:"email,omitempty" db:"email_column"Tag Yang Sama untuk Semua Model
Cara #66-#69
1struct_tag: json1struct_tag: json,dbGenerate Interfaces
Cara #70-#75
Untuk schema Polymorphic, gunakan mapping ke Go interface:
1models:
2 Animal:
3 model: github.com/yourapp/graph/model.AnimalOpsi Kustom Null
Cara #76-#80
Default gqlgen pakai pointer *T untuk nullables. Bisa diubah ke null.String, dsb:
1models:
2 String:
3 model: github.com/guregu/null.StringField Mapping ke Field Berbeda
Cara #81-#90
Misal schema:
1type Product {
2 id: ID!
3 productName: String!
4}Struct Go berbeda nama field:
1type Product struct {
2 ID string
3 NameOfProduct string
4}Konfigurasikan mapping-nya:
1models:
2 Product:
3 fields:
4 productName:
5 resolver: true
6 goField: NameOfProductDisable/Enable Output Artifacts
Cara #91-#95
Atur artifact apa saja yang di-generate lewat flag/konfigurasi file:
1omit_getters: true
2omit_resolver_interface: falseEnable Resolver Methods Only
Cara #96-#99
Mengurangi kode, generate hanya bagian resolver:
1resolver:
2 only: trueTesting: Generate Mock
Cara #100-#102
Gqlgen bisa generate mock untuk resolver, sangat handy saat unit test!
1generate:
2 mocks: trueEnvironment dan Path Relatif
Cara #103-#104
Bisa pakai env var (misal saat CI/CD):
1schema:
2 - ${SCHEMA_PATH}Watch Mode Auto Reload
Cara #105
Aktifkan live watch untuk ui atau service development:
1gqlgen generate --watchSimulasi — Pipeline Codegen
Di bawah, contoh flow codegen dengan diagram Mermaid:
flowchart TD
A[Update gqlgen.yml]
B[Schema diubah]
C[Run gqlgen generate]
D[Generated Go Code Update]
A-->C
B-->C
C-->D
Rangkuman
Seperti yang kamu bisa lihat, gqlgen.yml bukan cuma file template biasa.
Dari mapping custom type, scalar, plugins, rapid testing, hingga custom kode layout, semuanya dibikin flexible.
Dengan 105 metode di atas, kamu bisa kustomisasi GraphQL API-mu sesuai kebutuhan perusahaan, skala, bahkan cara kerja timmu sendiri. Jangan ragu eksperimen — dan eksplorasi lebih lanjut lewat dokumentasi.
Jika ada tips kustomisasi yang belum saya bahas, share di kolom komentar ya!
Menulis config dengan benar = menghasilkan kode backend yang bersih, terstruktur, dan hemat waktu.
#HappyCoding! 🚀