RESTãšGraphQLã®éã â ååã«ãŒãã«ã欲ããæ å ±ãããããã
ååã«ãŒãã«å¿ èŠãªæ å ±ãé Œã
ååã«ãŒãã«å¿ èŠãªã®ã¯ãååãšå€æ®µã
åãååããŒã¿ã§ããäžèЧç»é¢ã«ã¯ååãšå€æ®µã詳现ç»é¢ã«ã¯èª¬ææãåšåº«ã欲ãããããããŸããããŸãç»é¢ãå¿ èŠãšããé ç®ãçŽã«æžããšããããå§ããŸãã
以äžã¯ä»æ§ãæ¯ã¹ãããã®æ¶ç©ºã®ååAPIã§ããå®éã«ã¢ã¯ã»ã¹ããURLãããã®ãŸãŸåããµãŒããŒã§ã¯ãããŸããã
HTTP APIã®äŸ
GET /products/42 ã«å¯ŸããŠãèšèšããååã®è¡šçŸãè¿ããŸãã
{
"id": 42,
"name": "ãã°ã«ãã",
"priceYen": 1200,
"description": "ã²ããã®çµµãå
¥ã£ãã«ãã"
}
ç»é¢ã説ææã䜿ããªããªãååŸããæ å ±ãäœããŸãããã ãRESTã§ãååŸé ç®ãæå®ããæ©èœããç»é¢ã«åãããéçŽãèšèšã§ããŸãããRESTã¯å¿ ãå šéšè¿ãã»å¿ ãè€æ°åããšæ±ºãŸã£ãŠããŸããã
GraphQLã®äŸ
ãµãŒããŒã®ã¹ããŒãã« product(id: ID!) ãšå¯Ÿè±¡ã®ãã£ãŒã«ããããå Žåãæ¬¡ã®ããã«éžã¹ãŸãã
query ProductCard {
product(id: "42") {
name
priceYen
}
}
ãã®èšèšã§ååã®ååŸã«æåãããšãã®å¿çäŸã§ãã
{
"data": {
"product": {
"name": "ãã°ã«ãã",
"priceYen": 1200
}
}
}
è¿ãé ç®ã泚æã«å¯Ÿå¿ããŠããããšãèŠãŠã¿ãŸããããèªå¯ã»ååŸå€±æã»nullableã®èšèšã«ãã£ãŠã¯ããšã©ãŒãnullãå«ãå¿çã«ããªããŸãã
éžã³æ¹ã®å ¥å£
| èŠ³ç¹ | RESTã軞ã«ããHTTP API | GraphQL |
|---|---|---|
| ååŸã®åœ¢ | ãªãœãŒã¹ã®è¡šçŸãååŸé ç®ãèšèš | å ¬éã¹ããŒãã®ãã£ãŒã«ããéžæ |
| ãã£ãã·ã¥ | GETãšHTTPãã£ãã·ã¥ã®èšèšãç¢ºèª | POSTäžå¿ããqueryã®GETã«å¯Ÿå¿ãããç¢ºèª |
| å¥çŽ | OpenAPIãªã©ã§å ¥åºåãèšè¿°ã§ãã | ã¹ããŒããšã¯ãšãªæ€èšŒã䜿ã |
| å éšåŠç | éçŽæ¹æ³ã»DBåæ°ãç¢ºèª | ãªãŸã«ããŒã®DBåæ°ã»åŠçéãç¢ºèª |
| éçš | èªèšŒã»èªå¯ã»å¶éã»ç£èŠãå¿ èŠ | åããå¿ èŠãåã ãã§ã¯ä»£æ¿ããªã |
ãŸã1ç»é¢ã®å¿ èŠé ç®ãããããéä¿¡éã»åŸ ã¡æéã»å®è£ ã®è€éããæ¯èŒããŸããç»é¢ãå€ãã圢ãå€ããããšãã£ã課é¡ããããªãGraphQLã詊ãçç±ã«ãªããŸããå°å ¥ããã ãã§éããªãããã§ã¯ãããŸããã
ããå°ã詳ããïŒ1åã®èŠæ±ã®è£åŽ
N+1ã¯ãäžèЧ1åïŒè¡ããšã®ååŸNåãã®ãããªåãåããã§ãããŸãšããŠèªãä»çµã¿ãDataLoaderã§æ¹åã§ããŸããããããã¯ãŒã¯ã®èŠæ±æ°ã1ã ããDBã1åãšã¯éããŸãããããŒãžã³ã°ãã¯ãšãªã®æ·±ãã»ä»¶æ°ã»ã³ã¹ãã®å¶éãæš©éã®ç¢ºèªãèšèšããŸãã
APQïŒAutomatic Persisted QueriesïŒã¯ã¯ãšãªæ¬æã®ä»£ããã«ããã·ã¥ãªã©ã®èå¥åãéãæ¹åŒã§ããApolloã®APQã§ã¯ãæªç»é²ã®ãšãã«æ¬æãéãç»é²ããŸããèš±å¯æžã¿ã®ã¯ãšãªã ãã«å¶éããä»çµã¿ããèªå¯ã®ä»£ããã«ã¯ãªããŸãããGETã®queryãæ°žç¶åã¯ãšãªã§ãã£ãã·ã¥ããããããå Žåããå©çšè ããšã®ããŒã¿ã誀ã£ãŠå ±æããªãããã«ããŸãã
TypeScriptã§ãµãŒããŒãšã¯ã©ã€ã¢ã³ããçµ±äžãããªãtRPCãåè£ã§ããåå ±æã圹ç«ã€äžæ¹ã§ãå€éšã®å©çšè ã䜿ããèšèªãå®è¡æã®å ¥åæ€èšŒãªã©ãèæ ®ããŸããå¥ã®éžæè¢ãå¢ããåã«ã誰ãäœãåããããããæ±ºããŸãããã
éä¿¡ãã®ãã®ã¯HTTPã®ä»çµã¿ãåä»ãã®ãªã¢ãŒãåŒã³åºãã¯gRPCãšRESTã§åŠã¹ãŸãã
åèè³æ
2026幎10æ9æ¥ç¢ºèªã
- Fielding â REST â èšèšå¶çŽ
- GraphQL â Serving over HTTP â POSTã»GETã»å¿çã®åœ¢
- GraphQL â Performance â N+1ã»ãã£ãã·ã¥ã»åŠçéã®å¶é
- GitHub â API comparison â 䜵çšãšæ©èœå·®
- Apollo â APQ â ååã®æ¬æç»é²ãšèå¥å
- tRPC â Introduction â TypeScriptã®åå ±æ