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
1
670
RailsアプリにGraphQLを導入してみた話
会社で運用しているWebサービスにGraphQLを導入してみたので、その際に得られた知見を共有します。
patorash
November 30, 2019
Tweet
Share
More Decks by patorash
See All by patorash
情報共有戦略と戦術
patorash
1
1.3k
exists?で起きるN+1問題にSetで対処する
patorash
0
810
DBのメタデータを管理する文化を作る
patorash
0
660
Stimulusのススメ
patorash
0
81
ActiveRecordの速度改善Tips2020冬
patorash
0
73
わかった気になる!OpenID Connect
patorash
2
2.2k
Indexの種類
patorash
1
800
Start-SQLの紹介
patorash
0
750
Other Decks in Programming
See All in Programming
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
440
プロダクトオーナーから見たSOC2 _SOC2ゆるミートアップ#2
kekekenta
0
200
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
5.9k
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
230
カスタマーサクセス業務を変革したヘルススコアの実現と学び
_hummer0724
0
590
CSC307 Lecture 03
javiergs
PRO
1
490
dchart: charts from deck markup
ajstarks
3
990
Fluid Templating in TYPO3 14
s2b
0
130
CSC307 Lecture 09
javiergs
PRO
1
830
CSC307 Lecture 07
javiergs
PRO
0
550
Honoを使ったリモートMCPサーバでAIツールとの連携を加速させる!
tosuri13
1
170
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
2
1.8k
Featured
See All Featured
A better future with KSS
kneath
240
18k
Navigating Weather and Climate Data
rabernat
0
97
Building Applications with DynamoDB
mza
96
6.9k
How to Ace a Technical Interview
jacobian
281
24k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
49k
Ruling the World: When Life Gets Gamed
codingconduct
0
140
The Curse of the Amulet
leimatthew05
1
8.2k
So, you think you're a good person
axbom
PRO
2
1.9k
Claude Code のすすめ
schroneko
67
210k
Google's AI Overviews - The New Search
badams
0
900
The Invisible Side of Design
smashingmag
302
51k
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