Next.js를 사용하다 보면 항상 헷갈린다. 이거 서버에서 가져와야 돼?
아니면 React Query 써야 돼? 정리하면서 알아보자.
async function Page() {
const res = await fetch("https://api.example.com/posts");
const posts = await res.json();
return <div>{posts.map(p => p.title)}</div>;
}
"use client";
import { useEffect, useState } from "react";
export default function Page() {
const [posts, setPosts] = useState([]);
useEffect(() => {
fetch("/api/posts")
.then(res => res.json())
.then(setPosts);
}, []);
return <div>{posts.map(p => p.title)}</div>;
}
| 구분 | 서버 컴포넌트 | 클라이언트 컴포넌트 |
|---|---|---|
| 실행 위치 | 서버 | 브라우저 |
| 실행 시점 | 렌더링 시 | 렌더 후 |
| SEO | 좋음 | 나쁨 |
| 보안 | 안전 | 취약 |
| 인터랙션 | 불가능 | 가능 |
| 초기 로딩 | 빠름 | 느림 |
React Query는 서버 상태를 관리하는 라이브러리다.
"use client";
import { useQuery } from "@tanstack/react-query";
const { data, isLoading } = useQuery({
queryKey: ["posts"],
queryFn: fetchPosts,
});
초기 데이터는 서버 컴포넌트에서 가져와 SEO와 초기 렌더링을 확보하고,
사용자 인터랙션이나 데이터 변경이 필요한 경우 클라이언트에서 React Query로 관리하기?
// 서버 컴포넌트
const posts = await fetchPosts();
return <PostList initialData={posts} />;
"use client";
// 클라이언트 컴포넌트
const { data } = useQuery({
queryKey: ["posts"],
queryFn: fetchPosts,
initialData: posts,
});
서버 컴포넌트는 초기 데이터와 SEO, 보안을 위해 사용하고
클라이언트 컴포넌트는 인터랙션과 상태 관리를 위해 사용한다.
맞는지는 잘 모르겟다ㅏ..