tutorial

7 Instalasi Library graphql-go dan Dependensi Tambahan

7 Instalasi Library graphql-go dan Dependensi Tambahan

Oleh: [Nama Anda], Engineer Backend

GraphQL telah menjadi salah satu standar baru dalam mendesain API modern. Salah satu library yang cukup populer untuk mengimplementasikan GraphQL di Go (Golang) adalah graphql-go. Jika Anda baru memulai, artikel ini akan memandu Anda langkah demi langkah menginstalasi library graphql-go beserta dependensi tambahan yang sering digunakan dalam proyek nyata. Saya akan lengkapi juga dengan contoh kode, simulasi, serta diagram alur untuk memperjelas proses integrasi.


1. Persiapkan Lingkungan Go

Pastikan Anda sudah menginstal Go. Minimal versi 1.16. Periksa dengan:

go version

Bila belum ada, instalasi bisa dilakukan dari https://golang.org/dl/.


2. Inisialisasi Project Baru

Kita akan memakai Go modules untuk mengelola dependensi. Buat folder projek baru dan inisialisasi modules:

mkdir graphql-tutorial
cd graphql-tutorial
go mod init github.com/yourusername/graphql-tutorial

3. Instalasi Library Utama: graphql-go

graphql-go adalah engine utama GraphQL di Go. Install dengan perintah:

go get github.com/graph-gophers/graphql-go
go get github.com/graph-gophers/graphql-go/relay

Ini akan menambahkan library graphql-go di go.mod.

Penjelasan Singkat Komponen:

LibraryFungsi Utama
github.com/graph-gophers/graphql-goParser dan executor query schema GraphQL
github.com/graph-gophers/graphql-go/relayHandler HTTP untuk endpoint GraphQL

4. Pendukung Routing: chi

Sebenarnya, Anda bisa memakai http.ServeMux. Namun, dalam aplikasi nyata, package router seperti chi sering digunakan.

go get github.com/go-chi/chi/v5

Contoh Integrasi Routing:

import (
    "net/http"
    "github.com/go-chi/chi/v5"
)

func main() {
    r := chi.NewRouter()
    r.Post("/query", relayHandler) // relayHandler nanti kita definisikan
    http.ListenAndServe(":8080", r)
}

5. Dependensi JSON: graphql-go-tools / Encoding

Library graphql-go tidak melakukan encoding/decoding JSON response secara otomatis. Kita akan memakai encoding bawaan Go (encoding/json), namun library pendamping sering digunakan juga, misal graphql-go-tools.

go get github.com/wundergraph/graphql-go-tools

Tapi untuk permulaan, cukup encoding/json.


6. Dependency Injection & Middleware

Supaya kode tetap modular dan testable, direkomendasikan menggunakan dependency injection, misal google/wire, dan middleware seperti alice.

go get github.com/justinas/alice
go get github.com/google/wire

7. Logging: zerolog

Logging sangat esensial. Salah satu library logging modern adalah zerolog.

go get github.com/rs/zerolog/log

Simulasi: Setup Endpoint GraphQL Sederhana

Struktur Sederhana Project:

graph TD
    A[main.go] --> B[chi router]
    B --> C[GraphQL Schema]
    C --> D[Resolver]
    D -->|handle| E[relay.Handler]

Contoh Skema dan Resolver:

File: schema.graphql

type Query {
    hello: String!
}

File: main.go

package main

import (
    "context"
    "embed"
    "net/http"
    "github.com/go-chi/chi/v5"
    "github.com/graph-gophers/graphql-go"
    "github.com/graph-gophers/graphql-go/relay"
    "github.com/rs/zerolog/log"
)

//go:embed schema.graphql
var sdl embed.FS

type resolver struct{}

func (r *resolver) Hello() string {
    log.Info().Msg("handling hello query")
    return "Hello, graphql-go!"
}

func main() {
    schemaStr, _ := sdl.ReadFile("schema.graphql")
    schema := graphql.MustParseSchema(string(schemaStr), &resolver{})

    r := chi.NewRouter()
    // Middleware logging
    r.Use(func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
            log.Info().Msgf("Request: %s %s", req.Method, req.URL.Path)
            next.ServeHTTP(w, req)
        })
    })

    r.Post("/query", (&relay.Handler{Schema: schema}).ServeHTTP)
    log.Info().Msg("GraphQL server started at :8080")
    http.ListenAndServe(":8080", r)
}

Coba Query via cURL:

curl -X POST -d '{"query": "{ hello }"}' -H "Content-Type: application/json" localhost:8080/query

Output:

{"data":{"hello":"Hello, graphql-go!"}}

Ringkasan Tabel Dependensi

NoLibraryKeteranganContoh Penggunaan
1graphql-goEngine GraphQL utamaDesain schema & proses query
2graphql-go/relayHTTP Handler GraphQLEndpoint /query
3go-chi/chiRouter ringan & modularRouting endpoint
4encoding/jsonEn/decoding JSONParsel response
5zerologLogging modern & ringanLog query/request/error
6justinas/aliceMiddleware chainingAuth/logging wrapper
7google/wireDependency injectionModularisasi resolver

Diagram Alur End-to-End

sequenceDiagram
    participant C as Client
    participant S as Web Server
    participant G as GraphQL Handler
    
    C->>S: POST /query { query }
    S->>G: Parse and Validate Query
    G->>G: Execute Resolver Function
    G->>S: GraphQL Response JSON
    S->>C: Response (data/error)

Penutup

Menginstal dan men-setup library GraphQL di Go membutuhkan pemahaman komponen-karena arsitekturnya sangat modular. Dengan kombinasi graphql-go, chi, dan zerolog yang tepat, Anda dapat menjalankan server GraphQL production-grade, sekaligus mudah dipelihara dan di-scale. Selanjutnya, pengembangan bisa ditingkatkan dengan integrasi authentication, batching, dan custom directive.

Jangan ragu melakukan eksperimen dengan dependensi lain sesuai kebutuhan projek Anda. Semoga artikel ini menjadi pijakan Anda membangun GraphQL API Go yang andal.


Referensi

Happy Coding! 🚀

comments powered by Disqus