
1. 당연한말
2. 사전렌더링 과정에서 한 번 실행되고, hydration 때 또 한 번 총 두 번 실행
3. 사전 렌더링 과정에서는 문제가 없겠지만 hydration 때 서버 컴포넌트 코드는 실행되지 않기에 런타임 에러 발생할 것
4. 사전 렌더링 때는 일단 서버 컴포넌트 먼저 RSC Payload로 변환되고 그 다음에 클라이언트 컴포넌트를 실행시켜 html을 생성하는데 이때 RSC Payload는 직렬화된 형태 함수는 직렬화 될 수 없어 전달 불가능
Request Memoization
Data Cache
둘의 관계
서버 컴포넌트만 해당(클라이언트 컴포넌트는 페이지 유형에 영향 x)
Static Page(Full Route Cache 적용됨)
Dynamic Page
특정 페이지가 접속 요청을 받을 때마다 매번 변화가 생기거나, 데이터가 달라질 경우


Full Route Cache도 내부 컴포넌트 중 revalidate 옵션이 걸린게 하나라도 있으면 같이 revalidate 됨

공동된 레이아웃 같은 거 캐시에 보관 -> 새로고침하면 사라짐
<Suspense key={searchParams.q || ""} fallback={<div>Loading...</div>}>
<SearchResult q={searchParams.q || ""} />
</Suspense>
원래 suspense는 처음 한 번 렌더링 이후에는 다시 로딩상태로 돌아가지 x -> key값을 주어 key값이 변경될 때마다 suspense를 새로 생성하게 하면 로딩상태 유지 가능(리액트는 key값이 달라지면 새로운 컴포넌트라고 인식하기때문)
"use client";
import { useRouter } from "next/navigation";
import { useEffect } from "react";
export default function Error({
error,
reset,
}: {
error: Error;
reset: () => void;
}) {
const router = useRouter();
useEffect(() => {
console.error(error.message);
}, [error]);
return (
<div>
<h3>오류가 발생했습니다</h3>
<button
onClick={() => {
startTransition(() => {
router.refresh();
reset();
});
}}
다시 시도
</button>
</div>
);
}
-> 그럼 refresh만 하면 되는 거 아닌가? : ㄴㄴ reset()은 에러 상태를 초기화 시켜주는 역할도 하기에 필요함
layout, error, loading 페이지들은 해당 파일 경로 + 하위 경로까지 동일하게 적용