Slide 1

Slide 1 text

GraphQL ͰมΘͬͨ͜ͱɾ มΘΒͳ͔ͬͨ͜ͱ 2020-06-02 ٢঵ࣉ.pm22 @qsona

Slide 2

Slide 2 text

whoami • @qsona • Web Developer at Quipper Limited • ͖ͪͽʔॳࢀՃ!!! ͏Ε͍͠!!! ٢঵ࣉԕ͍!!!

Slide 3

Slide 3 text

ࠓ೔ͷ࿩ • ͜Ε·ͰԿ౓͔ GraphQL & Rails Ͱ API ։ൃΛͯ͠
 ຊ൪ϦϦʔεͨ͠ • RESTful ࣌୅ͱʮมΘͬͨ͜ͱɾมΘΒͳ͔ͬͨ͜ͱʯ
 ʹ͍ͭͯ࿩͍ͨ͠

Slide 4

Slide 4 text

લఏ • Web API ͸ Internal use Λ૝ఆ͢Δ • πʔϧɾΤίγεςϜͷ࿩͸Ұ੾͠ͳ͍ • APIͷઃܭɾ࣮૷ͷ࿩͚ͩ • ਅͷREST (Hypermedia API) ͷ࿩͸͠ͳ͍

Slide 5

Slide 5 text

Web API ͷઃܭख๏ • Usecase ϕʔε • Resource ϕʔε

Slide 6

Slide 6 text

Usecase-based Web API • ΫϥΠΞϯτͷϢʔεέʔεʹ߹Θͤͯ Web API Λ࡞Δ • Ϣʔεέʔε ≒ ը໘ • ໰୊఺ • ࣅͨΑ͏ͳAPI͕ཚཱ͠΍͍͢ • ຖ౓API࡞Δͷ͕໘౗ =>
 ෳ਺ͷϢʔεέʔεʹରԠ͢Δ ਆAPI ͕Ͱ͖Δ܏޲

Slide 7

Slide 7 text

Resource-based Web API • ΞϓϦέʔγϣϯͦͷ΋ͷͷ࢓༷ʹ߹Θͤͯ Web API Λ࡞Δ • (جຊతʹ͸ API ఏڙଆͷ౎߹Ͱ࡞Δ)

Slide 8

Slide 8 text

Resource-based Web API • ໰୊఺: ΫϥΠΞϯτͷϢʔεέʔεʹ߹Θͳ͍͕࣌͋Δ • 1ը໘Ͱෳ਺ͷAPIϦΫΤετ͕ඞཁʹͳͬͨΓ • ٯʹ1ϦΫΤετதͰෆཁͳϑΟʔϧυ΋ؚΊͯऔͬͯ͠·͏͜ͱ͕͋Δ • (=> ύϑΥʔϚϯεͷѱԽ) • Resource ͕ࡉ͔͘ͳΓ͗ͯ͢ (ςʔϒϧ୯ҐͳͲ)
 ΫϥΠΞϯτ͔Β࢖͍ʹ͍͘͜ͱ͕͋Δ

Slide 9

Slide 9 text

Resource • ݸਓతʹɺ
 Recourse-based API ʹ͓͍ͯ
 JSONͷ1֊૚͝ͱͷ෦෼Λ Resource ͱݺΜͰ͍·͢

Slide 10

Slide 10 text

RESTful ࣌୅ͷࢦ਑

Slide 11

Slide 11 text

RESTful ࣌୅ͷࢦ਑ • جຊతʹ Resource ϕʔεΛબ୒͢Δ • Resource Λద੾ͳཻ౓Ͱఏڙ͢Δ • ςʔϒϧ୯ҐͰ͸ͳ͍ • ΞϓϦέʔγϣϯ্ͷυϝΠϯϞσϧΛߟ࡯͠ɺͦΕʹ߹ΘͤΔ • Ͳ͏ͯ͠΋ඞཁͳΒผ్ Usecase ༻ͷ endpoint Λੜ΍͢

Slide 12

Slide 12 text

GraphQL • Schema ͕ Type ͷ άϥϑߏ଄ʹͳ͍ͬͯΔ • query Ͱ field Λࢦఆ͢Δ͜ͱͰɺ
 άϥϑͷதͷऔಘ͢Δ෦෼ΛࢦఆͰ͖Δ

Slide 13

Slide 13 text

GraphQL ࣌୅ͷࢦ਑ • GraphQL Type ͕ Resource Λද͢ • query ͕ Usecase Λද͢ • Query Type ͷ field ͕ endpoint Ͱ͋Δ • ͭ·ΓɺResource ϕʔεͷAPIͱ Usecase ϕʔεͷAPIͷ
 ྑ͍ͱ͜ΖΛཱ྆Ͱ͖Δ!

Slide 14

Slide 14 text

RESTful => GraphQL Ͱ มΘΒͳ͔ͬͨ͜ͱ

Slide 15

Slide 15 text

มΘΒͳ͔ͬͨ͜ͱ • ΞϓϦέʔγϣϯͷυϝΠϯΛ͖ͪΜͱߟ࡯ͯ͠ɺ
 Resource Λద੾ͳཻ౓ʹ͢Δ͜ͱ • Fat Controller, Fat Serializer Λආ͚Δ͜ͱ • Model ෦෼ͷઃܭख๏

Slide 16

Slide 16 text

RESTful => GraphQL Ͱ มΘͬͨ͜ͱ

Slide 17

Slide 17 text

Slide 18

Slide 18 text

มΘͬͨ͜ͱ • ઃܭɾ࣮૷ϨϕϧͰมΘΔ͜ͱ͸΄ͱΜͲͳ͔ͬͨ • RESTful ͷͱ͖ͱରԠ͢Δ֓೦͕͋Δ • ͱ͸͍͑ɺසग़ͷ໰୊͸...? • N+1 ໰୊ • HTTP endpoint ͕શͯ POST /graphql ʹͳΔ໰୊

Slide 19

Slide 19 text

N+1໰୊ • Query.users Λ resolve • ͦͷ1݅ͣͭʹରͯ͠ User.jobs Λ
 resolve

Slide 20

Slide 20 text

N+1໰୊ • ಉ͡໰୊͸ RESTful Ͱ΋ى͖Δ • GraphQL ʹ͓͍ͯͳͥΫϩʔζΞο ϓ͞ΕΔ?

Slide 21

Slide 21 text

N+1໰୊ • GraphQL ʹ͓͍ͯ͸ӈͷΑ͏ʹɺ
 ΫϥΠΞϯτ͔Β2௨ΓͷऔΓํ͕γϡο ͱͰ͖Δɺͭ·Γศར • ศར͔ͩΒى͖͍ͯΔ͚ͩ • ղܾ๏: Batch Loader ͱݺ͹ΕΔ࢓૊Έ • Ruby: shopify/graphql-batch

Slide 22

Slide 22 text

HTTP endpoint ͕શͯ POST /graphql ʹͳΔ໰୊ • Persisted Query ͱݺ͹ΕΔ࢓૊ΈͰղܾͰ͖Δ • ࣄલ / ϥϯλΠϜ ʹΫΤϦΛొ࿥͢Δ

Slide 23

Slide 23 text

ઃܭ/(୯७ͳ)࣮૷ΑΓ֎ͷ࿩ The NEXT of REST - onk.ninja https://blog.onk.ninja/2017/09/21/the_next_of_rest

Slide 24

Slide 24 text

͜͜ͰҰ۟ ා͘ͳ͍ GraphQL is Better REST