nextjs는 서버컴포넌트와 클라이언트 컴포넌트로 구분된다.
특별한 처리를 하지 않으면 대부분 서버 컴포넌트로 처리된다.
기존에 get 요청을 보낼때는 useEffect안에 fetch문을 넣어서 사용했다.
기존코드
export default function RootLayout({children}: {children: React.ReactNode}) {
const [topics, setTopics] = useState([]);
useEffect(() => {
fetch('http://localhost:9999/topics')
.then((res) => res.json())
.then((result) => setTopics(result));
}, []);
return()
}
그렇지만 nextjs에서 서버 컴포넌트에서는 fetch를 사용할때 useEffect를 사용하지 않는다.
export default async function RootLayout({children}: {children: React.ReactNode}) {
const res = await fetch('http://localhost:9999/topics');
const topics = await res.json();
return ()
}
추가적으로 layout.tsx에서 클라이언트 컴포넌트를 사용할때는 아래와 같은 에러가 발생했다.
이 오류는 metadata는 서버 구성 요소에서만 작동되는 metadata와 클라이언트 구성요소인 useEffect를 같이 사용해서 발생한 오류이다.
해당 오류도 위처럼 useEffect를 사용하지 않고 서버 구성 요소로만 변경해서 사용하면 해결된다. 👍
좋은 글이네요. 공유해주셔서 감사합니다.