RailsアプリにGraphQLを導入してみた話

Dc5157c1e1b11923f4cdd210ee27d4af?s=47 patorash
November 30, 2019

 RailsアプリにGraphQLを導入してみた話

会社で運用しているWebサービスにGraphQLを導入してみたので、その際に得られた知見を共有します。

Dc5157c1e1b11923f4cdd210ee27d4af?s=128

patorash

November 30, 2019
Tweet

Transcript

  1. 3BJMTΞϓϦʹ(SBQI2-Λ ಋೖͯ͠Έͨ࿩ ߹ಉษڧձ JOେ౎ձԬࢁ 8JOUFS גࣜձࣾϦκʔϜ ඌݹ ๛໌

  2. ໨࣍  ࣗݾ঺հ  3&45GVM"1*ͷ՝୊  (SBQI2-ͱ͸ʁ  σϞ 

    ։ൃͯ͠Έͯͷײ૝ B ϝϦοτ C σϝϦοτ D ޻෉ͨ͠ͱ͜Ζ E ϋϚͬͨϙΠϯτ  ·ͱΊ 2
  3. ࣗݾ঺հ ໊લɿඌݹ ๛໌ UXJUUFSɿ !QBUPSBTI ॴଐɿגࣜձࣾϦκʔϜ γεςϜ։ൃ෦ ໾৬ɿઐ໳৬ ࢓ࣄ಺༰ɿ γϣοϐϯάηϯλʔʹؔ࿈͢ΔαʔϏε։ൃ

    3VCZPO3BJMTͰࣗࣾαʔϏεͷ։ൃɾӡ༻ʢ೥໨ʣ 3
  4. 3&45GVM"1*ͷ՝୊ 4

  5. 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
  6. 3&45ͱ͸ʁ 63-͸ಉ͕ͩ͡ɺ)551ϝιουʹΑͬͯॲཧΛ੾Γସ͑Δɻ γϯϓϧͰ෼͔Γ΍͍͢ʂ (&5 Ұཡऔಘ BSUJDMFT ৄࡉऔಘ BSUJDMFT 1045 ৽ن࡞੒

    BSUJDMFT 1"5$) ߋ৽ BSUJDMFT %&-&5& ࡟আ BSUJDMFT 6
  7. 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”, }
  8. 3&45GVM"1*ͷ՝୊ BSUJDMFT BSUJDMFTDPNNFOUT BSUJDMFTDPNNFOUT VTFST BSUJDMFTDPNNFOUT VTFST ʜ BSUJDMFTDPNNFOUT VTFST

    8 ௨৴ྔଟ͘ͳΓ͕ͪ l ຊདྷ࢖͏ͷ͸ Ϣʔβ໊ͱϝʔϧΞυϨεͷΈ l ༨ܭͳ৘ใ·Ͱૹͬͯ͠·͏ { “id”: 1, “name”: “Yamada Taro”, “email”: “t-yamada@example.com”, “role_id”: 1, “battle_power”: 530000, “created_at”: “2019-11-22 00:00:00”, “updated_at”: “2019-11-30 00:00:00” } ෆཁʂ
  9. 3&45GVM"1*ͷ·ͱΊ l 63-͕ඇৗʹ໌շ l ֊૚ͷਂ͍σʔλΛऔಘ͠Α͏ͱ͢Δͱ / ճͷ௨৴ճ਺͕ൃੜ l ར༻͢ΔσʔλҎ֎ͷσʔλ΋ૹ৴ l

    ࠷ۙͷ8FCΞϓϦέʔγϣϯϑϨʔϜϫʔΫ͸ େମ3&45Λαϙʔτ 9
  10. (SBQI2- 10

  11. (SBQI2-ͱ͸ʁ l 'BDFCPPL͕։ൃ͍ͯ͠Δ8FC"1*ͷͨΊͷن֨ l ΫΤϦݴޠͱεΩʔϚݴޠ͔Β੒Δ ˓ ΫΤϦݴޠ ˙ σʔλऔಘܥͷRVFSZ ˙

    σʔλߋ৽ܥͷNVUBUJPO ˙ Πϕϯτ௨஌ͷTVCTDSJQUJPO ˓ εΩʔϚݴޠ ˙ ࢓༷Λ໌ه͢ΔͨΊͷݴޠ ˔ ܕ෇͚ l (JU)VC"1*WͰ(SBQI2-Λ࠾༻ 11
  12. (SBQI2-ͷಛ௃ l ΫΤϦͷड͚ޱ͕ͭʢHSBQIRMͷΈʣ ˓ 3&45͸ͦΕͧΕϦιʔεຖʹ63-͕ଘࡏ͢Δ l શͯ)551ϝιουͷ1045Ͱड͚෇͚Δ ˓ σʔλͷऔಘͰ͋ͬͯ΋ɺ1045 ˓

    ˞ௐ΂ͨΒɺ(&5Ͱ΋Ͱ͖͚ͨΕͲɺ͋·Γݱ࣮తͰͳ͔ͬͨ 12
  13. (SBQI2-Λௐࠪ RVFSZ 13 l ΫϥΠΞϯτ͕ཉ͍͠ σʔλͷΈऔಘ l Ұ౓ͷ"1*ίʔϧͰશͯ औಘՄೳ l

    σʔλ݅਺͕ଟ͍৔߹͸ɺ ϦϨʔΛఆٛͯ͠ࢦఆ݅਺ຖ ʹऔಘ͢Δ͜ͱ΋Մೳ query { article(id: 1) { id title content status createdAt updatedAt comments { id content user { id name email } } } }
  14. (SBQI2-Λௐࠪ NVUBUJPO 14 l σʔλߋ৽༻ΫΤϦ l ໭Γ஋͸RVFSZͱಉ༷ͷ ϑΥʔϚοτͰऔಘՄೳ mutation {

    creatArticle(input: { title: "タイトル", content: "内容", status: 1, userId: 1 }) { article { id title content status user { id name } } } }
  15. σϞ 15

  16. ։ൃΛͯ͠Έͯͷײ૝ 16 l ϝϦοτ l σϝϦοτ l ޻෉ͨ͠ͱ͜Ζ l ϋϚͬͨͱ͜Ζ

  17. ։ൃΛͯ͠Έͯͷײ૝ʢϝϦοτʣ l εΩʔϚఆٛͱಉ࣌ʹ"1*υΩϡϝϯτ͕׬੒ ˓ ΫϥΠΞϯτଆͷ։ൃऀͱڞ༗ l ςετ͕༰қ ˓ εΩʔϚఆٛϑΝΠϧΛର৅ʹςετ ˓

    &&ͷςετͰ͸ͳ͍ͷͰߴ଎ l σʔλ͕ҰൃͰऔΕΔշײ ˓ σʔλऔಘʹΫϥΠΞϯτଆʹओಋݖ͕͋Δ l "1*ͷೖΓޱΛҰຊԽ ˓ HSBQIRMͷΈ 17
  18. ։ൃͯ͠Έͯͷײ૝ʢσϝϦοτʣ l εΩʔϚఆٛ͢Δͷ͕େม ˓ ϝλϓϩάϥϛϯάՄೳ͕ͩɺεΩʔϚఆٛΛϝλϓϩ͍͍ͯ͠ͷ͔ʁ ͱ͍͏׉౻͕ʜ l / ໰୊͕ൃੜ͠΍͍͢ ˓

    ͨͩ͠ɺϥΠϒϥϦͰղܾՄೳ ˓ औಘՄೳͳ߲໨͕ಈత ˙ ΫϥΠΞϯτଆ͕ཉ͍͠σʔλΛܾఆ͢ΔͨΊ ˙ ࣄલʹϩʔυͰ͖ͳ͍ l Ωϟογϡͮ͠Β͍ ˓ Ͳ͏͍͏σʔλΛฦ͔͢͸ɺΫϥΠΞϯτ࣍ୈͷͨΊ ˓ 3&45GVM"1*ͳΒ͹ɺฦ͢஋͕ܾ·͍ͬͯΔͨΊɺΩϟογϡ͕ޮ͘ l ֶशίετ ˓ 3&45GVM"1*͸ϑϨʔϜϫʔΫͷԆ௕্ʹ͋Δ ˓ (SBQI2-͸ͦ͏Ͱ͸ͳ͍ 18
  19. 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 キャッシュ可能!!
  20. ։ൃͯ͠Έͯͷײ૝ʢσϝϦοτʣ l εΩʔϚఆٛ͢Δͷ͕େม ˓ ϝλϓϩάϥϛϯάՄೳ͕ͩɺεΩʔϚఆٛΛϝλϓϩ͍͍ͯ͠ͷ͔ʁ ͱ͍͏׉౻͕ʜ l / ໰୊͕ൃੜ͠΍͍͢ ˓

    ͨͩ͠ɺ3BJMTͳΒϥΠϒϥϦͰղܾՄೳ HSBQIRMCBUDI ˓ औಘՄೳͳ߲໨͕ಈత ˙ ΫϥΠΞϯτଆ͕ཉ͍͠σʔλΛܾఆ͢ΔͨΊ ˙ ࣄલʹϩʔυͰ͖ͳ͍ l Ωϟογϡͮ͠Β͍ ˓ Ͳ͏͍͏σʔλΛฦ͔͢͸ɺΫϥΠΞϯτ࣍ୈͷͨΊ ˓ 3&45GVM"1*ͳΒ͹ɺฦ͢஋͕ܾ·͍ͬͯΔͨΊɺΩϟογϡ͕ޮ͘ l ֶशίετ ˓ 3&45GVM"1*͸8FCϑϨʔϜϫʔΫͷԆ௕্ʹ͋Δ ˓ (SBQI2-͸ͦ͏Ͱ͸ͳ͍ 20
  21. ։ൃΛͯ͠Έͯͷײ૝ʢ޻෉ͨ͠ϙΠϯτʣ l ΞΫηεݖݶνΣοΫ ˓ ࿈ܞΞϓϦέʔγϣϯʹΑͬͯ ͸औಘ/(ͳϦιʔε͋Γ ˓ %#͔ΒϦιʔεͷσʔλऔಘ ޙʹνΣοΫͰ͸஗͍ ˓

    ΫΤϦΛղੳɻऔಘ͠Α͏ͱ͠ ͍ͯΔϦιʔεΛಛఆ ˙ ݖݶ͕ͳ͚Ε͹ ͜ͷ࣌఺Ͱ஄͘ ˓ ΫΤϦղੳ΋ॏ͍ ˙ NVUBUJPO͸আ֎ 21 query searchScSomeOne($scId: ID!){ sc(id: $scId) { name shopBrands { name shopCompany { name } } } } アクセス権限のない リソースの取得を検知!
  22. ։ൃ͍ͯͯ͠ͷײ૝ʢϋϚͬͨϙΠϯτʣ l NVUBUJPOʹΑΔόϧΫΠϯαʔτɾΞοϓσʔτΛ ߦͳͬͯ΋͍͍ͷ͔ʁ ˓ ΫΤϦʹ͸ผ໊Λ͚ͭΔ͜ͱ͕Մೳ ˓ ౓ͷίʔϧͰෳ਺ͷNVUBUJPOΫΤϦΛฒ΂ͯόϧΫΠϯαʔτ ͢Δ͜ͱࣗମ͸Ͱ͖ͨ ˓

    ͔͠͠ɺݸผʹNVUBUJPOͷॲཧ࣮ߦ ˙ τϥϯβΫγϣϯ͕ޮ͔ͳ͍ ˓ ΫΤϦղੳΛߦͬͯɺόϧΫΠϯαʔτͰ͋Δ͜ͱΛݕ஌ͨ͠Βɺ τϥϯβΫγϣϯΛൃߦ͢Δ͜ͱ͸ग़དྷͦ͏͕ͩʜ ˙ Ͱ͖Δ͔Β΍͍͍͔ͬͯͱݴΘΕΔͱɺҧ͏ؾ͕͢Δ ˙ σϑΥϧτͷ(SBQI2-͸ͦ͏͍͏ಈ࡞Λظ଴͍ͯ͠Δͷ͔ʁ ˓ JTTVFΛൃݟ ˙ όϧΫΠϯαʔτ༻ͷNVUBUJPOΛఆٛ͠·͠ΐ͏ɺͱ͍͏݁࿦ ˙ ͨͩ͠ɺ࢓্༷ɺෳ਺ͷNVUBUJPOΛฒ΂Δͷ͸0, 22
  23. ·ͱΊ l (SBQI2-͸"1*ͷίʔϧճ਺Λ࡟ݮ l σʔλ௨৴ྔΛ࡟ݮ l εΩʔϚݴޠͰܕͷఆ͕ٛՄೳ l ςετ͕༰қ l

    ͍͍͜ͱ͹͔ΓͰ͸ͳ͍ ˓ ֶशίετ͸3&45GVM"1*ʹൺ΂Δͱߴ͍ ˓ Ωϟογϡ͕ޮ͔ͤʹ͍͘ ˓ / ໰୊͕ൃੜ͠΍͍͢ 23
  24. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 24

  25. ࢀߟࢿྉ 25 ˔ ʮ(SBQI2-ʯపఈೖ໳ ᴷ3&45ͱͷൺֱɺ"1*ɾϑϩϯτ૒ํͷ࣮૷͔ΒֶͿ IUUQTFNQMPZNFOUFO KBQBODPNFOHJOFFSIVCFOUSZ(SBQI2-&"&"' &#%&# ˔ (SBQI2-3VCZ

    IUUQTHSBQIRMSVCZPSH