こちらの発表で使用した資料です https://standfm.connpass.com/event/239750/
にGraphQLを導入して、半年。〜導入経緯や技術選択、現状や将来について〜by spice(@rabspice)on 2022/03/03 @ TECH STAND #7 GraphQL
View Slide
自己紹介@rabspice・2021年6月stand.fm入社・React Native / React / express などで アプリ/ Web / バックエンド を実装している・マリオカート(switch)をほぼ毎日やってる (やってる人いたらフレンドになりましょう) spice (Yugo Ogura)
stand.fmでは2021年10月頃からGraphQLを使い始めました。今回は・GraphQLの導入理由・技術選定話・実際に導入しての苦労話についてお話しします!※時間がないのであんまり深ぼれなさそう。聞きたことがあったらQ&Aセクションで
目次1. GraphQL導入の理由2. ライブラリの技術選定理由3. 「新機能はGraphQLでやってみよう!」の苦労4. 現状とこれから0. stand.fmのアーキテクチャ
stand.fmのアーキテクチャ
stand.fmのアーキテクチャAppWebReact NativeReactReduxapp serverweb serverDB音声系処理課金系処理その他色々な処理※ 全てJSなので、1人がフロント~バックエンド実装を担当することもしばしば
GraphQL導入の理由
・既存のRedux Storeをアプリ上で効率的に使うことが難しかった ・APIコールのキャッシュとして使いたいけど、複雑すぎて開発コスト高いGraphQL導入の理由
・コンポーネントの依存するデータが追いにくく、バグが頻発していた ・undefined参照でアプリが落ちるとか・既存のRedux Storeをアプリ上で効率的に使うことが難しかった ・APIコールのキャッシュとして使いたいけど、複雑すぎて開発コスト高いGraphQL導入の理由
・コンポーネントの依存するデータが追いにくく、バグが頻発していた ・undefined参照でアプリが落ちるとか・既存のRedux Storeをアプリ上で効率的に使うことが難しかった ・APIコールのキャッシュとして使いたいけど、複雑すぎて開発コスト高いGraphQL導入の理由・クライアントからサーバーサイドにビジネスロジックを寄せたい・本来ならAPIを変更すべきところを、アプリ側の変更で吸収しがち・見通しが悪かったりテストが描きにくかったり
Q. GraphQLじゃなくてもよかったのでは?リファクタがんばるSWRやReact QueryGraphQL(with Relay)APIのキャッシュコンポーネントの依存データ整理ビジネスロジックをサーバーに
ライブラリの技術選定理由
採用したGraphQL関連ライブラリApollo FederationRover CLIDataLoadergraphql-codegenRelay
ApolloGatewayGraphQL関連部分のアーキテクチャAppWebapp serverweb serverCoreServerRelayRover CLIgraphql-codegenDataloaderschema/型生成
Q. なぜ Relay ?「コンポーネントが必要なデータの定義を同ファイルに書くことを強制しやすい」のが良い。(Apollo Clientはデフォルトでやりにくい)
コンポーネントファイルの中に必要なデータの定義を書く実際にデータを使う時はRelayが用意するhooksでデータを取り出す子
子 親親でもRelayのhooksを使ってデータを取り出す子にはデータが含まれるオブジェクトを渡す子コンポーネントで必要なFragment(データの定義)を必ず展開
このあたりのRelayのコンセプトは、公式ドキュメントの「Principles And Architecture > Thinking in Relay」に書いてあります。https://relay.dev/docs/principles-and-architecture/thinking-in-relay/
Q. Relayのサーバー仕様を満たすの面倒では言うほどでもなさそうですまた、これによりクライアント側で便利なRelayの関数がたくさん使えるのでメリットがかなり上回ってる感じがあります
Q. なぜ Apollo Server・JSのGraphQLサーバーライブラリは他に目ぼしいものがなさそうだった ・RelayとApollo Serverの組み合わせは特に問題ないです・既存のサーバーの構成に則りたい・今後複数のGraphQLサーバー組み合わせたいApollo ServerApollo Federation
新機能はGraphQLでやってみよう!の苦労
0から学んで実装はとにかく時間がかかった・最初の数人がとにかく頑張って数個の機能を実装したけど大変 ・サーバー側/アプリ側の実装のパラダイムシフト ・何も考えないとRESTの設計に引きづられてGraphQLの理解が進まない
0から学んで実装はとにかく時間がかかった・⇨ slackに#z-graphqlを作り、知見の集約・⇨ドキュメント読む会を開催して全体で理解しやすく ・https://graphql.org/learn/ ⇨ GraphQL自体 ・https://www.apollographql.com/docs/apollo-server/ ⇨ サーバー実装 ・https://relay.dev/ ⇨ フロント実装・⇨ 初めて実装する人は、ペアプロで学習コストを下げたり
・組織内に知見が少なくて参考になるコードも少ない ➡ 工数増加で実装に遅れが💦・工数増加は一時的で、将来回収できるコストだとエンジニアは認識・代表「長期的にメリットあるなら大丈夫です。やりましょう。」・エンジニア「❤」実装工数の一時的な増加
現状とこれから
現状とこれから・新機能は基本GraphQLで開発・既存機能は適宜GraphQLで置き換えている・Relayを使いながらReduxからうまく脱却する・エラーハンドリングや負荷対策・Relay関連の知見についてはたくさんブログを書きたいと思っています(!)
質問があればQ&Aセクション or Meety で!Thank you !