프리페칭(Pre-fetching)은 현재 사용자가 보고 있는 페이지에서 이동 가능한 페이지의 데이터를 미리 불러오는 기능입니다. 페이지 이동 시 로딩 지연을 최소화하고 즉각적인 페이지 전환을 제공합니다.
npm run dev
) 에서는 프리페칭이 실행되지 않습니다.<Link>
컴포넌트를 사용할 때 기본적으로 프리페칭이 활성화됩니다.Next.js에서 프리페칭을 사용하는 두 가지 기본 방법이 있습니다:
<Link href="/about">About 페이지</Link>
href
속성을 가진 모든 <Link>
태그는 자동으로 /about
페이지를 프리페칭합니다.prefetch={false}
로 설정할 수 있습니다:<Link href="/search" prefetch={false}>
Search 페이지 (프리페칭 비활성화)
</Link>
특정 이벤트(예: 버튼 클릭, 마우스 호버 등)나 조건에 따라 특정 페이지를 미리 불러올 수 있습니다.
예시 코드:
import { useEffect } from "react";
import { useRouter } from "next/router";
export default function Example() {
const router = useRouter();
useEffect(() => {
// '/test' 페이지를 미리 불러옴
router.prefetch("/test");
}, [router]);
const handleClick = () => {
router.push("/test");
};
return <button onClick={handleClick}>Test 페이지로 이동</button>;
}
/test
페이지를 미리 불러와서, 버튼 클릭 시 빠른 페이지 전환을 지원합니다.다음과 같은 요소들을 추가하여 프리페칭의 효율성을 높이고 사용자 경험을 향상시킬 수 있습니다.
모든 페이지를 항상 프리페칭하면 리소스 낭비가 될 수 있으므로, 사용자의 행동(예: 마우스 호버)을 기반으로 선택적으로 프리페칭하는 것이 권장됩니다.
예시 코드(마우스 호버로 프리페칭):
import { useRouter } from "next/router";
export default function HoverPrefetchLink() {
const router = useRouter();
const handleMouseEnter = () => {
router.prefetch("/hover-page");
};
return (
<a
onMouseEnter={handleMouseEnter}
onClick={() => router.push("/hover-page")}
>
마우스 호버 시 프리페칭되는 페이지로 이동
</a>
);
}
파일명:
pages/_app.js
import Link from "next/link";
import { useRouter } from "next/router";
import { useEffect } from "react";
export default function App({ Component, pageProps }) {
const router = useRouter();
// 특정 페이지 사전 프리페칭 (useEffect 활용)
useEffect(() => {
router.prefetch("/test");
}, [router]);
// 버튼 클릭 시 페이지 이동
const handleTestPageClick = () => {
router.push("/test");
};
return (
<>
<header>
<nav>
<Link href="/">Home</Link>
<span> | </span>
<Link href="/search" prefetch={false}>
Search (프리페칭 비활성화)
</Link>
<span> | </span>
<Link href="/book/1">Book 1 (기본 프리페칭)</Link>
</nav>
<div>
<button onClick={handleTestPageClick}>
Test 페이지로 이동 (수동 프리페칭)
</button>
</div>
</header>
<main>
<Component {...pageProps} />
</main>
</>
);
}