Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

アジェンダ . GraphQL . Go を使うメリット . GraphQL + Go の . gqlgen . gqlgen の 例 . まとめ 3 / 39

Slide 4

Slide 4 text

GraphQL 4 / 39

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

7 / 39

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

=> 9 / 39

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Go を使うメリット 11 / 39

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

GraphQL + Go の 13 / 39

Slide 14

Slide 14 text

BaaS or 独⼒で BaaS はGraphQL のコア の が提供されている GraphQL の がシンプルな場 、BaaS がよさそう 14 / 39

Slide 15

Slide 15 text

BaaS の例 AWS 提供のマネージドサービス DynamoDB, Lambda などAWS のサービスと できる Heroku +PostgresQL によるマネージドサービス データベースのテーブルを 義するとAPI を⽣成できる AppSync Hasura 15 / 39

Slide 16

Slide 16 text

独⼒で する場 スキーマファーストかコードファーストを 択 スキーマファースト クライアントとバックエンドの を並列に め やすい コードファースト 開発フローが⼀ 向になる 16 / 39

Slide 17

Slide 17 text

コードファーストのライブラリ スキーマとリゾルバーをコードで 現し、スキー マを ⼒ Go のstruct からスキーマを⽣成する graphql-go thunder 17 / 39

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

gqlgen 19 / 39

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

⽣成されるファイル model.go : スキーマに 義されているデ ータファイル resolver.go: GraphQL の り にデータ をマッピング generated.go: リクエストパラメータか らモデルを⽣成( しない) 21 / 39

Slide 22

Slide 22 text

gqlgen の利点 GraphQL のサポート範囲が い 型 ⾃動⽣成を利⽤しやすい 22 / 39

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Go のプロパティが不⾜している状 GraphQL type Todo { id: ID! text: String! done: Boolean! } Go type Todo struct { ID string Text string } 26 / 39

Slide 27

Slide 27 text

コードに不⾜している Done を埋めるためのリゾルバーが ⼒される func (t *TodoResolver) Done(ctx context.Context // する panic("panic") } 27 / 39

Slide 28

Slide 28 text

gqlgen の 例 28 / 39

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

ドメイン3 + GraphQL model + service + repository model にドメインを service にロジックを repository はinterface のみ はinfra に 31 / 39

Slide 32

Slide 32 text

API リクエスト時にController を ⾏ Presenter はResponse を⽣成 Repository はインターフェースのみ Infra でDB の処理を ⾏ 32 / 39

Slide 33

Slide 33 text

Controller →Resolver Model →GraphQL Model 33 / 39

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

firebase auth を利⽤ echo のmiddleware でトークンの を ⾏ トークン 得 はユーザー情 をResolver に して各API に している 35 / 39

Slide 36

Slide 36 text

Schema にディレクティブを のチェック処理をディレクティブのResolver に する directive @hasRole(role: Role!) on FIELD_DEFINITION enum Role { ADMIN USER } 36 / 39

Slide 37

Slide 37 text

エラーハンドリング Resolver のcontext に してエラーを めていく GraphQL はエラーコードを持たないので して する 37 / 39

Slide 38

Slide 38 text

エラーを するヘルパー 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

Slide 39

Slide 39 text

まとめ GraphQL を するときはコードファーストかスキー マファーストを 択する gqlgen を利⽤して責 ごとに 離してGraphQL を で きる スキーマが になるとリゾルバーが肥⼤ しそう 39 / 39