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.3k
GoによるGraphQLの実装
keinuma
October 06, 2020
Tweet
Share
More Decks by keinuma
See All by keinuma
品質と新規開発のバランス / Quality and new development
keinuma
0
2.4k
Firestoreを実装してみた話
keinuma
0
54
Flutter or React Native
keinuma
1
130
Atomic Design手法
keinuma
0
87
なぜAtomic Designが生まれたか
keinuma
0
85
Other Decks in Programming
See All in Programming
為你自己學 Python - 冷知識篇
eddie
1
350
print("Hello, World")
eddie
2
530
アセットのコンパイルについて
ojun9
0
130
MCPでVibe Working。そして、結局はContext Eng(略)/ Working with Vibe on MCP And Context Eng
rkaga
5
2.3k
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
3
310
Kiroで始めるAI-DLC
kaonash
2
620
AIでLINEスタンプを作ってみた
eycjur
1
230
MCPとデザインシステムに立脚したデザインと実装の融合
yukukotani
4
1.4k
OSS開発者という働き方
andpad
5
1.7k
@Environment(\.keyPath)那么好我不允许你们不知道! / atEnvironment keyPath is so good and you should know it!
lovee
0
120
🔨 小さなビルドシステムを作る
momeemt
4
690
Design Foundational Data Engineering Observability
sucitw
3
200
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Fireside Chat
paigeccino
39
3.6k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
The Straight Up "How To Draw Better" Workshop
denniskardys
236
140k
The Cult of Friendly URLs
andyhume
79
6.6k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
31
2.2k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
580
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.1k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
The Cost Of JavaScript in 2023
addyosmani
53
8.9k
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