こう 聞かれます
- 「REST と GraphQL、
どちらを 選びますか」 - 「GraphQL の
良い 所と、 困る 所を 教えてください」 - 「フロントエンドと
サーバーで、 データの 型を そろえるには どうしますか」
面接官が 見ている点
- 流行りで
選ばず、 「どんな 条件なら どちらか」で 答えられるか - REST は HTTP の
キャッシュが 効きやすい、という 違いを 知っているか - 取りすぎ (要らない
項目まで 来る ) と 足りなさ (何度も 呼ぶ) を、例で話せるか - 型を
そろえたいだけなら、 OpenAPI からの 型の 生成や tRPC という 別の 手も ある、と言えるか
短い答え
- 多くの
場合は REST で 十分です。 作りが 簡単で、 HTTP の キャッシュも 効きやすいので、 まず REST から 考えます。 - 画面ごとに
欲しい データの 形が 大きく 違い、 取りすぎや 足りなさが 目立つときは、 GraphQL を 選びます。 - 型を
そろえたいだけなら、 OpenAPI からの 型の 生成や tRPC でも 叶うので、 それだけを 理由に GraphQL に はしません。
少し 詳しい答え
REST の強み
REST は、
特に、
GraphQL が効く場面
GraphQL は、
たとえば、
http
GET /users/7
GET /users/7/ordersGraphQL なら、
graphql
query {
user(id: 7) {
name
orders { id total }
}
}スマホの
トレードオフ
GraphQL にも
- キャッシュが
効きにくい 1 つの 窓口へ POST で 問いを 送る ことが 多く、 HTTP の キャッシュを そのままは 使いにくいです。 クライアント側の キャッシュの 仕組みを 別に 用意する ことになります - 重い
問いを 送られやすい 深く 入れ子に した 問いで、 サーバーが 重くなる ことがあります。 問いの 深さや 重さに 上限を付けます - サーバー側で N+1 が
起きやすい 項目ごとに DB を 引くと 問い 合わせが 増えます。 まとめて 取る 仕組み (DataLoader など ) で防ぎます - 権限を
項目ごとに考える 1 つの 窓口から 何でも 取れるので、 どの 項目を 誰に 見せて よいかを 丁寧に決めます
だから、
型を
話すときは、
よく ある間違い
- 「GraphQL の
ほうが 新しいから 良い」と言う 新しさではなく、 画面ごとの 形の 違いが 大きいか、 キャッシュを 効かせたいか、で選びます - GraphQL の
弱点を知らない キャッシュの 効きにくさ、 重い 問い、 サーバー側の N+1、 項目ごとの 権限、を 挙げられるようにします - 型の
共有だけを 理由に GraphQL にする OpenAPI からの 型の 生成や tRPC でも叶います
深掘りの問い
- 「GraphQL で N+1 が
起きるのは なぜですか」 項目ごとに 取りに いく 関数が 1 件ずつ DB を 引くからで、 同じ 種類の 取り出しを まとめる 仕組みで 防ぐ、と答えます - 「REST で
取りすぎを 減らすには」画面に 合わせた 住所を 足す、 返す項目を 問い合わせの 引数で 選べるように する、 などを挙げます - 「公開 API なら
どちらにしますか」 外の 人が 使うなら、 HTTP の 決まりに 沿っていて 分かりやすく、 キャッシュも 効く REST が 無難な ことが 多い、と答えます