minneはなぜGraphQLを推進しているか
そして、内容も素晴らしく、実際GraphQLを使うにあたって気をつけないといけない認可の話や、N+1の話などに言及されていました。ぜひ、arumaさんの記事もご覧下さい。 さて本題
今回のブログの内容は以下のSpeaker Deckで挙げているスライドの内容となりますので、シュシュっと読みたい方は以下のリンクから遷移ください👍
minneとは
minneは、ハンドメイド作品を「売りたい人」と「買いたい人」をつなぐハンドメイドマーケットです。パソコンやスマートフォンを使って、作品の販売や購入が簡単に行えます。
https://gyazo.com/ab2ff354783bb50b9fb6f5d1f5f3fe01
なぜGraphQLを推進しているのか
https://gyazo.com/e9d5b5c0a28bbcbef01738ecca0816e0
問題意識
まず、プロダクト開発の前提として、「より速く価値を提供する」ことが重要な目標となっています。我々は競合に勝るプロダクトを提供しなければならないのです。
そして、今後もやはりweb、iOS、Android各プラットフォームのソフトウェアのメンテナンスが必要であることに変わりはありません。アプリだけあれば良いかと言えば、購入者が検索流入するときに不便ですし、webだけあれば良いかといえば、モバイル端末のすべての機能を使える訳ではありません。
そこで、ことwebについて、モバイルファースト・ユーザーの体験価値の向上にあたって、どこまでRailsだけでやるか、というトピックがありました。(かつてminneは提供する画面にRailsのテンプレートviewを利用していました)
https://gyazo.com/67b15b6328ea3805223c43f45d297665
ユーザーの体験価値向上にあたっては、JSによってインタラクティブなUIを提供していく必要があります。
Railsの上のJSでリッチな表現を実現し続けていくことのいくつかの難しさ
例えば、minneのプロダクト開発においては、デザイナーがフロントエンドを開発する場面が数多くあります。 そこで、もしRailsの上でのフロントエンド開発となるならば、少なからず幾らかのRailsの知識が必要となってきます。 また、フロントエンドのテストを記述するにあたって、コンポーネント単位でのテストをすることが難しかったり、JSのコンパイルなどにおいて、リリースフローに問題が生じた時、ピュアなRubyコードの差分のリリースに影響を及ぼしブロッキングになる可能性がありました。
BFF(Backend For Frontend)としてのRails
そこで、RailsをBackend for Frontendとして、Next.jsでフロントエンドを提供することで、ユーザーの体験価値の向上の出発点としました。 https://gyazo.com/d08dc00fdf2dbab4e4b0700082b1ea0a
そこに、GraphQLを用いることで、更なるユーザーの体験価値の向上および、より速い価値提供を目指しました。 カスタムしながら理解するGraphQL Connectionにて分かりやすく解説されているのですが、GraphQLでは1度のリクエストで必要なデータ(ノード)を指定して取得できるので通信効率が向上します。また、不要になったデータ(ノード)があれば、バックエンド、つまりAPIの修正の必要無しに、クライアント側の変更だけで対応が完了します。 https://gyazo.com/74188e5d94a0693fc6020b5468e39f9c
https://gyazo.com/fa0401cca17a33a9ac9a9ab1c6b734c8
Next.jsでのviewの提供によってこれまでよりリッチな体験を提供しつつ、GraphQLを使ったより効率的なデータの取得によって、ユーザーの体験価値の向上を図りました。
また、開発者体験としても、フロントエンドとバックエンドが疎結合になったことで開発の複雑性が下がり、より速く価値のデリバリーができるようになりました。
https://gyazo.com/ca82c95441942302d9e8438340dbea78
具体的な進め方を少し
とはいえ、もう2012年から始まったサービスであり、Rails viewの画面数が数百ページもあります。そのため、段階的にRailsのviewで作っている画面をNext.jsで作る画面に移行していっております。
https://gyazo.com/1b0b0751c84346364479c1194bc4d25a
https://gyazo.com/ad21eba1d27333e855bda93ed1b597de
https://gyazo.com/bbfb8af231717960f5b4d3f88ef75e9a
終わりに
GraphQLの導入は、minneの開発効率を向上させるだけでなく、ユーザーに迅速で高品質な体験を提供する土台にもなっています。しかし、これが銀の弾丸とは考えておらず、状況に合わせて柔軟に技術を用いて、多様なプラットフォームで最高のユーザー体験を提供するために、チーム一丸で取り組んでまいります!