yikegaya’s blog

仕事関連(Webエンジニア)と資産運用について書いてます

GoとGraphQLでカレンダーアプリのサーバサイドを実装した

Vue.jsで作ったカレンダーアプリのバックエンドをGoとGraphQLで実装してみた。

github.com

以前に個人開発でGo、gorm、ginを使ってRESTのAPIサーバを作ったことがありkonnkaimoORマッパーにはgormを使ったので前回との差分はGraphQLくらい。

github.com

GoでのGraphQLのセットアップ

gqlgenと言うライブラリを使って実装を進めた。

github.com

概ねREADMEに書いてある通りにコマンドを叩いてセットアップ

go get github.com/99designs/gqlgen

go run github.com/99designs/gqlgen init

initコマンドでrails newとかnuxt create appみたいな感じで必要なフォルダが自動生成される。

後は

schema.graphqlsにクエリで使うスキーマを定義 →gqlgen generate →schema.resolvers.goにクエリの中で実行する処理を実装

と言う流れで開発していく。

予定登録での実装例

1 schema.graphqlに以下定義

type Schedule {
  id: Int
  userId: Int
  title: String
  content: String
  memo: String
    start_at: String
    end_at: String
}

input NewSchedule {
  userId: Int
  title: String
  content: String
  memo: String
    start_at: String
    end_at: String
}

type Query {
  schedules(userId: Int): [Schedule]
}

type Mutation {
  createSchedule(input: NewSchedule!): Schedule!
}

2 gqlgen generate実行

graph以下のファイルがschema定義に沿って自動生成/更新される

3 graph/schema.resolvers.goの編集

func (r *queryResolver) Schedules(ctx context.Context, userID *int) ([]*model.Schedule, error) {
    var schedules []*model.Schedule
    db, err = infrastructure.GetDB()
    if err = db.Where("user_id = ?", userID).Find(&schedules).Error; err != nil {
        return nil, err
    }
    return schedules, nil
}

func (r *mutationResolver) CreateSchedule(ctx context.Context, input model.NewSchedule) (*model.Schedule, error) {
    schedule := &model.Schedule{
        Title:   input.Title,
        Content: input.Content,
        Memo:    input.Memo,
        StartAt: input.StartAt,
        EndAt:   input.EndAt,
        UserID:  input.UserID,
    }
    db, err = infrastructure.GetDB()

    if err = db.Create(&schedule).Error; err != nil {
        return nil, err
    }

    return schedule, nil
}

トップ画面から確認

ブラウザでアクセスするとエディタでクエリを書いて実行確認できる。これはcurlやフロントエンドのコードいちいち書いてデバッグするより全然快適

感想

とりあえず簡単なqueryとmutationを実行するところまではできたけど複雑な用件出てきたときにGraphQLで対応できるかはまだ微妙。ただ学習コストそこまで高くはなさそうで軽い気持ちでRESTの代わりに採用しても割となんとか使えんじゃないかな。

セットアップはschema定義→コマンド叩く流れでサクサク作れていい感じだったけどこうやってschema定義→gqlgenでコード自動生成って流れはこのライブラリ固有の独特な流れなのかな?他の環境でもGraphQLサーバ作ってみないといまいちそこはわからん。。

後普段スクリプトばっか書いてるからまだGoがサクサク使えない感じある。Goもう少し書きたい。