6 Inisialisasi Proyek Go untuk GraphQL
6 Inisialisasi Proyek Go untuk GraphQL
GraphQL semakin banyak digunakan sebagai solusi API modern berkat fleksibilitas dan efisiensinya dalam pengambilan data. Go (Golang), dengan performanya yang impresif dan ekosistem tooling yang matang, menjadi salah satu bahasa favorit untuk membangun server GraphQL berskala produksi.
Namun, seperti banyak stack baru, memulai proyek GraphQL dengan Go bisa terasa overkill jika kita tidak tahu ekosistem tooling, konvensi struktur direktori, atau teknik dependency management yang tepat. Artikel ini akan membedah 6 langkah inisialisasi proyek Go untuk GraphQL—mulai dari setup project hingga API siap diuji.
1. Proyek Scaffolding dan Dependency Management
Langkah pertama adalah membuat struktur direktorium yang rapi dan menginisialisasi dependency management.
Struktur Direktori Dasar
1my-graphql-app/
2├── cmd/
3│ └── server/
4│ └── main.go
5├── internal/
6│ ├── graphql/
7│ └── model/
8├── go.mod
9└── go.sumInisialisasi Proyek dengan Go Modules
1go mod init github.com/username/my-graphql-appMenambah Dependency Minimum
Library populer untuk GraphQL di Go adalah 99designs/gqlgen
:
1go get github.com/99designs/gqlgenGqlgen menyediakan generator schema dan sangat memudahkan pembuatan resolvers maupun model.
Tabel: Perbandingan Library GraphQL di Go
| Library | Kelebihan | Kekurangan |
|---|---|---|
| gqlgen | Otomatisasi schema & typegen | Perlu konfigurasi ekstra |
| graphql-go | Lightweight, simple API | Kurang fitur advanced |
| thunder-graphql | Integrasi dengan database | Komunitas kecil |
2. Definisikan Skema GraphQL (schema.graphqls)
GraphQL bersifat “schema-first”, jadi mulailah dengan mendefinisikan skema:
Contoh schema.graphqls
1type User {
2 id: ID!
3 name: String!
4 email: String!
5}
6
7type Query {
8 users: [User!]!
9 user(id: ID!): User
10}Struktur File:
1internal/graphql/
2└── schema.graphqlsDalam desain nyata, skema sebaiknya modular agar mudah scaling: misal user.graphqls, product.graphqls, dst.
3. Generate Model & Resolver dengan Gqlgen
Setelah schema siap, jalankan generator gqlgen yang akan membuat file blueprint dasar Go:
1go run github.com/99designs/gqlgen generateHasilnya:
1internal/graphql/
2├── generated.go
3├── models_gen.go
4├── resolver.go
5└── schema.resolvers.gogenerated.go: kode auto-generate yang merepresentasikan semua operasi GraphQL.models_gen.go: struct Go hasil kompilasi dari definisi di schema.resolver.godanschema.resolvers.go: tempat implementasi business logic.
4. Implementasi Resolver
Resolver adalah “jantung” server GraphQL—tempat setiap query, mutation, dan subscription dieksekusi.
Contoh Implementasi Query Resolver
1// internal/graphql/resolver.go
2package graphql
3
4type Resolver struct {
5 users []*model.User
6}
7
8// internal/graphql/schema.resolvers.go
9func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) {
10 return r.Resolver.users, nil
11}
12
13func (r *queryResolver) User(ctx context.Context, id string) (*model.User, error) {
14 for _, user := range r.Resolver.users {
15 if user.ID == id {
16 return user, nil
17 }
18 }
19 return nil, nil
20}Simulasi Response Request
Query:
1{ 2 users { 3 id 4 name 5 email 6 } 7}Response:
1{ 2 "data": { 3 "users": [ 4 {"id": "1", "name": "Andi", "email": "andi@domain.com"}, 5 {"id": "2", "name": "Budi", "email": "budi@domain.com"} 6 ] 7 } 8}
5. Setup Server dan Routing
Agar server bisa diakses, setup HTTP handler. Biasanya, mux populer seperti net/http atau chi
digunakan.
Contoh Minimal Server
1// cmd/server/main.go
2package main
3
4import (
5 "log"
6 "net/http"
7 "github.com/99designs/gqlgen/graphql/handler"
8 "github.com/99designs/gqlgen/graphql/playground"
9 "github.com/username/my-graphql-app/internal/graphql"
10)
11
12func main() {
13 srv := handler.NewDefaultServer(graphql.NewExecutableSchema(graphql.Config{Resolvers: &graphql.Resolver{}}))
14
15 http.Handle("/graphql", srv)
16 http.Handle("/", playground.Handler("GraphQL playground", "/graphql"))
17
18 log.Println("Server started at http://localhost:8080/")
19 log.Fatal(http.ListenAndServe(":8080", nil))
20}Akses ke GraphQL Playground dapat dicapai pada http://localhost:8080/.
6. Menyiapkan Konfigurasi dan Environment
Pemisahan konfigurasi membuat sistem lebih scalable dan mudah deployment ke berbagai environment (dev, staging, prod).
Standard: Gunakan .env untuk environment variable
Install package loader seperti godotenv :
1go get github.com/joho/godotenvContoh Penggunaan
1import "github.com/joho/godotenv"
2
3func init() {
4 godotenv.Load() // akan membaca file .env pada root project
5}.env Example
1PORT=8080
2DATABASE_URL=postgres://user:pass@localhost:5432/dbnameAlur Inisialisasi Proyek GraphQL Go
Mari kita visualisasikan dengan diagram mermaid:
flowchart TD
A[Mulai] --> B[Inisialisasi Go Modules]
B --> C[Buat struktur direktori]
C --> D[Definisikan schema GraphQL]
D --> E[Generate code dengan gqlgen]
E --> F[Implementasi resolver]
F --> G[Setup server HTTP]
G --> H[Konfigurasi environment]
H --> I[Selesai]
Kesimpulan
Inisialisasi proyek Go untuk GraphQL sangat straightforward bila mengikuti 6 langkah berikut:
- Scaffolding & Dependency: Menyusun struktur folder dan install dependency.
- Schema: Mendesain schema awal sesuai kebutuhan aplikasi.
- Auto Generate Model & Resolver: Menggunakan gqlgen untuk men-generate kode boilerplate.
- Implementasi Resolver: Mengkodekan logic query/mutation sesuai kebutuhan.
- Server: Setup router dan server HTTP agar GraphQL terexpose.
- Konfigurasi: Manage konfigurasi lingkungan lewat environment variables.
Dengan runtime Go yang efisien, schema statis yang type-safe, deployment mudah, serta tooling mature, stack ini menjadi salah satu pilihan andalan untuk backend modern berbasis GraphQL.
Sudah siap mencoba stack ini di proyek Anda berikutnya?
Referensi Tambahan
Jika ada pertanyaan atau pengalaman lain seputar inisialisasi proyek GraphQL dengan Go, jangan ragu untuk berbagi di komentar!