이번 게시글에서는 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를 사용하며 아키텍쳐를 구상하고 실제 데이터를 저장 해보겠습니다.
'golang' 카테고리의 다른 글
[golang] echo framework와 jwt (0) | 2023.01.21 |
---|---|
[golang] gqlgen을 사용하여 golang graphql 서버 구축하기(마무리) (0) | 2022.12.10 |
[golang] gqlgen을 사용하여 golang graphql 서버 구축하기(2) (0) | 2022.12.07 |
[golang] gqlgen을 사용하여 golang graphql 서버 구축하기(1) (0) | 2022.12.07 |
[golang] 맥북 m1칩에서 golang 크로스 컴파일 이슈 해결 방법 (0) | 2022.10.13 |
댓글