GraphQL을 이용한 서비스를 계획하며 연습했던 Todo 중 중요한 부분을 정리한 것입니다.

이 글은 GraphQL서버를 Go 언어로 구현하여 Postgre와의 간단하게 연동하는것을 목표로 합니다.

구성도

https://i1.wp.com/hazle.info/wp-content/uploads/2018/12/todo-diagram.jpeg?w=900

DB 마이그레이션

데이터베이스를 쿼리를 사용하지 않고 코드와의 연동을 위하여 ORM을 사용합니다.

프로젝트에 사용된 ORM은 go-pg 입니다.

// 모델 정의
type Default struct {  
   ID        int64              `json:"id,omitempty"`  
  CreatedAt time.Time   `sql:"default:now()"`  
  DeletedAt time.Time   `pg:",soft_delete"`  
  UpdatedAt time.Time  
}

type Todo struct {  
   tableName struct{}   `sql:"todo" json"omitempty"`
  Default  
  Todo     string           `json:"todo"`
  Priority int64            `json:"priority"`
}

......

// 테이블 생성 
err := db.CreateTable(model, orm.CreateTableOptions{  
    FKConstraints: true,  
})

GraphQL 패키지 설치

다음줄을 실행하여 GraphQL Go 패키지를 설치합니다.

go get github.com/graphql-go/graphql

패키지에 대한 더 많은 정보는 프로젝트의 GitHub페이지에서 얻을수 있습니다.

GraphQL 타입 정의

ORM을 사용하면 모델과 데이터베이스를 맵핑하여 사용할수 있었습니다. 하지만 GraphQL 패키지는 ORM과는 다르게 사용하려면 GraphQL에서 사용할 타입(필드)을 정의해줘야 합니다.

func (*Todo) GrapqlType() *graphql.Object {  
   return graphql.NewObject(graphql.ObjectConfig{  
      Name: "Todo",  
      Fields: graphql.Fields{  
         "id": graphql.Field{  
              Type: graphql.String,  
          },  
          "todo": graphql.Field{  
              Type: graphql.String,  
          },  
          "priority": graphql.Field{  
              Type: graphql.String,  
          },  
      },  
  })  
}