吉祥寺.pm22 https://kichijojipm.connpass.com/event/177459/
GraphQL ͰมΘͬͨ͜ͱɾมΘΒͳ͔ͬͨ͜ͱ2020-06-02 ٢ࣉ.pm22@qsona
View Slide
whoami• @qsona• Web Developer at Quipper Limited• ͖ͪͽʔॳࢀՃ!!! ͏Ε͍͠!!! ٢ࣉԕ͍!!!
ࠓͷ• ͜Ε·ͰԿ͔ GraphQL & Rails Ͱ API ։ൃΛͯ͠ ຊ൪ϦϦʔεͨ͠• RESTful ࣌ͱʮมΘͬͨ͜ͱɾมΘΒͳ͔ͬͨ͜ͱʯ ʹ͍͍ͭͯͨ͠
લఏ• Web API Internal use Λఆ͢Δ• πʔϧɾΤίγεςϜͷҰ͠ͳ͍• APIͷઃܭɾ࣮ͷ͚ͩ• ਅͷREST (Hypermedia API) ͷ͠ͳ͍
Web API ͷઃܭख๏• Usecase ϕʔε• Resource ϕʔε
Usecase-based Web API• ΫϥΠΞϯτͷϢʔεέʔεʹ߹Θͤͯ Web API Λ࡞Δ• Ϣʔεέʔε ≒ ը໘• • ࣅͨΑ͏ͳAPI͕ཚཱ͍͢͠• ຖAPI࡞Δͷ͕໘ => ෳͷϢʔεέʔεʹରԠ͢Δ ਆAPI ͕Ͱ͖Δ
Resource-based Web API• ΞϓϦέʔγϣϯͦͷͷͷ༷ʹ߹Θͤͯ Web API Λ࡞Δ• (جຊతʹ API ఏڙଆͷ߹Ͱ࡞Δ)
Resource-based Web API• : ΫϥΠΞϯτͷϢʔεέʔεʹ߹Θͳ͍͕࣌͋Δ• 1ը໘ͰෳͷAPIϦΫΤετ͕ඞཁʹͳͬͨΓ• ٯʹ1ϦΫΤετதͰෆཁͳϑΟʔϧυؚΊͯऔͬͯ͠·͏͜ͱ͕͋Δ• (=> ύϑΥʔϚϯεͷѱԽ)• Resource ͕ࡉ͔͘ͳΓ͗ͯ͢ (ςʔϒϧ୯ҐͳͲ) ΫϥΠΞϯτ͔Β͍ʹ͍͘͜ͱ͕͋Δ
Resource• ݸਓతʹɺ Recourse-based API ʹ͓͍ͯ JSONͷ1֊͝ͱͷ෦ΛResource ͱݺΜͰ͍·͢
RESTful ࣌ͷࢦ
RESTful ࣌ͷࢦ• جຊతʹ Resource ϕʔεΛબ͢Δ• Resource ΛదͳཻͰఏڙ͢Δ• ςʔϒϧ୯ҐͰͳ͍• ΞϓϦέʔγϣϯ্ͷυϝΠϯϞσϧΛߟ͠ɺͦΕʹ߹ΘͤΔ• Ͳ͏ͯ͠ඞཁͳΒผ్ Usecase ༻ͷ endpoint Λੜ͢
GraphQL• Schema ͕ Type ͷ άϥϑߏʹͳ͍ͬͯΔ• query Ͱ field Λࢦఆ͢Δ͜ͱͰɺ άϥϑͷதͷऔಘ͢Δ෦ΛࢦఆͰ͖Δ
GraphQL ࣌ͷࢦ• GraphQL Type ͕ Resource Λද͢• query ͕ Usecase Λද͢• Query Type ͷ field ͕ endpoint Ͱ͋Δ• ͭ·ΓɺResource ϕʔεͷAPIͱ Usecase ϕʔεͷAPIͷ ྑ͍ͱ͜ΖΛཱ྆Ͱ͖Δ!
RESTful => GraphQL ͰมΘΒͳ͔ͬͨ͜ͱ
มΘΒͳ͔ͬͨ͜ͱ• ΞϓϦέʔγϣϯͷυϝΠϯΛ͖ͪΜͱߟͯ͠ɺ Resource Λదͳཻʹ͢Δ͜ͱ• Fat Controller, Fat Serializer Λආ͚Δ͜ͱ• Model ෦ͷઃܭख๏
RESTful => GraphQL ͰมΘͬͨ͜ͱ
ແ
มΘͬͨ͜ͱ• ઃܭɾ࣮ϨϕϧͰมΘΔ͜ͱ΄ͱΜͲͳ͔ͬͨ• RESTful ͷͱ͖ͱରԠ͢Δ֓೦͕͋Δ• ͱ͍͑ɺසग़ͷ...?• N+1 • HTTP endpoint ͕શͯ POST /graphql ʹͳΔ
N+1• Query.users Λ resolve• ͦͷ1݅ͣͭʹରͯ͠ User.jobs Λ resolve
N+1• ಉ͡ RESTful Ͱى͖Δ• GraphQL ʹ͓͍ͯͳͥΫϩʔζΞοϓ͞ΕΔ?
N+1• GraphQL ʹ͓͍ͯӈͷΑ͏ʹɺ ΫϥΠΞϯτ͔Β2௨ΓͷऔΓํ͕γϡοͱͰ͖Δɺͭ·Γศར• ศར͔ͩΒى͖͍ͯΔ͚ͩ• ղܾ๏: Batch Loader ͱݺΕΔΈ• Ruby: shopify/graphql-batch
HTTP endpoint ͕શͯPOST /graphql ʹͳΔ• Persisted Query ͱݺΕΔΈͰղܾͰ͖Δ• ࣄલ / ϥϯλΠϜ ʹΫΤϦΛొ͢Δ
ઃܭ/(୯७ͳ)࣮ΑΓ֎ͷThe NEXT of REST - onk.ninja https://blog.onk.ninja/2017/09/21/the_next_of_rest
͜͜ͰҰ۟ා͘ͳ͍ GraphQL is Better REST