구축한 백엔드로 글 목록을 동적으로 생성해 볼 것입니다.

Next.js뿐만 아니라 React 18버전부터 이렇게 Server Component가 추가되었습니다.
이 두가지는 서로 사용할 수 있는 API가 다릅니다. 또한 , Next.js에서 특별한 조치를 하지 않으면 Server Component로 간주합니다.

위의 그림을 보면 S가 server, C가 client component의 사용 사례를 보여줍니다.
서버 컴포넌트는 아래와 같은 경우에 사용합니다.
정보를 단순히 보여주는 역할을 하는 경우클라이언트 컴포넌트는 아래와 같은 경우 사용합니다.
사용자와 상호작용하는 경우클라이언트 컴포넌트로 먼저 시도해보고 비효율을 살펴본 후 , 서버 컴포넌트로 전환하는 작업을 해볼 예정입니다.
const [topics, setTopics] = useState([]);
useEffect(() => {
fetch("http://localhost:9999/topics")
.then((resp) => resp.json())
.then((result) => {
setTopics(result);
});
});
가져온 데이터를 사용하기 위해 useState를 작성하고 useEffect를 통해 데이터를 서버에서부터 가져옵니다.
이렇게 하면 에러가 발생합니다.
그 이유는 useState는 오직 클라이언트 컴포넌트에서만 동작하기 때문인데 이 모듈을 클라이언트 컴포넌트로 바꾸고 싶다면 제일 위에 “use client”를 추가해야합니다.
하지만 “use client” 를 추가해도 오류가 발생하는 것은 똑같습니다.
use client로 인해 useState는 client컴포넌트가 되었지만,metadata는 서버 컴포넌트로만 사용되기에 client컴포넌트로 사용되었기에 에러가 발생하였습니다.
그래서 meta를 일단 주석처리 해보면 에러가 발생하지 않는 것을 확인할 수 있습니다.
또한 이제 정보를 표시하기 위해 return함수에 코드를 작성해보겠습니다.
<body>
<h1>
<Link href="/">WEB</Link>
</h1>
<ol>
{topics.map((topic) => {
return (
<li key={topic.id}>
<Link href={`/read/${topic.id}`}>{topic.title}</Link>
</li>
);
})}
잘 동작하는지를 볼 수 있습니다.
하지만 아쉬운 점이 있는데 useEffect를 이용해서 data를 fetching하고 있습니다.
use client 삭제const resp = await fetch("http://localhost:9999/topics/");
const topics = await resp.json();
장점: