이 절에서는 서버 컴포넌트에서의 비동기 데이터 페칭 방법과 그 이점에 대해 자세히 알아보겠습니다.
async / await를 사용한 데이터 페칭
서버 컴포넌트에서는 async / await를 직접 사용하여 데이터를 페치할 수 있습니다.
이는 클라이언트 사이드 렌더링에서 흔히 사용하는 useEffect나 기타 훅을 사용할 필요가 없다는 것을 의미합니다.
기본 예제
이 방식의 주요 이점은 다음과 같습니다.
서버에서 데이터를 페치하므로 초기 페이지 로드 시간이 빨라집니다.
API 키 등의 민감한 정보를 클라이언트에 노출하지 않고 사용할 수 있습니다.
데이터 페칭 로직이 컴포넌트 로직과 함께 있어 관리가 용이합니다.
fetch API의 서버 사이드 캐싱
Next.js는 fetch()에 대해 자동으로 서버 사이드 캐싱을 제공합니다.
이를 통해 중복 요청을 줄이고 성능을 최적화할 수 있습니다.
캐싱 옵션 예제
이 예제에서 revalidate: 60은 60초마다 데이터를 재검증하도록 지정합니다.
캐싱 옵션
{ cache: 'force-cache' }: 기본값, 가능한 한 오래 캐시 (정적 데이터)
{ cache: 'no-store' }: 항상 최신 데이터 페치 (동적 데이터)
{ next: { revalidate: 10 } }: 10초마다 재검증 (ISR과 유사)
병렬 데이터 페칭
여러 데이터 소스에서 동시에 데이터를 페치해야 할 경우, Promise.all이나 Promise.allSettled를 사용할 수 있습니다.
병렬 데이터 페칭 예제
이 방식은 두 요청을 동시에 시작하여 전체 로딩 시간을 줄일 수 있습니다.
7장 서버, 클라이언트 컴포넌트와의 연결
6장에서 다루는 서버 컴포넌트에서의 데이터 페칭은 7장의 서버, 클라이언트 컴포넌트 개념과 밀접하게 연관됩니다. 서버 컴포넌트에서 데이터를 페치하고, 필요한 경우 이를 props를 통해 클라이언트 컴포넌트에 전달할 수 있습니다. 이를 통해 서버 사이드 렌더링의 이점을 활용하면서도, 필요한 경우 클라이언트 사이드 인터랙션을 구현할 수 있습니다.