Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
GoによるGraphQLの実装
Search
keinuma
October 06, 2020
Programming
0
3.2k
GoによるGraphQLの実装
keinuma
October 06, 2020
Tweet
Share
More Decks by keinuma
See All by keinuma
品質と新規開発のバランス / Quality and new development
keinuma
0
2.3k
Firestoreを実装してみた話
keinuma
0
53
Flutter or React Native
keinuma
1
120
Atomic Design手法
keinuma
0
81
なぜAtomic Designが生まれたか
keinuma
0
84
Other Decks in Programming
See All in Programming
Cloudflare Realtime と Workers でつくるサーバーレス WebRTC
nekoya3
0
370
SODA - FACT BOOK
sodainc
1
680
Agent Rules as Domain Parser
yodakeisuke
1
510
Babylon.js 8.0のアプデ情報を 軽率にキャッチアップ / catch-up-babylonjs-8
drumath2237
0
120
iOSアプリ開発で 関数型プログラミングを実現する The Composable Architectureの紹介
yimajo
2
200
プロダクト開発でも使おう 関数のオーバーロード
yoiwamoto
0
140
Effect の双対、Coeffect
yukikurage
4
1.3k
セキュリティマネジャー廃止とクラウドネイティブ型サンドボックス活用
kazumura
1
160
漸進。
ssssota
0
1.7k
赤裸々に公開。 TSKaigiのオフシーズン
takezoux2
0
110
衛星の軌道をWeb地図上に表示する
sankichi92
0
260
FastMCPでMCPサーバー/クライアントを構築してみる
ttnyt8701
2
130
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
A Tale of Four Properties
chriscoyier
159
23k
The Language of Interfaces
destraynor
158
25k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
14
1.5k
Done Done
chrislema
184
16k
The Art of Programming - Codeland 2020
erikaheidi
54
13k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Designing Experiences People Love
moore
142
24k
Optimising Largest Contentful Paint
csswizardry
37
3.3k
Building Applications with DynamoDB
mza
95
6.4k
Practical Orchestrator
shlominoach
188
11k
Transcript
Go によるGraphQL の 2020/10/6 沼⽥ 1 / 39
⾃⼰ key value 前 ぬまた 業 エンジニア カミナシ JavaScript, Golang
2 / 39
アジェンダ . GraphQL . Go を使うメリット . GraphQL + Go
の . gqlgen . gqlgen の 例 . まとめ 3 / 39
GraphQL 4 / 39
Facebook が開発したWeb API のための Alt REST API スキーマとクエリからなる 5 /
39
スキーマ データ、API のインターフェースを 義 Query が 照、Mutation が更 API 6
/ 39
7 / 39
クエリ スキーマ 義をもとに 義 レスポンスに必 なデータを 択 8 / 39
=> 9 / 39
GraphQL の 徴 エンドポイントが⼀つ (/graphql) API クライアント(GraphiQL )が提供されている スキーマ 義、
が クエリの柔 性が い 10 / 39
Go を使うメリット 11 / 39
Go の構 体とGraphQL のスキーマをマッピング可 リゾルバーをダックタイピングで GraphQL の 性を構 する 12
/ 39
GraphQL + Go の 13 / 39
BaaS or 独⼒で BaaS はGraphQL のコア の が提供されている GraphQL の
がシンプルな場 、BaaS がよさそう 14 / 39
BaaS の例 AWS 提供のマネージドサービス DynamoDB, Lambda などAWS のサービスと できる Heroku
+PostgresQL によるマネージドサービス データベースのテーブルを 義するとAPI を⽣成できる AppSync Hasura 15 / 39
独⼒で する場 スキーマファーストかコードファーストを 択 スキーマファースト クライアントとバックエンドの を並列に め やすい コードファースト
開発フローが⼀ 向になる 16 / 39
コードファーストのライブラリ スキーマとリゾルバーをコードで 現し、スキー マを ⼒ Go のstruct からスキーマを⽣成する graphql-go thunder
17 / 39
スキーマファースト のライブラリ ランタイム時にスキーマとコードをチェック CLI からスキーマをコードに graph-gophers/graphql-go gqlgen 18 / 39
gqlgen 19 / 39
gqlgen の使い スキーマを 義 gqlgen コマンドを ⾏ 20 / 39
⽣成されるファイル model.go : スキーマに 義されているデ ータファイル resolver.go: GraphQL の り
にデータ をマッピング generated.go: リクエストパラメータか らモデルを⽣成( しない) 21 / 39
gqlgen の利点 GraphQL のサポート範囲が い 型 ⾃動⽣成を利⽤しやすい 22 / 39
GraphQL のサポート範囲が い 23 / 39
型 CLI ⾏時に型の 性を れる interface{} は発⽣しない 24 / 39
⾃動⽣成を利⽤しやすい スキーマとGo の がある場 は を埋めるた めのコードが ⼒される 25 /
39
Go のプロパティが不⾜している状 GraphQL type Todo { id: ID! text: String!
done: Boolean! } Go type Todo struct { ID string Text string } 26 / 39
コードに不⾜している Done を埋めるためのリゾルバーが ⼒される func (t *TodoResolver) Done(ctx context.Context //
する panic("panic") } 27 / 39
gqlgen の 例 28 / 39
使⽤技 API フレームワーク: echo ORM: GORM DB: MySQL サンプルリポジトリ 29
/ 39
トピック ドメイン3 + GraphQL GraphQL のResolver をController にする スキーマとのマッピング 30
/ 39
ドメイン3 + GraphQL model + service + repository model にドメインを
service にロジックを repository はinterface のみ はinfra に 31 / 39
API リクエスト時にController を ⾏ Presenter はResponse を⽣成 Repository はインターフェースのみ Infra
でDB の処理を ⾏ 32 / 39
Controller →Resolver Model →GraphQL Model 33 / 39
のユースケース エラーハンドリング 34 / 39
firebase auth を利⽤ echo のmiddleware でトークンの を ⾏ トークン 得
はユーザー情 をResolver に して各API に している 35 / 39
Schema にディレクティブを のチェック処理をディレクティブのResolver に する directive @hasRole(role: Role!) on FIELD_DEFINITION
enum Role { ADMIN USER } 36 / 39
エラーハンドリング Resolver のcontext に してエラーを めていく GraphQL はエラーコードを持たないので して する
37 / 39
エラーを するヘルパー 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
まとめ GraphQL を するときはコードファーストかスキー マファーストを 択する gqlgen を利⽤して責 ごとに 離してGraphQL
を で きる スキーマが になるとリゾルバーが肥⼤ しそう 39 / 39