😊

Go言語のgqlgenパッケージを使って、GraphQLに入門する

2025/02/23に公開

はじめに

Go言語のgalgenパッケージを使って、GraphQLに入門したので、ブログにまとめました。
https://github.com/99designs/gqlgenのQuick Startを見ながら、プロジェクトの作成からレスポンス取得までの流れを紹介します。


事前準備

1. プロジェクトを作成

ターミナルで以下を入力し、プロジェクトを初期化してください。

mkdir example
cd example
go mod init example

2. gqlgen のインストール

go get github.com/99designs/gqlgen

3. gqlgen の初期設定

以下の通りにtools.goを作成してください。

printf '//go:build tools\npackage tools\nimport (_ "github.com/99designs/gqlgen"\n _ "github.com/99designs/gqlgen/graphql/introspection")' | gofmt > tools.go
go mod tidy

続けて、初期化処理を実行してください。

go run github.com/99designs/gqlgen init
go mod tidy

GraphQL スキーマの確認

ここまでエラーが無ければ、以下のようなスキーマ定義ファイルが自動生成されていると思います。

schema {
  query: Query
}

type Query {
  hello: String!
  users: [User!]!
  user(id: ID!): User
}

type User {
  id: ID!
  name: String!
  email: String!
  posts: [Post!]!
}

type Post {
  id: ID!
  title: String!
  content: String!
}

gqlgenの自動コード生成

スキーマを定義したら、以下のコマンドでリゾルバの雛形を生成します。

go run github.com/99designs/gqlgen generate

GraphQL サーバーの実装

1. server.goの確認

ここまでエラーが無ければ、server.goが自動生成されていると思います。

server.goは GraphQL サーバーを起動するためのGo プログラムです。
このファイルは、GraphQL APIを実行するためのエントリーポイントになります。

package main

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

	"github.com/99designs/gqlgen/graphql/handler"
	"github.com/99designs/gqlgen/graphql/handler/extension"
	"github.com/99designs/gqlgen/graphql/handler/lru"
	"github.com/99designs/gqlgen/graphql/handler/transport"
	"github.com/99designs/gqlgen/graphql/playground"
	"github.com/vektah/gqlparser/v2/ast"
)

const defaultPort = "8080"

func main() {
	port := os.Getenv("PORT")
	if port == "" {
		port = defaultPort
	}

	srv := handler.New(graph.NewExecutableSchema(graph.Config{Resolvers: &graph.Resolver{}}))

	srv.AddTransport(transport.Options{})
	srv.AddTransport(transport.GET{})
	srv.AddTransport(transport.POST{})

	srv.SetQueryCache(lru.New[*ast.QueryDocument](1000))

	srv.Use(extension.Introspection{})
	srv.Use(extension.AutomaticPersistedQuery{
		Cache: lru.New[string](100),
	})

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

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


GraphQL のリゾルバを実装

ここまでエラーが無ければ、graph/schema.resolvers.goが自動生成されていると思います。
このファイルにGraphQLのレスポンスを生成するロジック(リゾルバ)を実装します。
ファイルの中身を以下に丸ごと置き換えてください。

package graph

// This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end.
// Code generated by github.com/99designs/gqlgen version v0.17.66

import (
	"context"
	"fmt"
	"example/graph/model"
)

// CreateTodo is the resolver for the createTodo field.
func (r *mutationResolver) CreateTodo(ctx context.Context, input model.NewTodo) (*model.Todo, error) {
	panic(fmt.Errorf("not implemented: CreateTodo - createTodo"))
}

// サンプルユーザー
var users = []*model.User{
	{ID: "1", Name: "Alice"},
	{ID: "2", Name: "Bob"},
}

// サンプル Todo
var todos = []*model.Todo{
	{ID: "101", Text: "Alice Todo", Done: false, User: users[0]},
	{ID: "102", Text: "Bob Todo", Done: true, User: users[1]},
}

// `todos`のリゾルバ(全てのTodoを取得)
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) {
	return todos, nil
}

// Mutation returns MutationResolver implementation.
func (r *Resolver) Mutation() MutationResolver { return &mutationResolver{r} }

// Query returns QueryResolver implementation.
func (r *Resolver) Query() QueryResolver { return &queryResolver{r} }

type mutationResolver struct{ *Resolver }
type queryResolver struct{ *Resolver }


動作確認

ターミナルを開き、以下を実行してください。

go run server.go

続けて、ブラウザでhttp://localhost:8080/にアクセスすると、以下のようなレスポンス動作確認用の画面が開きますので、ピンク色の実行ボタンを押下してください。

押下後、右側にサンプルデータがレスポンスとして表示されます。

おわりに

本記事では、レスポンスを取得する処理までを紹介しました。
別記事で、データの変更操作を行うmutationについて紹介しようと思います。

Discussion