IT-Q

generateMetadata の中でもデータを取得すると、同じ取得が2回走りませんか。

同じ fetch であれば重複排除されます。公式にも、コンポーネントツリー内の同一リクエストは既定でメモ化されるため props で引き回さなくてよい、と書かれています。

面接官が見ているのはリクエストメモ化を知っているか。

これは「ページごとにタイトルや OGP を設定したい。どうしますか。」への追撃質問です。

よくある答えと、面談でどう見られるか

  • 同じ fetch であればリクエスト内でメモ化されるので1回で済む
    公式に記載があります。ORM で直接叩いている場合は効かない点まで押さえられると強いです。
  • 2回走るので、取得結果を上位で1回だけ取って渡す設計にする
    fetch ならメモ化されるので、その前提は不要です。ただし ORM を直接使っている場合は実際に2回走るので、状況次第では正しい判断になります。
  • メモ化されるので、ORM で直接DBを叩いている場合も1回になる
    メモ化が効くのは fetch です。ORM の呼び出しには自動では効きません。ここを混同すると、クエリが倍になっていることに気づけません。
  • generateMetadata は別プロセスで動くので、必ず2回になる
    別プロセスではありません。同じリクエストの処理の中で呼ばれます。

面接官は何を見ているか

  • 同一リクエスト内で重複排除される仕組みがあると知っている
  • fetch のメモ化に触れた
  • 心配なら計測する、という姿勢がある

模範解答

同じ fetch であれば重複排除されます。

公式には「React コンポーネントツリー内の同一の fetch リクエストは既定でメモ化されるので、props で引き回さずに必要なコンポーネントで取得してよい」と書かれています。generateMetadata と page で同じ URL を fetch していれば、実際に飛ぶのは1回です。

注意が要るのは fetch を使わない場合です。ORM で直接DBを叩いているなら、この仕組みは効きません。その場合は自分でリクエスト単位のキャッシュに包むか、2回走ることを許容するかの判断になります。

いずれにせよ、心配なら実際にクエリログを見て確認します。「たぶんメモ化される」で済ませないところが分かれ目です。