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
MUSUBI 田中裕一『AIと共に行う「しごとのリデザイン」- スモールバックオフィス編』AI Ops Lab #4
musubi
0
180
AAIFに入ってみた ~内から見えるコミュニティ動向~
sato4
0
230
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
190
現地で盛り上がった WWDC26 Keynote
zozotech
PRO
1
250
小さくはじめるSLI/SLO ~育てながら組織に定着させる実践知~ / Starting Small with SLI/SLOs: Building Adoption Through Continuous Growth
nari_ex
7
1.9k
Claude Codeをどのように キャッチアップしているか
oikon48
12
8.1k
自宅LLMの話
jacopen
1
580
非エンジニアがClaudeと挑んだ「1ヶ月間プロダクト30本ノック」
askokc
0
530
FDE という解 ― 暗黙知と明示知をつなぐ、伴走型エンジニアリング ―
otanet
0
160
2026TECHFRESH畢業分享會 - Lightning Talk - E起 See See : 電商推薦讀心術? 數據說了算
line_developers_tw
PRO
0
1k
LayerXにおけるセキュリティ管理の現在地と次の一手
tosho
0
190
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
1k
Featured
See All Featured
KATA
mclloyd
PRO
35
15k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
What's in a price? How to price your products and services
michaelherold
247
13k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
210
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
160
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
290
Joys of Absence: A Defence of Solitary Play
codingconduct
1
390
Un-Boring Meetings
codingconduct
0
310
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
370
30 Presentation Tips
portentint
PRO
1
320
4 Signs Your Business is Dying
shpigford
187
22k
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Ͱຊग़͢…ʁ(མͪͳ͍Ͱ ͜Ε͖͢
͓͠·͍