본문 바로가기
golang

[golang] gqlgen을 사용하여 golang graphql 서버 구축하기(3)

by devjh 2022. 12. 8.
반응형

이번 게시글에서는 resolver 작성방법과 데이터를 질의하는 방법에 대해 정리합니다.

 

소스코드는 아래의 github 레포에서 확인할 수 있습니다(example-2 브랜치)

 

GitHub - jaeho310/golang-graphql-sample

Contribute to jaeho310/golang-graphql-sample development by creating an account on GitHub.

github.com

 

1. 패키지 구조

.
|   go.mod
|   go.sum
|   gqlgen.yml
|   main.go
|   tools.go
|
+---generated
|       generated.go
|
+---graphql
|       user.graphql
|
ㄴ---resolver
    |   resolver.go
    |   user.resolvers.go
    |
    ㄴ---types
            types.go

 

2. resolver란

api 코드레벨의 시작점으로 기존 프레임워크들의 controller, router, handler 와 비슷한 성격을 갖습니다.

지난 게시글까지 잘 따라하셨다면 resolver/user.resolvers.go 에서 로직을 작성하시면 됩니다.

 

3. resolver/types.types.go

// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.

package types

type CreateUserInput struct {
	Name string `json:"name"`
}

type User struct {
	ID   string `json:"id"`
	Name string `json:"name"`
}

type UserList struct {
	List []*User `json:"list"`
}

gqlgen이 graphql/user.graphql에 정의한 스키마를 기반으로 struct를 구축해줬습니다.

해당 타입으로 request가 들어오고 response를 내려줘야 합니다.

 

 

2. resolver/user.resolvers.go

package resolver

// 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.21 DO NOT EDIT.

import (
	"context"
	"fmt"
	"graphql-sample/generated"
	"graphql-sample/resolver/types"
)

// CreateUser is the resolver for the create_user field.
func (r *mutationResolver) CreateUser(ctx context.Context, input types.CreateUserInput) (*types.User, error) {
	panic(fmt.Errorf("not implemented: CreateUser - create_user"))
}

// UserList is the resolver for the user_list field.
func (r *queryResolver) UserList(ctx context.Context) (*types.UserList, error) {
	var list []*types.User
	list = append(list, &types.User{ID: "1", Name: "Tom"})
	list = append(list, &types.User{ID: "2", Name: "John"})
	return &types.UserList{List: list}, nil
}

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

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

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

 

UserList라는 메서드의 몸체를 작성합니다.

gqlgen이 만들어준 types.UserList의 형태로 return해주시면 됩니다.

임시로 가짜 데이터를 만들어 내려주겠습니다.

 

3. 실행 및 확인

서버를 실행한 뒤 playground에 접근하면 데이터를 질의할 수 있습니다.

아래의 가이드를 따라 데이터를 질의해봅니다.

type User {
  id: ID!
  name: String!
}

type UserList {
  list: [User!]!
}

type Query {
  user_list: UserList!
}

(1). 최상단에는 query, mutation, subscription등 gql의 요청단위의 종류를 입력해줍니다.

(2). query의 종류인 user_list를 질의해주고, list 안에 id, name을 질의합니다.

(3). 스키마를 정의할때 적어놓은 느낌표는 not null을 의미합니다. graphql은 클라이언트가 원하는 데이터만 질의해갈 수 있지만 현재는 모두 필수 영역이므로 모두 질의해줍니다.

query {
  user_list {
    list {
      id
      name
    }
  }
}

 

4. 확인

다음 게시글에서는 gorm과 sqlite3를 사용하며 아키텍쳐를 구상하고 실제 데이터를 저장 해보겠습니다.

반응형

댓글