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サーバを立てるぞ! / Building GraphQL server b...
Search
Masahiro Wakame
August 10, 2018
Technology
4.9k
15
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GoでGraphQLサーバを立てるぞ! / Building GraphQL server by go
mercari.go #2 登壇資料です
https://mercari.connpass.com/event/95665/
Masahiro Wakame
August 10, 2018
More Decks by Masahiro Wakame
See All by Masahiro Wakame
社内フレームワークとその依存性解決 / in-house framework and its dependency management
vvakame
1
760
DatastoreからSpannerに 移行したいぞ途中編 / migrate Datastore to Spanner in progress
vvakame
0
1.3k
Google Cloud Next 2019 わくわく報告会 / Google Cloud Next 2019 WakuWaku Report
vvakame
1
460
メルカリ社員100人に聞いたGoLandの使い方 / JetBrains Night Tokyo 2018
vvakame
27
13k
OSS入門 世界に参加する最初のひと押し / OSS first step
vvakame
7
770
GCP Compute 概要と選定 / DevFest Tokyo 2018
vvakame
13
1.7k
『Re:VIEW+CSS組版やっていき』を やった話とWebエンジニアが期待する未来 / CSS Publishinng for Web Developers
vvakame
3
9.2k
go.mercari.io/datastore はいいぞ! / go.mercari.io/datastore is pretty good!
vvakame
4
1.2k
最強のDatastoreライブラリを作った / golang.tokyo #11
vvakame
3
13k
Other Decks in Technology
See All in Technology
マルチアカウント環境での コーディングエージェントを使った障害調査が大変なので AIエージェントにReadOnly権限を付与してみた / ReadOnly AI Agents for Multi-Account AWS Incident Response
yamaguchitk333
2
110
人材育成分科会.pdf
_awache
4
250
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
190
「エンジニア進化論」2028年の開発完全自動化、エンジニアはどう進化するか
cyberagentdevelopers
PRO
6
5.2k
エンジニアリング戦略の作り方 / Crafting Engineering Strategy
iwashi86
21
6.9k
2026TECHFRESH畢業分享會 - AI 時代的人生存檔點
line_developers_tw
PRO
0
1k
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
2
380
FinOps × AIエージェントで実現する コストインシデントの自動調査
oasis1994liveforever
0
140
小さくはじめるSLI/SLO ~育てながら組織に定着させる実践知~ / Starting Small with SLI/SLOs: Building Adoption Through Continuous Growth
nari_ex
7
1.9k
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1k
AIの性能が向上しても未解決な組織の重大問題は何か?/An Unsolved Organizational Problem in the Age of AI
moriyuya
4
670
Bedrock AgentCore RuntimeでAuth0 Changelog調査AIをアップグレードした話
t5u8a5a
1
150
Featured
See All Featured
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
200
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
140
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
310
It's Worth the Effort
3n
188
29k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Skip the Path - Find Your Career Trail
mkilby
1
150
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
620
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Why Our Code Smells
bkeepers
PRO
340
58k
Transcript
GoͰGraphQLαʔόΛཱͯΔͧʂ mercari.go #2 Θ͔Ί ·͞ͻΖ #mercarigo bit.ly/2vyiluP
Θ͔Ί ·͞ͻΖ @v vakame Masahiro Wakame GAE/Go TypeScript ٕज़ॻయ
TL;DR •GraphQLͬͯԿʁ •GitHub v4 APIΛ৮ͬͯΈΔ •github.com/99designs/gqlgen •ઃܭϕετϓϥΫςΟε ΫϥΠΞϯτͷ͠ͳ͍
GraphQLͬͯԿʁ ࡉ͔͍͜ͱ ࠷ޙͷࢀߟࢿྉूͰʂ
GraphQLͬͯԿʁ •Facebook͕2015ʹެ։༷ͨ͠ •άϥϑߏʹର͢ΔQuery Language •༑ୡͷ༑ୡΛ5ਓͣͭऔಘ͢Δͱ͔ •Client→Serverͷσʔλཁٻ࣌ʹ͏
GraphQLͬͯԿʁ RESTͳΒ3RPCඞཁ GraphQLͳΒ1ճ { circle(id: "Q2lyY2xlRXhoaWJpdEluZm86MTIzNAo") { name spaces penName
webSiteURL genre genreFreeFormat products(first: 9) { pageInfo { hasNextPage endCursor } nodes { name description type page price relatedURLs firstAppearanceEventName firstAtTechBookFest images { url height width } } } loginUserChecked { checked } } }
େࣄͳ͜ͱ •ΘΓͱ੍͋Δ (N+1ରࡦͱ͔) •ແݶʹૣ͘ͳ͍ •REST APIͷ্ҐޓͰͳ͍ •ࠩҟΛΑ͘ཧղ͠Α͏
ϝϧΧϦͰͬͯΔʁ •C Sπʔϧ PHP+webonyx/graphql-php •US ϝϧΧϦWeb ??? •MicroserviceԽ CSπʔϧ Go+gqlgen
•ϝϧΧϦWeb Node.js+Apollo •ϝϧϖΠ CSπʔϧ(ݕ౼த) Go+gqlgen ٕज़ॻయWeb࣮ݧதͰ͢
ClientͷྲྀΕ •·ͣSchema(+αʔό)͕͋Δ •ͦ͜ʹOperationΛ͛Δ •Query, Mutation, Subscribe ͷ3छ •ཁٻͨ͠௨ΓͷܗࣜͰσʔλདྷΔ
Queryͷྫ { viewer { id login name location bio company
repositoriesContributedTo(first: 2) { nodes { owner { login } name } } } } { "data": { "viewer": { "id": "MDQ6VXNlcjEyNTMzMg==", "login": "vvakame", "name": "Masahiro Wakame", "location": "Tokyo, Japan", "bio": "TypeScript and GAE/Go", "company": "Merpay, Inc.", "repositoriesContributedTo": { "nodes": [ { "owner": { "login": "mruby" }, "name": "mruby" }, { "owner": { "login": "DefinitelyTyped" }, "name": "DefinitelyTyped" } ] } } } } ରԠͨ͠ߏ͕ฦΔ
ClientͷྲྀΕ •ͭ·Γ… •ΫΤϦʹΑͬͯಘΒΕΔσʔλ͕มΘΔ •ΫΤϦݸผʹฦΓͷσʔλͷܕཉ͍͠ •→ݴޠʹΑ͍ͬͯͮΒ͍Մೳੑʁ ·͊JSͱ૬ੑྑͦ͞͏ͳͷΘ͔Δ
ͬ͘͟ΓServerݪཧ •Query͕དྷΔ •ฦ͢σʔλTreeߏʹͳΔ •Treeͷઅ(ͱ͔)ຖʹResolverΛఆٛ͢Δ •Resolver͕ཁٻ͞ΕͨNodeΛੜ͠ฦ͢ •Resolverͷू߹ == αʔόͷ࣮
ͬ͘͟ΓServerݪཧ type ResolverRoot interface { Query() QueryResolver User() UserResolver CircleExhibitInfo()
CircleExhibitInfoResolver ProductInfo() ProductInfoResolver } type QueryResolver interface { Circle(ctx context.Context, id string) (*CircleExhibitInfo, } type CircleExhibitInfoResolver interface { ID(ctx context.Context, obj *CircleExhibitInfo) (string, err Products(ctx context.Context, obj *CircleExhibitInfo, first } type ProductInfoResolver interface { ID(ctx context.Context, obj *ProductInfo) (string, error) Images(ctx context.Context, obj *ProductInfo) ([]Image, erro } query { circle(id: "Q2lyY2xlRXhoaWJpdEluZm86MTIzNAo") { name spaces penName webSiteURL genre genreFreeFormat products(first: 9) { pageInfo { hasNextPage endCursor } nodes { name description type page price relatedURLs firstAppearanceEventName firstAtTechBookFest images { url height width } } } loginUserChecked { checked } }
ͬ͘͟ΓServerݪཧ Resolverͷू߹ ʹ αʔόͷ࣮
͖͜͜ •୯ҰΤϯυϙΠϯτ •Introspection •SchemaΛΔʹGraphQL͕͑Δ •ڧ͍ܕ͚ʂ
GitHub v4 APIΛ৮Δ
৮Γ·͠ΐ͏ •developer.github.com/v4/explorer/ •GraphiQLʹ৮ΕΔ •GitHubͷߟ͑ͨ࠷ڧͷઃܭʹ৮ΕΔ •͋ΘΑͬͯ͘ΈΔ
σϞ •ϩάΠϯϢʔβͷ໊લग़͢ •ҙͷϦϙδτϦ͕࡞ΒΕͨग़͢ •GraphQLʹؔ࿈ͷ͋ΔUserΛநग़͢Δ
ίʔυ͔Β •దʹPOST͢Δ͚ͩ •Authorization: bearer ${PersonalAccessToken} •https://api.github.com/graphql •https://github.com/settings/tokens bit.ly/2Oo8DlD
github.com/99designs/gqlgen I’m committer!
ͳͥGoͳͷ͔ʁ •Go͍͠ฒߦॲཧ؆୯ͩ͠ •Microservice܈͕GoͳͷͰ…ʂ •GAE/GoͰಈ͘ͷͰ…ʂ •ࣾʹPHPNode.js͍·͢ •Frontend Engineer
GoओཁϥΠϒϥϦൺֱ •github.com/graph-gophers/graphql-go •github.com/graphql-go/graphql •github.com/samsarahq/thunder •github.com/99designs/gqlgen
GoओཁϥΠϒϥϦൺֱ •github.com/graph-gophers/graphql-go •github.com/graphql-go/graphql •github.com/samsarahq/thunder •github.com/99designs/gqlgen ػೳ͕ͪΐͬͱශऑ GoͷίʔυͰSchemaॻ͖ͨ͘ͳ͍ ಉ্ ΘΓͱྑͦ͞͏ʁ
ͳͥgqlgen͔ʁ •ϘΠϥʔϓϨʔτݏʂ •શίʔυੜݏʂ •ίʔυੜ+खॻ͖ΛఔΑ͘… •ΑΖ͍͠ͳΒgqlgenͩʂ
gqlgenྑ͍ͷ͔ʁ ྑ͘͠·ͨ͠❤ Ͱcommitterʹͳͬͨ
gqlgenͷαϙʔτൣғ •Query •Mutation •Subscription •Directive •import syntax •type extend ͋Δ
΄͍͠ ͦͷ͏ͪΓ·͢ committer͔ͩΒͶ
σϞ •gqlgen init ͯ͠ΈΔ •มߋΛՃ͑ͯΈΔ •gqlgen gen ͯ͠ΈΔ •࣮ࡍʹୟ͍ͯΈΔ ࣌ؒ…͋Δʁ
gqlgen.com/ getting-started/
ύʔπͷղઆ •Resolver •Directive •Middleware •ErrorPresenter
ύʔπͷղઆ •Resolver •Directive •Middleware •ErrorPresenter ੜ͞Εͨinterface࣮ͯ͠ʂ ੜ͞ΕͨDirectiveʹ࣮Λ༩͑ͯʂ దʹϩΪϯάͱ͔ʹ͑·͢ ΤϥʔͷΧελϚΠζͰ͖·͢ gitter.im/gqlgen/Lobby
gqlgen.com
Middleware •ResolverMiddleware •Resolverͷಈ࡞લޙʹॲཧΛڬΉ •RequestMiddleware •Req,RespʹॲཧΛڬΉ(ओʹϩΪϯά) bit.ly/2MmjbEE
ઃܭϕετϓϥΫςΟε ຊʹϕετ͔͠ΒΜʂ
RelayΛษڧ͢͠ •RelayΛ࠾༻͠ͳͯ͘ษڧͯ͠ •Server͚ͩߟ͑ΔͱΠϛϑͳ༷͕͋Δ •ओʹFragmentपΓ •UIଆΛඒ͘͠ઃܭ͢ΔͨΊ TSαϙʔτ͖ͨ github.com/facebook/relay/pull/2293
RelayΛษڧ͢͠ •Relay spec 3ܑఋ •cursor, global object, input object •specຊମ͡Όͳ͍ͷͰཤमಀ͕ͪ͠
•GitHub౿ऻ͍ͯ͠Δ •bit.ly/2npeSdv
N+1 •Πϕϯτ3ͭ×αʔΫϧ100݅×൦9ݸ •1+3×1+3×100×1 = 304ճͷDBΞΫηε •ؤுͬͯ࠷దԽ͢Δͱ 1+1+1 ??
N+1 •gqlgenResolverΛฒྻॲཧ͢Δ •→ू͕͍͠ʂ •github.com/vektah/dataloaden •ࢦఆظؒͷϦΫΤετΛҰׅԽ •·ͩະධՁ… ྑ͍ํ๏ࢥ͍ͭ͘ʁ
REST APIͱͷରൺ •REST API = RPC •GraphQL = QueryLanguage •Τϥʔʹର͢Δߟ͑ํ͕ࠜຊతʹҧ͏
•“ਖ਼͍͠Requestͷ͛ํ” ͱ͍͏֓೦ •ڻ͖࠷খͷݪଇ & σόοΨϏϦςΟ
REST APIͱͷରൺ •Τϥʔʹର͢Δߟ͑ํϚδॏཁ •େࣄͳ͜ͱͳͷͰ2ճݴ͍·ͨ͠ •GraphiQLͰ݁͢ΔσόοΨϏϦςΟ •੍ޚͳΔ͘DirectiveϨϕϧͰ ϑϧεΫϥονͰ͖ΔͳΒͦΕ͕Α͍
Schemaઃܭ •Schema͔ΒಡΈऔΕΔใΛ૿͢ •DirectiveΛͬͨScope੍ޚͱ͔ •DBͷ1table=1typeʹ͢Δͱ͔ •มʹ߹ମͤͨ͞Γׂͨ͠Γ͠ͳ͍
AuthपΓ •ಛʹܾ·༷͕ͬͨͳ͍ •ͷͰɺී௨ʹHTTP͢Δ •ηογϣϯ, OAuth2 etc…
·ͩΘ͔ΒΜ
ςετͲ͏͢Δʁ •ࠓͷͱ͜Ζgolden testingͯ͠Δ •Resolver, DirectiveΛݸผʹςετʁ
Mock? •αʔόଆ࣮͕͋ͱʹͳΔ߹ •ΫϥΠΞϯτଆʹͲ͏ ָͤ͞Δ͖ʁ
BFF vs ࣮ •جຊ࣮ͷ΄͏ָ͕ͦ͏ •Backend Engineerతʹ •Microserviceͷͱ͖ʁ •݁ہBFFతଘࡏʹͳΔͷͰ…ʁ
ӡ༻ͷ •ϝτϦΫεऔΓ͍ͨʁ •ϩάऔΓ͍ͨʁ •statsੳ͍ͨ͠ʁ
ΫϥΠΞϯτଆϫʔΫϑϩʔ •ͳʹ͔Θ͔ΒΜ •ಛʹAndroid, iOSͷݟ͕ͳ͍ •Webదʹͬͯ΄͍͠
ࢀߟࢿྉ
ࢀߟࢿྉू •b.hatena.ne.jp/vvakame/GraphQL •graphql.org •www.howtographql.com •ٕज़ॻయ5Ͱຊग़͢…ʁ(མͪͳ͍Ͱ ͜Ε͖͢
͓͠·͍