GoによるGraphQLの実装

8fb8810e5e06a997bc13831b9b51007f?s=47 keinuma
October 06, 2020

 GoによるGraphQLの実装

8fb8810e5e06a997bc13831b9b51007f?s=128

keinuma

October 06, 2020
Tweet

Transcript

  1. Go によるGraphQL の 2020/10/6 沼⽥ 1 / 39

  2. ⾃⼰ key value 前 ぬまた 業 エンジニア カミナシ JavaScript, Golang

    2 / 39
  3. アジェンダ . GraphQL . Go を使うメリット . GraphQL + Go

    の . gqlgen . gqlgen の 例 . まとめ 3 / 39
  4. GraphQL 4 / 39

  5. Facebook が開発したWeb API のための Alt REST API スキーマとクエリからなる 5 /

    39
  6. スキーマ データ、API のインターフェースを 義 Query が 照、Mutation が更 API 6

    / 39
  7. 7 / 39

  8. クエリ スキーマ 義をもとに 義 レスポンスに必 なデータを 択 8 / 39

  9. => 9 / 39

  10. GraphQL の 徴 エンドポイントが⼀つ (/graphql) API クライアント(GraphiQL )が提供されている スキーマ 義、

    が クエリの柔 性が い 10 / 39
  11. Go を使うメリット 11 / 39

  12. Go の構 体とGraphQL のスキーマをマッピング可 リゾルバーをダックタイピングで GraphQL の 性を構 する 12

    / 39
  13. GraphQL + Go の 13 / 39

  14. BaaS or 独⼒で BaaS はGraphQL のコア の が提供されている GraphQL の

    がシンプルな場 、BaaS がよさそう 14 / 39
  15. BaaS の例 AWS 提供のマネージドサービス DynamoDB, Lambda などAWS のサービスと できる Heroku

    +PostgresQL によるマネージドサービス データベースのテーブルを 義するとAPI を⽣成できる AppSync Hasura 15 / 39
  16. 独⼒で する場 スキーマファーストかコードファーストを 択 スキーマファースト クライアントとバックエンドの を並列に め やすい コードファースト

    開発フローが⼀ 向になる 16 / 39
  17. コードファーストのライブラリ スキーマとリゾルバーをコードで 現し、スキー マを ⼒ Go のstruct からスキーマを⽣成する graphql-go thunder

    17 / 39
  18. スキーマファースト のライブラリ ランタイム時にスキーマとコードをチェック CLI からスキーマをコードに graph-gophers/graphql-go gqlgen 18 / 39

  19. gqlgen 19 / 39

  20. gqlgen の使い スキーマを 義 gqlgen コマンドを ⾏ 20 / 39

  21. ⽣成されるファイル model.go : スキーマに 義されているデ ータファイル resolver.go: GraphQL の り

    にデータ をマッピング generated.go: リクエストパラメータか らモデルを⽣成( しない) 21 / 39
  22. gqlgen の利点 GraphQL のサポート範囲が い 型 ⾃動⽣成を利⽤しやすい 22 / 39

  23. GraphQL のサポート範囲が い 23 / 39

  24. 型 CLI ⾏時に型の 性を れる interface{} は発⽣しない 24 / 39

  25. ⾃動⽣成を利⽤しやすい スキーマとGo の がある場 は を埋めるた めのコードが ⼒される 25 /

    39
  26. Go のプロパティが不⾜している状 GraphQL type Todo { id: ID! text: String!

    done: Boolean! } Go type Todo struct { ID string Text string } 26 / 39
  27. コードに不⾜している Done を埋めるためのリゾルバーが ⼒される func (t *TodoResolver) Done(ctx context.Context //

    する panic("panic") } 27 / 39
  28. gqlgen の 例 28 / 39

  29. 使⽤技 API フレームワーク: echo ORM: GORM DB: MySQL サンプルリポジトリ 29

    / 39
  30. トピック ドメイン3 + GraphQL GraphQL のResolver をController にする スキーマとのマッピング 30

    / 39
  31. ドメイン3 + GraphQL model + service + repository model にドメインを

    service にロジックを repository はinterface のみ はinfra に 31 / 39
  32. API リクエスト時にController を ⾏ Presenter はResponse を⽣成 Repository はインターフェースのみ Infra

    でDB の処理を ⾏ 32 / 39
  33. Controller →Resolver Model →GraphQL Model 33 / 39

  34. のユースケース エラーハンドリング 34 / 39

  35. firebase auth を利⽤ echo のmiddleware でトークンの を ⾏ トークン 得

    はユーザー情 をResolver に して各API に している 35 / 39
  36. Schema にディレクティブを のチェック処理をディレクティブのResolver に する directive @hasRole(role: Role!) on FIELD_DEFINITION

    enum Role { ADMIN USER } 36 / 39
  37. エラーハンドリング Resolver のcontext に してエラーを めていく GraphQL はエラーコードを持たないので して する

    37 / 39
  38. エラーを するヘルパー func AddError(ctx context.Context) (bool, error) { graphql.AddError(ctx, &gqlerror.Error{

    Path: graphql.GetPath(ctx), Message: "A descriptive error message", Extensions: map[string]interface{}{ "code": "4", }, }) return false, gqlerror.Errorf("BOOM! Headshot") } 38 / 39
  39. まとめ GraphQL を するときはコードファーストかスキー マファーストを 択する gqlgen を利⽤して責 ごとに 離してGraphQL

    を で きる スキーマが になるとリゾルバーが肥⼤ しそう 39 / 39