무지개곰
article thumbnail
반응형

1. 목차

패키지 설치

yml 작성

schema 작성

생성 명령

resolver 작성


2. 패키지 설치

<bash />
go get -u github.com/99designs/gqlgen

3. yml 작성

<bash />
// 참고할 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

4. schema 작성

Query : 데이터를 읽는 요청

Mutation : 데이터를 변경하거나 조작하는 요청

Subscription : 실시간 정보 처리

예시

<go />
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! }

5. 생성 명령

<go />
go run github.com/99designs/gqlgen generate

6. resolver 작성

generate 명령 실행 시 생성되는 resolver 파일을 수정하여 비즈니스 로직 처리

6.1. Mutation

6.1.1. as-is

<go />
func (r *mutationResolver) SendMessage(ctx context.Context, content *string, mediaURL *string, mediaType *string) (*types.Message, error) { panic(fmt.Errorf("not implemented: SendMessage - sendMessage")) }

6.1.2. to-be

<go />
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: &timestamp, }, nil }

6.2. Subscription

6.2.1. as-is

<go />
func (r *subscriptionResolver) MessageSent(ctx context.Context) (<-chan *types.Message, error) { panic(fmt.Errorf("not implemented: MessageSent - MessageSent")) }

6.2.2. to-be

<go />
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 }

6.3. Z

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!