GraphQLに入門した
仕事でGraphQLを使うようになったので、入門した感想や学びをまとめます。
この記事は GMOペパボ エンジニア Advent Calendar 2024 の12日目です。
GraphQLとの出会い
2024年9月に、EC事業部からSUZURI事業部へ異動しました。
SUZURIではGraphQLが採用されており、これまで聞いたことしかなかったGraphQLを初めて使うことになりました。
これまでほぼRESTで生きてきたので、なかなか衝撃的でした。「クライアントが好き勝手に複雑な構造のクエリを要求して、ちゃんとその構造の通りに、一発でデータを返してくれる…?そんなことある…?」となりました。
実際に学び、触れていく中で、そのシンプルで無駄のない仕組みに惹かれていきました。 また、競技プログラミングなどでグラフ関連のアルゴリズムを学んでいた経験があったため、データをグラフとして扱う考え方も面白く感じたポイントでした。
GraphQLのおもしろポイント
RESTはリソースとそれらの操作という考え方ですが、GraphQLではクライアントが必要なデータのみを指定して取得できる仕組みを提供しています。本当に必要な情報を過不足なく取得できるのは、通信の効率性という面で大きな利点といえるでしょう。
また、リソースをグラフとして捉えるアプローチは、GraphQLのスキーマにモデル間の関係をそのまま活かせる点が魅力です。ActiveRecordを使用しているプロジェクトでは、既存のモデリングを自然な形でAPIに反映できます。
開発時の注意点
アクセスが制限されるリソースに対して適切な制限を適用することが重要です。
もちろんこれはGraphQLに限ったことではありませんが、GraphQLでは入口を塞いでも回り道でアクセスされてしまうことに注意が必要です。
例えば、ルートの user フィールドにのみアクセス制限を適用している場合、
query {
user {
address
}
}
のようなクエリには認証エラーを返せますが、
query {
post {
author {
address
}
}
}
のように間接的にアクセスすると、個人情報を取得できてしまうかもしれません。
(これについては、GraphQL RubyのAuthorizationのドキュメントでより詳しくRESTとGraphQLの違いが説明されています。)
入口ではなく、リソースそのものにアクセス制限を適用することで、このような問題を防げます。
GraphQL Rubyなら、authorized?
などが利用できます。
パフォーマンス面では、(これもGraphQLに限ったことではありませんが)N+1に注意する必要があります。 DataLoaderなど、効率化するための仕組みを活用しましょう。
学習方法とおすすめリソース
同僚におすすめされた「初めてのGraphQL ―Webサービスを作って学ぶ新世代API」(O’Reilly Japan)が参考になりました。 背景・歴史(第一章)やグラフ理論(第二章)などから始まっていて、GraphQLの本質的な部分から理解を深めることができ、「なぜGraphQLなのか」という根本的な疑問に答えてくれる内容でした。
GraphQL公式サイトのLearnセクションもコンパクトにまとまっていて、とても参考になります。 インタラクティブに試せるサンプルも用意されているので、実際に触って感覚を掴みたい方におすすめです。 ベストプラクティスについてもまとめられています。
最後に
GraphQLは「必要な情報を過不足なく取得する」という考え方を実現した、シンプルながら強力なアプローチです。適切に使いこなすことで、クライアントの要求に柔軟に応えつつ効率的な通信を実現できるでしょう。
また今回は触れませんでしたが、データの更新もGraphQLで行えますし、subscriptionを使えばリアルタイム向けの機能も実現できるところも面白いです。
ただし、アクセス制御やパフォーマンスなど、実装時に注意すべきポイントもあります。これらに適切に対応することで、GraphQLの利点を最大限に活かすことができるでしょう。
まだGraphQLを使ったことがない方、ぜひ一度触ってみてください。