넥스트js로 프로젝트를 하며 이상한 현상이 발생했다.

const LogDetailPage = async ({ params }: LogDetailPageProps) => {
  const { logId } = await params;
  const result = await fetchLog(logId);
  
  const { data: logData } = result;
  return (
    <div>
      <LogThubmnail logData={logData} isAuthor={isAuthor} />
      <main className="flex flex-col px-4 web:px-[50px]">
        //문제의 부분(LogAuthorIntro)
        <LogAuthorIntro userId={logData.user_id} logDescription={logData.description ?? ''} />
        ...
    </div>
  );
};
LogAuthorIntro를 보면 유저 아이디를 받고 있다.
interface LogAuthorIntroProps {
  userId: string
  logDescription: string;
}
const LogAuthorIntro = async ({ userId, logDescription }: LogAuthorIntroProps) => {
  const user = await getPublicUser(userId);
  return (
    <div className="web:grid grid-cols-[1fr_4fr] gap-[15px] py-5 space-y-1">
      <LogProfile
        userId={String(user?.user_id)}
        userImage={String(user?.image_url)}
        userNickname={String(user?.nickname)}
      />
      <pre className="text-light-400 text-text-sm web:text-text-lg py-1.5 pre">
        {logDescription}
      </pre>
    </div>
  );
};
export default LogAuthorIntro;
App Router의 SSR은 Streaming 기반
// 하위에서 직접 await fetch → 이 시점엔 데이터가 안 왔을 수 있음
const LogAuthorIntro = async ({ userId }) => {
  const user = await getUser(userId); // undefined 위험
  return <div>{user.nickname}</div>;
};
<Suspense>로 감싸야 한다.const LogDetailPage = async ({ params }) => {
  const log = await fetchLog(params.logId);
  const user = await getPublicUser(log.user_id); // 부모에서 먼저 fetch
  return (
    <LogAuthorIntro user={user} logDescription={log.description ?? ''} />
  );
};
const LogAuthorIntro = ({ user, logDescription }) => {
  return (
    <div>
      <LogProfile userId={user.user_id} ... />
      <pre>{logDescription}</pre>
    </div>
  );
};
import { Suspense } from 'react';
<Suspense fallback={<div>Loading author...</div>}>
  <LogAuthorIntro userId={logData.user_id} logDescription={logData.description} />
</Suspense>
서버 컴포넌트 + await라고 무조건 안전한 건 아니다.
App Router의 SSR은 스트리밍 기반이기 때문에, 데이터를 기다리지 않고 먼저 렌더링될 수 있다.
서버 컴포넌트라서 안전하겠지라는 기대는 App Router에선 반드시 다시 점검해봐야 겠다.