Vue.jsで作ったカレンダーアプリのバックエンドをGoとGraphQLで実装してみた。
以前に個人開発でGo、gorm、ginを使ってRESTのAPIサーバを作ったことがありkonnkaimoORマッパーにはgormを使ったので前回との差分はGraphQLくらい。
GoでのGraphQLのセットアップ
gqlgenと言うライブラリを使って実装を進めた。
概ね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もう少し書きたい。