


SSR, SSG, Dynamic SSG을 구분하는 함수 내부에서 데이터 페칭 작업을 수행했었다.
-> 이후 페이지 컴포넌트에 Props로 데이터를 넘겨주었다.
-> Page Router에서는 모든 컴포넌트는 Cilent Component였기에 가능했던 일.
-> App Router의 Server Component에서는 동일한 방법을 사용할 수가 없다.
-> Server Component는 클라이언트에서는 동작하지 않기 때문.
Page Router 방식의 문제점은, 최상단 Page 컴포넌트에 모든 데이터가 집중되기 때문에 하위 컴포넌트에 Props 방식으로 넘기는 것이 복잡해진다.


async function RecoBooks() {
const response = await fetch(
`${process.env.NEXT_PUBLIC_API_SERVER_URL}/book/random`
);
if (!response.ok) {
return <div>오류가 발생했습니다...</div>;
}
const recoBooks: BookData[] = await response.json();
return (
<div>
{recoBooks.map((book) => (
<BookItem key={book.id} {...book} />
))}
</div>
);
}
export default function Home() {
return (
<div className={style.container}>
<section>
<h3>지금 추천하는 도서</h3>
<RecoBooks />
</section>
<section>
<h3>등록된 모든 도서</h3>
<AllBooks />
</section>
</div>
);
}




fetch 메소드를 사용할 때, cache 옵션을 활성화하면 된다. Next에서 데이터 캐시와 관련된 기능들을 fetch에 추가해두었기 때문.
그래서 Axios 라이브러리에서는 사용할 수가 없다.
force-cache

Next.js 14버전까지의 데이터 캐시 기본 옵션.
최초 요청시에는 캐시된 데이터가 없으니, 그냥 넘어간다. 이후 서버에서 데이터를 받아 캐시하고, 그 다음 요청부터는 캐시 데이터를 활용해서 서버에 요청을 보내지 않고 데이터를 반환한다. (이 과정을 MISS - SET - HIT 단계로도 지칭한다.)
no-cache

revalidate

Page Router의 ISR 방식처럼, 일정 시간을 주기로 캐시를 업데이트한다.
기간이 경과한 캐시는 STALE (상했다) 상태로 간주, 다만 1회에 한하여 그대로 반환한다. 그 이후 서버에서 새 데이터를 받아 SET한다.
tags

/** @type {import('next').NextConfig} */
const nextConfig = {
logging: {
fetches: {
fullUrl: true,
},
},
};
export default nextConfig;




데이터 페칭을 최적화 시켜주는 기능. 다양한 컴포넌트에서 발생하는 모든 요청들에서 중복된 부분들을 생략할 수 있게 해준다.
-> 중복된 API 요청을 하나의 요청으로 통합시켜주는 것.
Request Memoization는 우선 첫번째 요청의 응답을 기억해둔다. 그 이후에 동일한 요청이 발생했을 때. 서버에 다시 요청을 넣지 않고, Request Memoization에서 기억된 응답을 돌려준다.


중복된 API 요청 정도는 개발자 선에서 알아서 해결할 수 있다. 그런데 Next.js에서는 굳이 Request Memoization라는 별도의 기능까지 추가해서 이를 대신 해결해주고 있다.
그 이유는, Server Component의 도입으로 데이터 페칭의 방식에 변화가 발생했기 때문.

데이터 페칭을 더 편하게 할 수 있는 것은 장점이지만, 문제는 동일한 요청이 여러 컴포넌트에서 발생하는 경우가 발생할 수 밖에 없다는 단점이 동시에 발현되고 말았다.
Page Router에서는 Page에서 모든 데이터를 받아서 내려보내주면 그만이었지만, App Router에서는 각 컴포넌트에서 직접 데이터를 페칭할 수 있게 되었기 때문에 중복된 API 요청이 발생할 가능성이 대단히 높아졌다. 하나의 데이터를 여러 컴포넌트에서 사용하는 상황은 대단히 흔한 것이기 때문.
그래서 Next.js에서는 Request Memoization을 도입하여 중복된 API 호출을 자동으로 최적화해주고 있는 것이다.
