id:mangano-ito / גࣜձࣾͯͳ5 ʹΘͨΔ“ Perl ͷ ” REST API Λ“ Perl Ͱ ” GraphQL API Խ͠࡞Γ͢
View Slide
ࢲ ୡʹ͍ͭͯ
ࢲʹ͍ͭͯid:mangano-itoגࣜձࣾͯͳ(ϚϯΨνʔϜΞϓϦέʔγϣϯΤϯδχΞ 8FC
גࣜձࣾͯͳ(ϚϯΨνʔϜΞϓϦέʔγϣϯΤϯδχΞ 8FCˣϚϯΨΞϓϦνʔϜΤϯδχΞ "OESPJEࢲʹ͍ͭͯid:mangano-ito
ࢲୡͷϓϩμΫτʹ͍ͭͯ
GigaViewerࣾɾαʔϏεʹಋೖ͞Ε͍ͯΔ8FCϚϯΨ͚Ϗϡʔϫʔ2017 ʙ
৽ͨʹϚϯΨΞϓϦʹରԠͨ͠ϏϡʔϫͰ͋Δʮ(JHB7JFXFSGPS"QQTʯΛఏڙ2021 ʙGigaViewer for Apps+5 yearshttps://hatenacorp.jp/press/release/entry/2021/11/04/153000
͍··Ͱͷࢲୡ
͍··Ͱͷ API ։ൃ3&45"1*"1*ͷυΩϡϝϯςʔγϣϯόϦσʔγϣϯ
hitode909 / APISchemahttps://github.com/hitode909/APISchemaMade with/for Perl ♥ΘΕ͍ͯͨͷ
l"1*Λ࡞ΔͳΒεΩʔϚϑΝʔετʹ͍ͨ͠ΑͶz
👍
lҰํɼ͍··Ͱͷ3&45"1*։ൃͰ͜͏͍͏ࠔΓ͝ͱ͕͋ͬͨΑͶz
ΤϯυϙΠϯτͷϨεϙϯεܗ͕ࣜݻఆҰํɺը໘͝ͱʹඞཁͱͳΔϑΟʔϧυҟͳΔ‑ࣅͨΑ͏ͳϦιʔε͕ཚཱ
ͦͷ݁Ռ302 resources54 endpointsseriesseries_detailseries_detail_of_free_series_campaignseries_info_of_free_series_campaignticket_seriesSeries of `series` resources …serial_series
͜ͷը໘͜͏ͳΔ࡞λΠτϧஶऀ֓ཁ
͜ͷը໘͜͏ͳΔepisode_with_series
Ұํ ͜ͷը໘Ͱ͜͏ͳΔ࡞λΠτϧ֓ཁ࠷৽ΤϐιʔυλΠτϧνέοτར༻Մ൱͍͍Ͷ
Ұํ ͜ͷը໘Ͱ͜͏ͳΔserial_series
ҧ͍…episode_with_seriesepisodeauthorserial_seriesseries
ҧ͍…episode_with_seriesepisodeauthorserial_seriesseries_supports_ticket series_detailseries
༻్ͰԽ͍͍ͯͬͯ͠Δ…• series • Ϧετը໘ͰܰΊͷσʔλͰ΄͍͠ΑͶʙ• series_detail• ৄࡉը໘ͰΑΓଟ͘ͷؔ࿈ใ͚ͬͭͯ͘΄͍͠ΑͶʙseriesseries_detail
͞Βʹ…• listed_series_info• series + author + ৽ணΤϐιʔυ࣌ ͕߹ମͨ͠όʔδϣϯ• listed_series_info_with_ticket• listed_series_info + ticket ใ͕߹ମͨ͠όʔδϣϯlisted_series_infolisted_series_info_with_ticket
🤯
ॊೈੑදࣔ݅ूܭ݅ͳͲ͕ͯ͢αʔόʔαΠυʹ࣮͞Ε͍ͯΔΞϓϦͷ։ൃલʹαʔόʔαΠυͰઌߦͨ͠։ൃͱϦϦʔε͕ඞཁ
͋Δ͍ϫʔΫϑϩʔαʔόʔαΠυͰͷඇޓͳมߋڧ੍Ξοϓσʔτ͕ඞཁʹͳΓ͏ΔͷͰͳΔ͘ͳΒආ͚͍ͨʜʜ
͋Δ͍ϫʔΫϑϩʔഁյతͳมߋΛ͙ͨΊʹ৽ͨͳόʔδϣϯͱͯ͠Ϧιʔε͕ੜͨ͠Γ͢Δ/api/v1/rankings/api/v2/rankings
l(SBQI2-ͰͲ͏ͳͷ͔z
GraphQL ͷҰൠతͳϝϦοτ👉ɹؔ࿈͢ΔσʔλΛάϥϑͱͯ͠औಘͰ͖Δ👍ɹΫϥΠΞϯτଆ͕ඞཁͳͷ͚ͩɹɹॊೈʹऔಘՄೳ👍ɹαʔόʔଆ୯ମͷϦιʔεͱɹɹͦͷؔΛهड़͠࠶ར༻ՄೳϦιʔεͷരൃมߋʹର͢Δॊೈੑ
͖ͬ͞ͷը໘͜͏ॻ͚Δ
͖ͬ͞ͷը໘͜͏ॻ͚Δseries.titleseries.author.nameseries.description
ผͷը໘Ͱʴα͚ͨ͠Ε…
ผͷը໘Ͱʴα͚ͨ͠Ε…࡞λΠτϧseries.descriptionseries.latestEpisode.titleseries.supportsTicketseries.likeCount
series.titleseries.author.nameseries.description
ผͷը໘Ͱ-α͚ͨ͠Ε…series.titleseries.author.nameseries.description
ॊೈੑόπάϯʂ
։ൃޮ(SBQIJ2-ศརͳ(SBQI2-ΫϥΠΞϯτ
ΧελϚΠζͨ͠Γ…https://developer.hatenastaff.com/entry/2021/05/14/093000
3&45ˠ(SBQI2-ͯ͠Έͨ͋͘Γ·ͤΜ͔
l1FSMͰͰ͖Δͷ͔ʁz
👍ͪΖΜͰ͖ΔࣾͰ࠾༻࣮͋ΓฐࣾͰ1FSMͳΒ͜ΕҰͱ͍͏ҹ
lͳʹΛ͢ΕΑ͍ͷ͔z
ઌʹεΩʔϚΛॻ͘
ͨͱ͑ series ͜͏ॻ͚Δ
series ͷΫΤϦ͜Ε͚ͩ
ղܾͷγεςϜ
ରԠ͢Δ࣮Λॻ͍͍ͯ͘Resolver
ରԠ͢Δ࣮Λॻ͘
͜͏ͯ͠εΩʔϚϑΝʔετͰఆٛˠ࣮Λ͍ͯ͘͠
جຊεΩʔϚͱ࣮ͷͭͳ͗͜Έ
εΩʔϚఆٛΛجʹ Resolver ࣮{ }Giga::GraphQL::Resolver::Query::SeriesGiga::GraphQL::Resolver::SeriesGiga::GraphQL::Resolver::AuthorGraphQL Schema
ൃలগ͠ؤுΓඞཁʹͳΔ͚ΕͲʜ
Τϥʔͷදݱ͍··ͰΤϥʔΛฦ͍ͯͨ͠෦Ͳ͏͢Δͷ͔ʁ
GraphQL ͷΤϥʔදݱ
ΤϥʔϋϯυϥʔΛಋೖErrorHandler{ }GraphQL::ErrorError ReportRaised Error ObjectError Response{ }QueryΤϥʔΛू🧨
Ͱ͖͕͋Δ
N+1
DataLoader Λಋೖ͢Δ
ϖʔδωʔγϣϯRelay GraphQL Cursor Connections Specificationhttps://relay.dev/graphql/connections.htm
ΞμϓλʔΛಋೖ͢ΔConnection RepositoryOffset = 20Limit = 10First = 10After = %ABC${ }
ύϑΥʔϚϯεͷऔΓΈطͷΫΤϦͷΩϟογϡΛࣄલ࡞͠ΥʔϜΞοϓ͢ΔఆظతʹΩϟογϡΛͭ͘ΔࣄલʹΫΤϦΛετοΫ͓ͯ͘͠ΞΫηε࣌ʹΩϟογϡ͕͋ͨͨ·ͬͯΔ
ܗ͕Ͱ͖ͨʂ
͋ͱίʔυΛॻ͚ͩ͘ʁ
ϑϩϯτΤϯυͰͷΘΕํʹΑͬͯٻΊΒΕΔεΩʔϚ͕ܾ·Δ"1*։ൃଆ͚ͩͰܾΊΒΕΔΘ͚Ͱͳ͍👱👱👨🦱👨🦰
App νʔϜͱ࿈ܞͨ͠ҙࢥܾఆΛ͍ͨ͠l྆νʔϜͰ߹ҙΛऔΓͳ͕ΒɹεΩʔϚΛܾΊ͍͖͍ͯͨzͱ͍͏ͷ͕3&45͔࣌Βड͚ܧ͕ΕΔߟ͔͑ͨ👱🤝👱🤝👨🦱🤝👨🦰
εΩʔϚϑΝʔετ™
ͨͩ…͍͠෦͕͋ΔεΩʔϚΛߟ͑Δ͜ͱ͕·͍ͣ͠εΩʔϚϑΝʔετΛ࣮ݱ͢Δ͠͞ϫʔΫϑϩʔతͳ͋͠͞Δ
ٕज़͚ͩͰͳ͍εΩʔϚϑΝʔετ
νʔϜӽڥͨ͠औΓΈඞཁ
զʑͷऔΓΈϧʔϓΓ͍ܾͨΊ͍ͨͷ͝ͱ͕͋Δ͖ͨͨΛߟ͑ΔձͰಉظతʹ૬ஊܾఆهΛ࣮͢͢Δ
1. ࣮ݱ͍ͨ͠ػೳ͕͋Δʮ͜ͷϞσϧΛͲ͏͍͏εΩʔϚͰఆٛ͠Α͏ʯ͜Ε
2. ͖ͨͨΛߟ͑Δw ͜͜Ͱ۩ମతͳεΩʔϚҊΛఏࣔͨ͠Γ͢Δw দകγεςϜͰෳҊΛఏࣔ͠ɼQSPTDPOTͰٞͨ͠Γ
3. ձͰಉظతʹ૬ஊw ຖΞϓϦνʔϜͷனձʹಥܸ͢Δw ͦ͜ʹʮ"1*૬ஊίʔφʔʯΛઃ͚ͯΒ͍ɼͦ͜Ͱձ͢Δw ि࣍(JHB(SBQI2-ձw ͜͜ͰΑΓ(SBQI2-"1*ʹಛԽ͍ͯ͠Δw ೖΓΜͩΛͨ͠Γ͢Δ
4. େ͖͍ܾఆهΛ͢w ҙݟ͕͍Ζ͍Ζ͋Δͱ͖ࠓޙʹؔΘΔେ͖ͳܾఆw ૬ஊͷܦҢΛࢀরͰ͖ΔΑ͏ʹ͢Δw େ͖͘ͳ͍ͱ͖୯ʹٞࣄʹॻ͚ͩ͘ϓϩμΫτͷهʹͨ͠Γ
༷ʑͳܾఆ͕ߦΘΕΔOVMMBCMF͔OPOOVMM͔ *%Ͳ͏͢Δ͔ͳΜͰ/PEFʹ͠ͳ͍ෳͷࣅͨܕΛΠϯλʔϑΣΠεʹͰ͖ͳ͍͔ΤϥʔϋϯυϦϯά৽ͨͳܕͷఆٛ
͜͏ͯ͠"1*͕
ΞϓϦ͕Ͱ͖͕͋Δ(JHB7JFXFSGPS"QQT͕Ͱ͖͕͋Δ
͞Βʹ Web Ͱ׆༻αʔόʔαΠυϑϩϯτΤϯυʹͱͬͯ׆༻͍͢͠ɽॊೈʹσʔλΛऔͬͯ͜ΕΔɽࠓޙΑΓ׆༻͕ਐΜͰ͍͘༧ఆɽ
·ͱΊ1FSMͰ(SBQI2-"1*Λ࡞Δͷ ࣮ΛՃͯ͠શવͰ͖Δʂ3&45"1*Ͱͷ։ൃޮͷ՝(SBQI2-ʹΑΓվળ͞ΕͨʂαʔόʔɾΫϥΠΞϯταΠυؒͷ࿈ܞ͕։ൃʹ͓͍ͯ؊ཁʂ
͋Γ͕ͱ͏͍͟͝·ͨ͠