무지개곰
article thumbnail
반응형

목차

패키지 설치

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

반응형
profile

무지개곰

@무지개곰

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