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
3.4k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GoによるGraphQLの実装
keinuma
October 06, 2020
More Decks by keinuma
See All by keinuma
品質と新規開発のバランス / Quality and new development
keinuma
0
2.4k
Firestoreを実装してみた話
keinuma
0
61
Flutter or React Native
keinuma
1
140
Atomic Design手法
keinuma
0
94
なぜAtomic Designが生まれたか
keinuma
0
91
Other Decks in Programming
See All in Programming
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
210
さぁV100、メモリをお食べ・・・
nilpe
0
130
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
160
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
560
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
660
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.6k
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
380
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
180
Webフレームワークの ベンチマークについて
yusukebe
0
160
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
330
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
210
Featured
See All Featured
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
420
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
770
Raft: Consensus for Rubyists
vanstee
141
7.5k
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.9k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
140
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
380
How to Think Like a Performance Engineer
csswizardry
28
2.6k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
Building Applications with DynamoDB
mza
96
7.1k
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