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
RailsアプリにGraphQLを導入してみた話
Search
patorash
November 30, 2019
Programming
700
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RailsアプリにGraphQLを導入してみた話
会社で運用しているWebサービスにGraphQLを導入してみたので、その際に得られた知見を共有します。
patorash
November 30, 2019
More Decks by patorash
See All by patorash
中間管理職はそこそこ楽しい
patorash
0
42
情報共有戦略と戦術
patorash
1
1.3k
exists?で起きるN+1問題にSetで対処する
patorash
0
850
DBのメタデータを管理する文化を作る
patorash
0
700
Stimulusのススメ
patorash
0
92
ActiveRecordの速度改善Tips2020冬
patorash
0
90
わかった気になる!OpenID Connect
patorash
2
2.2k
Indexの種類
patorash
1
830
Start-SQLの紹介
patorash
0
770
Other Decks in Programming
See All in Programming
The NotImplementedError Problem in Ruby
koic
1
860
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
110
RTSPクライアントを自作してみた話
simotin13
0
620
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
310
AIで効率化できた業務・日常
ochtum
0
140
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
590
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
180
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
280
AI時代のUIはどこへ行く?その2!
yusukebe
22
7.4k
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.4k
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
860
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
720
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Crafting Experiences
bethany
1
180
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
230
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.2k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Producing Creativity
orderedlist
PRO
348
40k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Everyday Curiosity
cassininazir
0
230
Side Projects
sachag
455
43k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Transcript
3BJMTΞϓϦʹ(SBQI2-Λ ಋೖͯ͠Έͨ ߹ಉษڧձ JOେձԬࢁ 8JOUFS גࣜձࣾϦκʔϜ ඌݹ ๛໌
࣍ ࣗݾհ 3&45GVM"1*ͷ՝ (SBQI2-ͱʁ σϞ
։ൃͯ͠Έͯͷײ B ϝϦοτ C σϝϦοτ D ͨ͠ͱ͜Ζ E ϋϚͬͨϙΠϯτ ·ͱΊ 2
ࣗݾհ ໊લɿඌݹ ๛໌ UXJUUFSɿ !QBUPSBTI ॴଐɿגࣜձࣾϦκʔϜ γεςϜ։ൃ෦ ৬ɿઐ৬ ࣄ༰ɿ γϣοϐϯάηϯλʔʹؔ࿈͢ΔαʔϏε։ൃ
3VCZPO3BJMTͰࣗࣾαʔϏεͷ։ൃɾӡ༻ʢʣ 3
3&45GVM"1*ͷ՝ 4
3&45ͱʁ 3&45ͱɺʹ3PZ'JFMEJOHࢯ͕ఏএͨ͠ɺࢄγεςϜʹ͓͍ͯෳͷ ιϑτΣΞΛ࿈ܞͤ͞Δͷʹదͨ͠ઃܭݪଇͷू߹ɻ·ͨɺڱٛʹɺͦΕΛ 8FCʹద༻ͨ͠ιϑτΣΞͷઃܭ༷ࣜͷ͜ͱɻҰൠʹޙऀͷҙຯͰ༻͍ΒΕ Δ͜ͱ͕΄ͱΜͲͰ͋Δɻ ҰൠʹΑ͘ΘΕΔڱٛͷ3&45ɺύϥϝʔλΛࢦఆͯ͠ಛఆͷ63-ʹ)551 ͰΞΫηε͢Δͱɺ9.-Ͱهड़͞Εͨϝοηʔδ͕ૹΒΕͯ͘ΔΑ͏ͳγεςϜ ͓Αͼݺͼग़͠ΠϯλʔϑΣʔεʢʮ3&45GVM"1*ʯͱݺΕΔʣͷ͜ͱΛࢦ͢ɻ γεςϜͷঢ়ଶηογϣϯʹґଘͤͣɺಉ͡63-ύϥϝʔλͷΈ߹Θ͔ͤ Βৗʹಉ݁͡Ռ͕ฦ͞ΕΔ͜ͱ͕ظ͞ΕΔɻ
5 IT用語辞典 より引用 http://e-words.jp/w/REST.html
3&45ͱʁ 63-ಉ͕ͩ͡ɺ)551ϝιουʹΑͬͯॲཧΛΓସ͑Δɻ γϯϓϧͰ͔Γ͍͢ʂ (&5 Ұཡऔಘ BSUJDMFT ৄࡉऔಘ BSUJDMFT 1045 ৽ن࡞
BSUJDMFT 1"5$) ߋ৽ BSUJDMFT %&-&5& আ BSUJDMFT 6
3&45GVM"1*ͷ՝ BSUJDMFT BSUJDMFTDPNNFOUT BSUJDMFTDPNNFOUT VTFST BSUJDMFTDPNNFOUT VTFST ʜ BSUJDMFTDPNNFOUT VTFST
7 ௨৴ճ͕ଟ͘ͳΓ͕ͪ ˞࡞Γํ࣍ୈͰ͋Δ͚ΕͲɺ3&45 ͳઃܭͰ͍͑ʜ { “id”: 1, “user_id”: 1, “article_id”: 1, “content”: “この分野は素人なのですが…略”, “created_at”: “2019-11-23 00:00:00”, } { “id”: 10, “user_id”: 5, “article_id”: 1, “content”: “わかるぅ~”, “created_at”: “2019-11-23 06:00:00”, }
3&45GVM"1*ͷ՝ BSUJDMFT BSUJDMFTDPNNFOUT BSUJDMFTDPNNFOUT VTFST BSUJDMFTDPNNFOUT VTFST ʜ BSUJDMFTDPNNFOUT VTFST
8 ௨৴ྔଟ͘ͳΓ͕ͪ l ຊདྷ͏ͷ Ϣʔβ໊ͱϝʔϧΞυϨεͷΈ l ༨ܭͳใ·Ͱૹͬͯ͠·͏ { “id”: 1, “name”: “Yamada Taro”, “email”: “
[email protected]
”, “role_id”: 1, “battle_power”: 530000, “created_at”: “2019-11-22 00:00:00”, “updated_at”: “2019-11-30 00:00:00” } ෆཁʂ
3&45GVM"1*ͷ·ͱΊ l 63-͕ඇৗʹ໌շ l ֊ͷਂ͍σʔλΛऔಘ͠Α͏ͱ͢Δͱ / ճͷ௨৴ճ͕ൃੜ l ར༻͢ΔσʔλҎ֎ͷσʔλૹ৴ l
࠷ۙͷ8FCΞϓϦέʔγϣϯϑϨʔϜϫʔΫ େମ3&45Λαϙʔτ 9
(SBQI2- 10
(SBQI2-ͱʁ l 'BDFCPPL͕։ൃ͍ͯ͠Δ8FC"1*ͷͨΊͷن֨ l ΫΤϦݴޠͱεΩʔϚݴޠ͔ΒΔ ˓ ΫΤϦݴޠ ˙ σʔλऔಘܥͷRVFSZ ˙
σʔλߋ৽ܥͷNVUBUJPO ˙ Πϕϯτ௨ͷTVCTDSJQUJPO ˓ εΩʔϚݴޠ ˙ ༷Λ໌ه͢ΔͨΊͷݴޠ ˔ ܕ͚ l (JU)VC"1*WͰ(SBQI2-Λ࠾༻ 11
(SBQI2-ͷಛ l ΫΤϦͷड͚ޱ͕ͭʢHSBQIRMͷΈʣ ˓ 3&45ͦΕͧΕϦιʔεຖʹ63-͕ଘࡏ͢Δ l શͯ)551ϝιουͷ1045Ͱड͚͚Δ ˓ σʔλͷऔಘͰ͋ͬͯɺ1045 ˓
˞ௐͨΒɺ(&5ͰͰ͖͚ͨΕͲɺ͋·Γݱ࣮తͰͳ͔ͬͨ 12
(SBQI2-Λௐࠪ RVFSZ 13 l ΫϥΠΞϯτ͕ཉ͍͠ σʔλͷΈऔಘ l Ұͷ"1*ίʔϧͰશͯ औಘՄೳ l
σʔλ͕݅ଟ͍߹ɺ ϦϨʔΛఆٛͯ͠ࢦఆ݅ຖ ʹऔಘ͢Δ͜ͱՄೳ query { article(id: 1) { id title content status createdAt updatedAt comments { id content user { id name email } } } }
(SBQI2-Λௐࠪ NVUBUJPO 14 l σʔλߋ৽༻ΫΤϦ l ΓRVFSZͱಉ༷ͷ ϑΥʔϚοτͰऔಘՄೳ mutation {
creatArticle(input: { title: "タイトル", content: "内容", status: 1, userId: 1 }) { article { id title content status user { id name } } } }
σϞ 15
։ൃΛͯ͠Έͯͷײ 16 l ϝϦοτ l σϝϦοτ l ͨ͠ͱ͜Ζ l ϋϚͬͨͱ͜Ζ
։ൃΛͯ͠ΈͯͷײʢϝϦοτʣ l εΩʔϚఆٛͱಉ࣌ʹ"1*υΩϡϝϯτ͕ ˓ ΫϥΠΞϯτଆͷ։ൃऀͱڞ༗ l ςετ͕༰қ ˓ εΩʔϚఆٛϑΝΠϧΛରʹςετ ˓
&&ͷςετͰͳ͍ͷͰߴ l σʔλ͕ҰൃͰऔΕΔշײ ˓ σʔλऔಘʹΫϥΠΞϯτଆʹओಋݖ͕͋Δ l "1*ͷೖΓޱΛҰຊԽ ˓ HSBQIRMͷΈ 17
։ൃͯ͠ΈͯͷײʢσϝϦοτʣ l εΩʔϚఆٛ͢Δͷ͕େม ˓ ϝλϓϩάϥϛϯάՄೳ͕ͩɺεΩʔϚఆٛΛϝλϓϩ͍͍ͯ͠ͷ͔ʁ ͱ͍͏౻͕ʜ l / ͕ൃੜ͍͢͠ ˓
ͨͩ͠ɺϥΠϒϥϦͰղܾՄೳ ˓ औಘՄೳͳ߲͕ಈత ˙ ΫϥΠΞϯτଆ͕ཉ͍͠σʔλΛܾఆ͢ΔͨΊ ˙ ࣄલʹϩʔυͰ͖ͳ͍ l Ωϟογϡͮ͠Β͍ ˓ Ͳ͏͍͏σʔλΛฦ͔͢ɺΫϥΠΞϯτ࣍ୈͷͨΊ ˓ 3&45GVM"1*ͳΒɺฦ͕ܾ͢·͍ͬͯΔͨΊɺΩϟογϡ͕ޮ͘ l ֶशίετ ˓ 3&45GVM"1*ϑϨʔϜϫʔΫͷԆ্ʹ͋Δ ˓ (SBQI2-ͦ͏Ͱͳ͍ 18
3&45ͱʁ 3&45ͱɺʹ3PZ'JFMEJOHࢯ͕ఏএͨ͠ɺࢄγεςϜʹ͓͍ͯෳͷ ιϑτΣΞΛ࿈ܞͤ͞Δͷʹదͨ͠ઃܭݪଇͷू߹ɻ·ͨɺڱٛʹɺͦΕΛ 8FCʹద༻ͨ͠ιϑτΣΞͷઃܭ༷ࣜͷ͜ͱɻҰൠʹޙऀͷҙຯͰ༻͍ΒΕ Δ͜ͱ͕΄ͱΜͲͰ͋Δɻ ҰൠʹΑ͘ΘΕΔڱٛͷ3&45ɺύϥϝʔλΛࢦఆͯ͠ಛఆͷ63-ʹ)551 ͰΞΫηε͢Δͱɺ9.-Ͱهड़͞Εͨϝοηʔδ͕ૹΒΕͯ͘ΔΑ͏ͳγεςϜ ͓Αͼݺͼग़͠ΠϯλʔϑΣʔεʢʮ3&45GVM"1*ʯͱݺΕΔʣͷ͜ͱΛࢦ͢ɻ γεςϜͷঢ়ଶηογϣϯʹґଘͤͣɺಉ͡63-ύϥϝʔλͷΈ߹Θͤ ͔Βৗʹಉ݁͡Ռ͕ฦ͞ΕΔ͜ͱ͕ظ͞ΕΔɻ
19 IT用語辞典 より引用 http://e-words.jp/w/REST.html キャッシュ可能!!
։ൃͯ͠ΈͯͷײʢσϝϦοτʣ l εΩʔϚఆٛ͢Δͷ͕େม ˓ ϝλϓϩάϥϛϯάՄೳ͕ͩɺεΩʔϚఆٛΛϝλϓϩ͍͍ͯ͠ͷ͔ʁ ͱ͍͏౻͕ʜ l / ͕ൃੜ͍͢͠ ˓
ͨͩ͠ɺ3BJMTͳΒϥΠϒϥϦͰղܾՄೳ HSBQIRMCBUDI ˓ औಘՄೳͳ߲͕ಈత ˙ ΫϥΠΞϯτଆ͕ཉ͍͠σʔλΛܾఆ͢ΔͨΊ ˙ ࣄલʹϩʔυͰ͖ͳ͍ l Ωϟογϡͮ͠Β͍ ˓ Ͳ͏͍͏σʔλΛฦ͔͢ɺΫϥΠΞϯτ࣍ୈͷͨΊ ˓ 3&45GVM"1*ͳΒɺฦ͕ܾ͢·͍ͬͯΔͨΊɺΩϟογϡ͕ޮ͘ l ֶशίετ ˓ 3&45GVM"1*8FCϑϨʔϜϫʔΫͷԆ্ʹ͋Δ ˓ (SBQI2-ͦ͏Ͱͳ͍ 20
։ൃΛͯ͠Έͯͷײʢͨ͠ϙΠϯτʣ l ΞΫηεݖݶνΣοΫ ˓ ࿈ܞΞϓϦέʔγϣϯʹΑͬͯ औಘ/(ͳϦιʔε͋Γ ˓ %#͔ΒϦιʔεͷσʔλऔಘ ޙʹνΣοΫͰ͍ ˓
ΫΤϦΛղੳɻऔಘ͠Α͏ͱ͠ ͍ͯΔϦιʔεΛಛఆ ˙ ݖݶ͕ͳ͚Ε ͜ͷ࣌Ͱ͘ ˓ ΫΤϦղੳॏ͍ ˙ NVUBUJPOআ֎ 21 query searchScSomeOne($scId: ID!){ sc(id: $scId) { name shopBrands { name shopCompany { name } } } } アクセス権限のない リソースの取得を検知!
։ൃ͍ͯͯ͠ͷײʢϋϚͬͨϙΠϯτʣ l NVUBUJPOʹΑΔόϧΫΠϯαʔτɾΞοϓσʔτΛ ߦͳ͍͍ͬͯͷ͔ʁ ˓ ΫΤϦʹผ໊Λ͚ͭΔ͜ͱ͕Մೳ ˓ ͷίʔϧͰෳͷNVUBUJPOΫΤϦΛฒͯόϧΫΠϯαʔτ ͢Δ͜ͱࣗମͰ͖ͨ ˓
͔͠͠ɺݸผʹNVUBUJPOͷॲཧ࣮ߦ ˙ τϥϯβΫγϣϯ͕ޮ͔ͳ͍ ˓ ΫΤϦղੳΛߦͬͯɺόϧΫΠϯαʔτͰ͋Δ͜ͱΛݕͨ͠Βɺ τϥϯβΫγϣϯΛൃߦ͢Δ͜ͱग़དྷͦ͏͕ͩʜ ˙ Ͱ͖Δ͔Β͍͍͔ͬͯͱݴΘΕΔͱɺҧ͏ؾ͕͢Δ ˙ σϑΥϧτͷ(SBQI2-ͦ͏͍͏ಈ࡞Λظ͍ͯ͠Δͷ͔ʁ ˓ JTTVFΛൃݟ ˙ όϧΫΠϯαʔτ༻ͷNVUBUJPOΛఆٛ͠·͠ΐ͏ɺͱ͍͏݁ ˙ ͨͩ͠ɺ্༷ɺෳͷNVUBUJPOΛฒΔͷ0, 22
·ͱΊ l (SBQI2-"1*ͷίʔϧճΛݮ l σʔλ௨৴ྔΛݮ l εΩʔϚݴޠͰܕͷఆ͕ٛՄೳ l ςετ͕༰қ l
͍͍͜ͱ͔ΓͰͳ͍ ˓ ֶशίετ3&45GVM"1*ʹൺΔͱߴ͍ ˓ Ωϟογϡ͕ޮ͔ͤʹ͍͘ ˓ / ͕ൃੜ͍͢͠ 23
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 24
ࢀߟࢿྉ 25 ˔ ʮ(SBQI2-ʯపఈೖ ᴷ3&45ͱͷൺֱɺ"1*ɾϑϩϯτํͷ࣮͔ΒֶͿ IUUQTFNQMPZNFOUFO KBQBODPNFOHJOFFSIVCFOUSZ(SBQI2-&"&"' &#%&# ˔ (SBQI2-3VCZ
IUUQTHSBQIRMSVCZPSH