これは本当にただのメモ書きで、これがベストプラクティスだとかいう話ではないので、同じようなことを考えてる人いたら今度議論しましょうよ、って程度の話の種。GraphQLを使うべきスポット、RESTfulが好ましいスポットについて今日ぼんやり考えていて、なんとなく言語化ができる気がするので文字起こししてみる。「データ」を構成する「リソース」を提供するものアプリケーションの「ユースケース」がもつシナリオのなかで登場する「データ」部分を埋めるためのものを区別することが必要そう、と思っている。(BFR)と呼ぶことにする。これはわかりやすくて、これはまさしくRESTfulそのもの。RDBやそうじゃないDB、あるいはファイルストレージかもしれない永続化されたリソースにURIを付与し、外部からアクセス可能にするのが役目。BFRの設計はリソースのスキーマに依存する。(BFU)と呼ぶことにする。これがGraphQLが向いていそうなところ。フロントエンドのユースケースのなかで、永続化されたデータが必要になった時の問い合わせ先。BFUの設計はフロントエンドのユースケースに依存する。なんで分けたいのかBFFの文脈でいろんな理由が挙げられているとは思うが、個人的にはそのシステム自体のライフサイクルの違いに合わせた分割が、柔軟な開発サイクルを支えてくれるんじゃないかと思っている。フロントエンドはユーザーが触れる最前線にあるので、UXの改善、ユースケースの再設計は成長段階のプロダクトにおいて頻繁に発生する。フロントエンドについては一旦諦めるとして、バックエンドの中には、そうしたユースケースの再設計に巻き込まれてもしょうがない部分とそうでもなさそうな部分がある。前者が、「ユースケースに対するデータプロバイダー」としてのバックエンド、つまり上述のBFUで、後者が「リソースコンテナ」としてのバックエンド、つまりBFRじゃないかと思う。ユースケースが再設計されたとしても、リソース自体に変化があるわけじゃないなら、その部分は残したい。ユースケースに依存する範囲を明確に分けたい、というのが僕のBFU/BFRに対するモチベーションの大きな部分。その境界でバックエンドのサーバーごと分けてしまうというのは、昨今のコンテナ化の流れにもマッチしてそうな気がする。なんでBFUはGraphQLがよさそうかフロントエンドのユースケースの中では目的が必ず存在してデータ要求が生まれる。すごく単純化したら「ID=2のUserのデータがほしい」ではなく「ID=2のユーザーの名前を表示するためのデータがほしい」という話で、そのユースケースにとってはユーザーの名前がUserテーブルのNameカラムに保存されているとかそんなことはどうでもよく、ただユーザーの名前がほしい、というニーズだけがある。BFUがない場合は、フロントエンドのなかでBFRから受け取ったデータをユースケースに合った形に自分で整形することになる。BFRが拡張されてユースケースを受け入れはじめるかのどちらか。BFUがある場合は、フロントエンドはBFUにユースケースを投げつける。ユースケースを定義するのはフロントエンドの仕事なので、GraphQLのようにフロントエンドでほしいデータの形を定義するのがマッチするはず。フロントエンド、BFU、BFRが分かれたとき、それぞれのシステムのライフサイクルは次のようになる。悲しいことにフロントエンドはまっさきに壊されるが、それは宿命として諦めるとして、BFUがあることでBFRは長生きすることができる。やっちゃいけないことBFUは「ユースケースに対するデータプロバイダー」としてのバックエンドであるから、常に実装の要件はフロントエンドのユースケースによって決定される。そのため、次のことはやってはいけない。「DBからデータが取れるから」というボトムアップで実装すること本来依存しなくてもよい部分にBFRへの依存が発生する。複数のユースケースをひとつのqueryで対応しようとするたまたまスキーマが似ているだけでDRY的にまとめるのは本来関係をもつはずのないユースケース間の関係を生んでしまうBFUは常にアプリケーションのために存在するが、BFRはアプリケーションが無くても成立する。今日10分くらい会社でryopekoさんと雑談してたネタなのであまりしっかり練った考えではないけど、こんな感じのシステムを作って試してみたい。読者になる@laco2netをフォローらこらこファンクラブhttps://www.patreon.com/lacolacoPatreonで支援を受け付けています。(5)月別アーカイブはてなブログをはじめよう!lacolacoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。