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
0
24
情報共有戦略と戦術
patorash
1
1.3k
exists?で起きるN+1問題にSetで対処する
patorash
0
810
DBのメタデータを管理する文化を作る
patorash
0
670
Stimulusのススメ
patorash
0
83
ActiveRecordの速度改善Tips2020冬
patorash
0
75
わかった気になる!OpenID Connect
patorash
2
2.2k
Indexの種類
patorash
1
800
Start-SQLの紹介
patorash
0
750
Other Decks in Programming
See All in Programming
Rubyと楽しいをつくる / Creating joy with Ruby
chobishiba
0
190
The Ralph Wiggum Loop: First Principles of Autonomous Development
sembayui
0
3.7k
Amazon Bedrockを活用したRAGの品質管理パイプライン構築
tosuri13
5
890
Railsの気持ちを考えながらコントローラとビューを整頓する/tidying-rails-controllers-and-views-as-rails-think
moro
4
340
Apache Iceberg V3 and migration to V3
tomtanaka
0
220
Head of Engineeringが現場で回した生産性向上施策 2025→2026
gessy0129
PRO
0
190
NOT A HOTEL - 建築や人と融合し、自由を創り出すソフトウェア
not_a_hokuts
2
460
CSC307 Lecture 13
javiergs
PRO
0
300
生成AIを使ったコードレビューで定性的に品質カバー
chiilog
1
310
オブザーバビリティ駆動開発って実際どうなの?
yohfee
1
510
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜 / Understanding nil in Go Interface Representation and Why nil != nil
kuro_kurorrr
2
1.2k
ふん…おもしれぇ Parser。RubyKaigi 行ってやるぜ
aki_pin0
0
110
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
The Language of Interfaces
destraynor
162
26k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.2k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
180
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Raft: Consensus for Rubyists
vanstee
141
7.3k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
610
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
It's Worth the Effort
3n
188
29k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
620
Skip the Path - Find Your Career Trail
mkilby
0
67
Ruling the World: When Life Gets Gamed
codingconduct
0
160
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