반응형
목차
패키지 설치
yml 작성
schema 작성
생성 명령
resolver 작성
패키지 설치
go get -u github.com/99designs/gqlgen
yml 작성
// 참고할 schema 파일 지정
schema:
- graph/*.graphqls
// gqlgen이 실행 사능한 GraphQL 핸들러 코드 생성 설정
exec:
// package 명
package: graph
// 생성된 실행 파일의 경로 지정
filename: graph/generated.go
// GraphQL 스키마에서 정의된 타입 구현 설정
model:
// 모델 파일 저장 경로
filename: resolver/types/types.go
// 모델 파일 패키지 이름
package: types
// 요청을 처리하는 비즈니스 로직
resolver:
layout: follow-schema
dir: resolver
package: resolver
models:
ID:
model:
- github.com/99designs/gqlgen/graphql.ID
- github.com/99designs/gqlgen/graphql.Int
- github.com/99designs/gqlgen/graphql.Int64
- github.com/99designs/gqlgen/graphql.Int32
UUID:
model:
- github.com/99designs/gqlgen/graphql.UUID
Int:
model:
- github.com/99designs/gqlgen/graphql.Int32
Int64:
model:
- github.com/99designs/gqlgen/graphql.Int
- github.com/99designs/gqlgen/graphql.Int64
schema 작성
Query : 데이터를 읽는 요청
Mutation : 데이터를 변경하거나 조작하는 요청
Subscription : 실시간 정보 처리
예시
type Message {
id: ID!
content: String
mediaURL: String
mediaType: String
timestamp: String
}
type Query {
messages: [Message!]!
}
type Mutation {
sendMessage(content: String, mediaURL: String, mediaType: String): Message!
}
type Subscription {
messageSent: Message!
}
생성 명령
go run github.com/99designs/gqlgen generate
resolver 작성
generate 명령 실행 시 생성되는 resolver 파일을 수정하여 비즈니스 로직 처리
Mutation
as-is
func (r *mutationResolver) SendMessage(ctx context.Context, content *string, mediaURL *string, mediaType *string) (*types.Message, error) {
panic(fmt.Errorf("not implemented: SendMessage - sendMessage"))
}
to-be
func (r *mutationResolver) SendMessage(ctx context.Context, content *string, mediaURL *string, mediaType *string) (*types.Message, error) {
fmt.Println("테스트 테스트")
timestamp := time.Now().Format(time.RFC3339)
return &types.Message{
ID: "1",
Content: content,
MediaURL: mediaURL,
MediaType: mediaType,
Timestamp: ×tamp,
}, nil
}
Subscription
as-is
func (r *subscriptionResolver) MessageSent(ctx context.Context) (<-chan *types.Message, error) {
panic(fmt.Errorf("not implemented: MessageSent - MessageSent"))
}
to-be
func (r *subscriptionResolver) MessageSent(ctx context.Context) (<-chan *types.Message, error) {
// 채널을 반환하여 구독자가 메시지를 실시간으로 받을 수 있게 합니다.
subscriptionChannel := make(chan *types.Message)
// 구독 종료 시 채널을 닫도록 처리
go func() {
<-ctx.Done()
Log.Infof("메세지 구독 종료\n")
close(subscriptionChannel)
}()
// 메시지가 messageChannel로부터 수신될 때마다 구독자 채널로 전달
go func() {
for message := range messageChannel {
subscriptionChannel <- message
}
}()
return subscriptionChannel, nil
}
Z
반응형
'Go language' 카테고리의 다른 글
[Go] Go 서버를 통하여 Mysql 사용하기 (go-sql-driver) (0) | 2023.09.17 |
---|---|
[Go] cookie와 session 다루기 (0) | 2023.09.14 |
[Go] 웹 서버 테스트하기 (net/http/httptest 패키지) (0) | 2023.09.13 |
[Go] 테스트 코드 작성하기 (테스트, 벤치마크) (0) | 2023.09.13 |
[Go] 데이터 압축하기 (compress/gzip 사용하기) (0) | 2023.09.11 |