27.2. 프로그램언어 고(Go)의 GraphQL API 개발 방법

프로그램언어 고(Go)에서의 GraphQL 스키마 정의 방법

Go언어에서 GraphQL 스키마를 정의하는 방법은 주로 gqlgen이라는 라이브러리를 사용합니다.


import "github.com/99designs/gqlgen"

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

type Query {
  users: [User!]!
}

schema {
  query: Query
}

위 예제코드에서 보시다시피, Go언어 내부에서 직접 User, Query 등의 타입을 정의하고 schema블록 안에서 query 타입을 연결합니다.

gqlgen 라이브러리가 이 스키마 정의를 파싱해서 GraphQL 서버를 구동합니다.

주요 구성 요소 설명드리겠습니다.

– User, Query : GraphQL 오브젝트 타입 정의
– id, name, age : User 타입의 필드 정의
– users : Query 타입의 필드, 반환 타입이 [User!]! 로 User array
– ! : 필수 필드를 나타냅니다
– schema : query 엔트리 포인트 정의

이렇게 정의된 스키마를 바탕으로 gqlgen이 GraphQL 서버 코드를 자동 생성해줍니다.

resolver 함수만 구현하면 서버 개발을 마칠 수 있습니다.

편리한 스키마 기반 개발이 가능한 것이 장점입니다.

이해를 돕기 위해 추가 설명 드렸습니다. 부족한 점 있다면 양해 바랍니다.

프로그램언어 고(Go)에서의 Resolver 함수 작성 방법

프로그램언어 고(Go)에서 Resolver 함수를 작성하는 방법에 대해 친절하고 쉽게 설명드리겠습니다.

Resolver 함수는 고(Go) 프로그램에서 다른 패키지나 라이브러리를 사용할 때 참조해야 하는 함수입니다. 이 함수에서 해당 패키지나 라이브러리를 초기화하고 사용할 준비를 합니다.

예를 들어 MySQL 데이터베이스를 사용한다고 가정해보겠습니다.


import (
    "database/sql"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    db, err := sql.Open("mysql", "user:password@/dbname")
    // ...
}

위와 같이 sql 패키지를 import 했지만, 실제 MySQL 드라이버를 초기화하는 코드가 없습니다.
이 경우에 Resolver 함수를 사용하여 MySQL 드라이버를 초기화해주어야 합니다.


func init() {
    sql.Register("mysql", &MySQLDriver{})
}

type MySQLDriver struct{}

func (d *MySQLDriver) Open(name string) (driver.Conn, error) {
    // MySQL 연결을 위한 코드
    // ...

    return conn, nil 
}

init() 함수에서 sql.Register를 호출하여 “mysql”이라는 이름으로 MySQLDriver 구조체를 등록합니다.
이로써 sql.Open에서 “mysql” 이름을 전달받으면 MySQLDriver의 Open 메서드를 호출하게 됩니다.

Open 메서드 내에서 실제 MySQL 데이터베이스 연결을 수행하는 코드를 작성합니다.
성공하면 database/sql 패키지가 요구하는 인터페이스를 만족하는 driver.Conn을 반환합니다.

이렇게 Resolver 함수를 작성하고 등록해주면 sql 패키지가 특정 데이터베이스와의 연결을 위임받아 처리할 수 있습니다.
필요한 드라이버들은 init() 함수 내에서 미리 등록해주는 방식으로 동작합니다.

Resolver 방식은 고(Go)에서 의존성 주입(Dependency Injection)을 구현하는 주요한 기법 중 하나입니다.
sql 패키지는 데이터베이스에 종속되지 않고, 초기화 코드를 분리함으로써 확장성과 유연성을 높일 수 있습니다.

소스 코드들은 주석을 통해 동작 방식을 자세히 설명하고 있으니 참고해 주시기 바랍니다.
더 궁금한 점이 있으시면 언제든 질문 주세요. !

프로그램언어 고(Go)에서의 GraphQL 요청 처리 방법

Go에서 GraphQL 요청을 처리하는 방법은 주로 gqlgen이라는 GraphQL 서버 라이브러리를 사용합니다.


import (
    "github.com/99designs/gqlgen"
)

func main() {
    srv := handler.NewDefaultServer(generated.NewExecutableSchema(Config{Resolvers: &resolvers{}}))
    http.ListenAndServe(":8080", srv)
}

type Query {
    users: [User!]!
}

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

type resolvers struct{}

func (*resolvers) Users() []User {
    return users // 获取用户列表
}

gqlgen 라이브러리를 사용하면 GraphQL 스키마 정의와 리졸버 함수를 통해 요청을 처리할 수 있습니다.

예를 들어 위 코드에서 Query 타입에 users 필드를 정의하고, 리졸버에서 Users 함수를 구현하면 해당 GraphQL 요청을 처리할 수 있습니다.

리졸버 함수의 반환 값은 GraphQL 응답의 데이터가 됩니다. 주의할 점은 타입 정의와 일치하는 데이터를 반환해야 합니다.

gqlgen은 코드 생성기능도 가지고 있어서 타입安全한 코드를 작성할 수 있도록 도와줍니다.

이외에도 context 设置, 인증, 오류처리 등 다양한 기능을 제공하므로 GraphQL 서버를 구축하기에 용이합니다.

예제는 간단한 사용 예시이구요. 실제 프로덕션에서는 더 많은 처리와 복잡한 로직이 필요할 것 입니다.

