ãå³è§£ã§æ¯èŒãREST vs GraphQL â APIèšèšã®2倧ã¹ã¿ã€ã«ã培åºè§£èª¬
ã©ã£ã¡ãAPIã®ãèšèšã¹ã¿ã€ã«ããªãã ãã©ãããŒã¿ã®åãæ¹ããŸã£ããéããã ããRESTã¯ããªãœãŒã¹ããšã«URLïŒãšã³ããã€ã³ãïŒãåãããã¹ã¿ã€ã«ã§ã/usersã/postsã/commentsã¿ããã«æ å ±ã®çš®é¡ããšã«ã¢ã¯ã»ã¹å ãå¥ã ã«ãªããã ã
ãããGraphQLã¯éãã®ïŒ
GraphQLã¯ã1ã€ã®ãšã³ããã€ã³ãã«ã欲ããããŒã¿ã®åœ¢ãã¯ãšãªãšããŠéããã¹ã¿ã€ã«ã ãã/graphqlãšãã1ã€ã®çªå£ã«ããŠãŒã¶ãŒåãšããã®äººã®æçš¿ã¿ã€ãã«ãšãã³ã¡ã³ãæ°ããã ãããã£ãŠæ³šææžãæž¡ãã€ã¡ãŒãžã ãã
ãªãã»ã©âŠRESTã ãšäœåããªã¯ãšã¹ãããªããšãããªãã®ïŒ
ãããªãã ããããšãã°ãŠãŒã¶ãŒã®ãããã£ãŒã«ãšæçš¿äžèЧãšã³ã¡ã³ããæ¬²ããå ŽåãRESTã ãš3åãªã¯ãšã¹ããå¿ èŠã«ãªãããšããããããããã¢ã³ããŒãã§ããã³ã°ãã£ãŠåŒã¶ãã ãéã«ããŠãŒã¶ãŒåã ãæ¬²ããã®ã«ãããã£ãŒã«å šéšãè¿ã£ãŠããããªãŒããŒãã§ããã³ã°ããšããåé¡ããããã
GraphQLãªãããããç¡é§ããªãã£ãŠããšãªã®ïŒ
ãã®éãïŒGraphQLã§ã¯ã欲ãããã£ãŒã«ãã ãããæå®ã§ããããã1åã®ãªã¯ãšã¹ãã§å¿ èŠãªããŒã¿ã ãéäžè¶³ãªãååŸã§ãããã ãããšãã°ãuser(id 1)ã® name ãš posts ã® title ã ãã¡ããã ããã¿ããã«ã¯ãšãªãæžããšãååãšæçš¿ã¿ã€ãã«ã ããè¿ã£ãŠãããã
ãã¡ããããããRESTã¯URLããšã«ãªãœãŒã¹ãåãããŠããããHTTPãã£ãã·ã¥ããããå¹ãããããã ããã©ãŠã¶ãCDNãã/users/1ã®ã¬ã¹ãã³ã¹ã¯5åéãã£ãã·ã¥ãã¿ããã«èªç¶ã«ãã£ãã·ã¥ã§ãããGraphQLã¯å šéšåãURLãžã®POSTãªã¯ãšã¹ãã ãããHTTPãã£ãã·ã¥ãå¹ãã«ãããã ããã
GraphQLã«ã¯åã·ã¹ãã ãããã£ãŠèãããã©ãããã£ãŠäœãªã®ïŒ
GraphQLã¯ã¹ããŒãå®çŸ©èšèªïŒSDLïŒã§ãã©ããªããŒã¿ãã©ããªåã§è¿ã£ãŠãããããå³å¯ã«å®çŸ©ãããã ããUseråã«ã¯idãnameãpostsããããã¿ããã«å®£èšãããã ãããã®ãããã§ããªã¯ãšã¹ããéãåã«ããã®æžãæ¹ã¯æ£ããããããã§ãã¯ã§ããããããã¥ã¡ã³ããèªåçæãããããRESTã ãšOpenAPIïŒSwaggerïŒã§åŸä»ãããå¿ èŠããããã ã
ãããå®éã«ã¯ã©ãããå Žé¢ã§ã©ã£ã¡ã䜿ãã®ãããã®ïŒ
RESTã¯ããªãœãŒã¹ãã·ã³ãã«ã§ããã£ãã·ã¥ãéèŠãªãšããã«åããŠãããå ¬éAPIãããã€ã¯ããµãŒãã¹éã®éä¿¡ã«å€ãããGraphQLã¯ãããã³ããšã³ããè€éã§ãç»é¢ããšã«å¿ èŠãªããŒã¿ãéããšããã«åšåãçºæ®ãããå®éãGitHubã¯API v3ãRESTã§ãv4ãGraphQLã«åãæ¿ãããã ãã
æåãªãµãŒãã¹ã§ãGraphQLã䜿ã£ãŠããã ãïŒ
ãããšããã«æ°ã¥ããããGraphQLã§ã¯ãã¹ãããããŒã¿ã1åã®ã¯ãšãªã§åãããã©ããµãŒããŒåŽã§ã¯ããŠãŒã¶ãŒäžèЧãååŸïŒ1åïŒâ åãŠãŒã¶ãŒã®æçš¿ãåå¥ã«ååŸïŒNåïŒãã¿ããã«DBåãåãããççºããããšããããã ããããN+1åé¡ã察çãšããŠDataLoaderãšããã©ã€ãã©ãªã§ããŸãšããŠãããååŸãããã®ãå®çªã ãã
ä»ã«ãGraphQLã®éçšã§æ°ãã€ããããšã£ãŠããã®ïŒ
ããã©ãŒãã³ã¹é¢ã§ã¯ãPersisted QueriesïŒæ°žç¶åã¯ãšãªïŒããéèŠã ããã¯ã©ã€ã¢ã³ããæ¯åé·ãã¯ãšãªæååãéã代ããã«ãäºåã«ãµãŒããŒã«ç»é²ããã¯ãšãªã®ããã·ã¥ã ãéãä»çµã¿ã§ãã»ãã¥ãªãã£ãšããã©ãŒãã³ã¹ã®äž¡æ¹ãåäžãããå€§èŠæš¡éçšã§ã¯ãFederationããšãã£ãŠãè€æ°ã®GraphQLãµãŒããŒã1ã€ã®ã¹ããŒãã«çµ±åããæè¡ã䜿ãããŠããã ãApollo Federationãæåã ãã
æè¿ã¯tRPCãšããéžæè¢ã泚ç®ãããŠãããTypeScriptã®ãã«ã¹ã¿ãã¯éçºã§ãAPIã®åããµãŒããŒãšã¯ã©ã€ã¢ã³ãã§èªåå ±æã§ãããã ãã¹ããŒãå®çŸ©ãªãã§åå®å šãæã«å ¥ããããNext.jsãªã©TypeScriptçµ±äžç°å¢ã§ã¯éåžžã«åŒ·åã ããRESTã»GraphQLã»tRPCãããããã®åŒ·ã¿ãçè§£ããŠäœ¿ãåããã®ãçŸä»£ã®APIèšèšã®åºæ¬ã ãã