현재 비동기 컴포넌트는 서버 컴포넌트에서만 지원된다. 컴포넌트가 async로 표시되면 비동기 작업(예: 데이터 페칭)을 수행할 수 있다.
이전의 서버 컴포넌트 예제에서 이러한 동작을 볼 수 있었다. 컴포넌트가 데이터베이스에서 데이터를 가져와 렌더링 된 JSX를 HTML로 클라이언트에 전송했기 때문이다.
현재로서는 자바스크립트 Promise를 클라이언트 컴포넌트에 전달할 수 있다.
import { Suspense } from 'react';
const ReactServerComponent = () => {
const postsPromise = db.query('SELECT * FROM posts');
return (
<div>
<Suspense>
<ReactClientComponent promisedPosts={postsPromise} />
</Suspense>
</div>);
};
하지만 클라이언트 컴포넌트에서는 이 방식이 작동하지 않는데, 이는 클라이언트 측에서 렌더링이 차단될 수 있기 때문이다.
또 리액트의 use API
를 사용해 클라이언트 컴포넌트에서 이를 해결할 수 있다.
'use client';
import { use } from 'react';
const ReactClientComponent = ({ promisedPosts }) => {
const posts = use(promisedPosts);
return (
<ul>
{posts?.map(post => (
<li key={post.id}>{post.title}</li>))}
</ul>);
};
export { ReactClientComponent };
미래에는 리액트가 클라이언트 컴포넌트에서도 async 컴포넌트를 지원하여 렌더링 전에 클라이언트 컴포넌트에서 데이터를 가져올 수 있을 가능성이 크다.