지금 설명드린 내용으로 Go에서 GraphQL 서버 만드는 개략적인 방법을 이해하실 수 있으실 것 같습니다. 다른 궁금한 점은 언제든 질문 주세요. 최대한 자세히 답변 드리겠습니다.

프로그램언어 고(Go)에서의 GraphQL mutation 구현 방법

프로그램언어 고(Go)에서 GraphQL mutation을 구현하는 방법에 대해 친절하고 쉽게 설명드리겠습니다.

GraphQL mutation은 데이터를 변경하는 기능을 수행합니다. 고(Go)에서 GraphQL mutation을 구현하기 위해서는 우선 GraphQL 서버를 구축해야 합니다. 대표적인 Go GraphQL 서버로 GQLGen, gqlgen, graphene이 있습니다.

여기서는 gqlgen을 사용한다고 가정하고 설명드리겠습니다. gqlgen을 사용하면 쉽게 GraphQL 서버를 구축할 수 있습니다.


type Mutation {
  createTodo(text: String!): Todo
}

type Todo {
  id: ID!
  text: String!
  done: Boolean!
}

위 코드와 같이 schema에 mutation을 정의합니다. createTodo mutation은 text 입력을 받아서 새로운 Todo 객체를 반환하는 기능을 수행합니다.

그리고 resolver 함수를 구현합니다. resolver 함수가 mutation을 처리하는 로직을 담당합니다.


func (r *mutationResolver) CreateTodo(ctx context.Context, text string) (*model.Todo, error) {
  // Todo 객체를 데이터베이스에 저장 
  // 저장된 Todo 객체를 반환
}

위 코드와 같이 CreateTodo resolver 함수를 구현하여 text 입력값으로 실제 Todo 데이터를 생성하고 반환하는 로직을 작성합니다.

마지막으로 graphql 패키지의 Handler에서 schema와 resolver를 등록하면 mutation 기능이 활성화되어 사용할 수 있습니다.


func graphqlHandler() http.Handler {
  srv := handler.NewDefaultServer(NewExecutableSchema(Config{Resolvers: &Resolver{}}))
  srv.Use(&debug.Tracer{})
  return srv
}

이상과 같이 schema 정의, resolver 함수 구현, handler 등록의 단계를 통해 고(Go)에서 GraphQL mutation을 구현할 수 있습니다. 주석이나 추가적인 설명은 생략하였습니다. 이해에 도움이 되었기를 바랍니다.

프로그램언어 고(Go)에서의 GraphQL API 테스트 방법

Go에서 GraphQL API를 테스트하는 방법은 다음과 같습니다.

먼저 GraphQL 서버를 구현하고, 테스트를 위한 resolver 함수들을 정의합니다.


package main

import "github.com/graphql-go/graphql"

var userType = graphql.NewObject(
    graphql.ObjectConfig{
        Name: "User",
        Fields: graphql.Fields{
            "id": &graphql.Field{
                Type: graphql.String,
            },
            "name": &graphql.Field{
                Type: graphql.String,
            },
        },
    },
)

var rootQuery = graphql.NewObject(
    graphql.ObjectConfig{
        Name: "RootQuery",
        Fields: graphql.Fields{
            "user": &graphql.Field{
                Type: userType,
                Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                    // resolver 로직
                    return map[string]interface{}{"id": "1", "name": "John"}, nil
                },
            },
        },
    },
)

func main() {
    schema, _ := graphql.NewSchema(
        graphql.SchemaConfig{
            Query: rootQuery,
        },
    )
}

이러한 GraphQL 서버를 구현하고 나면, 실제 API 요청을 테스트해볼 수 있습니다.

Go에서 GraphQL API 테스트를 위한 대표적인 라이브러리로 graphql-test-http를 사용할 수 있습니다.


import (
    "testing"

    "github.com/graphql-go/graphql/testutil"
)

func TestGraphQLAPI(t *testing.T) {
    query := `
        query {
            user {
                id
                name
            }
        }
    `

    expected := &graphql.Result{
        Data: map[string]interface{}{
            "user": map[string]interface{}{
                "id": "1",
                "name": "John",
            },
        },
    }

    testutil.TestGraphQLQuery(schema, query, expected, t)
}

이 코드는 schema를 기반으로 해당 GraphQL 서버에 테스트 쿼리를 보내고 기대한 결과와 실제 결과를 비교하여 테스트를 수행합니다.

query 변수에 GraphQL 쿼리를 문자열로 작성하고, expected 변수에 기대하는 결과를 명시합니다.

그리고 testutil.TestGraphQLQuery 함수를 사용하여 실제 서버에 요청을 보내 테스트를 진행합니다.

이를 통해 Go로 구현한 GraphQL API 서버의 동작을 쉽고 편리하게 테스트할 수 있습니다.

주요 유의 사항으로는 schema와 resolver 함수들을 실제 서비스 코드와 분리하여 테스트 전용으로 구현하는 것이 좋다는 점입니다.

서비스 코드와의 의존성을 줄이기 위함인데, 이를 통해 보다 독립적인 테스트가 가능합니다.

이 외에도 다양한 mock 구현 방법이 있으므로 GraphQL 테스트 시에 참고하시기 바랍니다.

이상으로 Go에서의 GraphQL API 테스트 방법에 대한 설명을 마치겠습니다.

더 궁금하신 점이 있으시면 말씀해 주십시오. 최선을 다해 도와드리겠습니다.

Leave a Comment