Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GoによるGraphQLの実装

keinuma
October 06, 2020

 GoによるGraphQLの実装

keinuma

October 06, 2020
Tweet

More Decks by keinuma

Other Decks in Programming

Transcript

  1. Go
    によるGraphQL

    2020/10/6
    沼⽥
    1 / 39

    View Slide

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

    View Slide

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

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

    View Slide

  4. GraphQL
    4 / 39

    View Slide

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

    View Slide

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

    View Slide

  7. 7 / 39

    View Slide

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

    View Slide

  9. =>
    9 / 39

    View Slide

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

    View Slide

  11. Go
    を使うメリット
    11 / 39

    View Slide

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

    View Slide

  13. GraphQL + Go

    13 / 39

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. gqlgen
    19 / 39

    View Slide

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

    View Slide

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

    View Slide

  22. gqlgen
    の利点
    GraphQL
    のサポート範囲が い

    ⾃動⽣成を利⽤しやすい
    22 / 39

    View Slide

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

    View Slide


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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  28. gqlgen
    の 例
    28 / 39

    View Slide

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

    View Slide

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

    View Slide

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

    31 / 39

    View Slide

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

    View Slide

  33. Controller
    →Resolver
    Model
    →GraphQL Model
    33 / 39

    View Slide

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

    View Slide

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

    View Slide

  36. Schema
    にディレクティブを
    のチェック処理をディレクティブのResolver

    する
    directive @hasRole(role: Role!) on FIELD_DEFINITION
    enum Role {
    ADMIN
    USER
    }
    36 / 39

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide