Next.js 13 navigation/useRouter는 어떻게 다를까?
Next.js 개발자라면 어플리케이션의 사용자 경험에 라우팅이 얼마나 중요한지 잘 알고 있을 것입니다. Next.js 13에서 useRouter
훅이 훨씬 간편해지고 많은 점이 변경되었습니다 ! 커피 한잔 손에 쥐고 편하게 읽어보세요. Next.js 13에서 무엇이 새로워졌고, Next.js 12와 어떻게 다른지에 대해 가벼우면서도 자세하게 썼으니까요. 😉
Next.js 12의 useRouter
: 빠른 회고
기본 사항과 일반적인 메소드
Next.js 12에서 useRouter
훅은 프로그래밍 방식으로 라우트를 변경할 수 있게 해줬습니다. 다양한 유용한 메소드들이 있었습니다:
router.push()
: 새 페이지로 이동router.replace()
: 히스토리에 추가하지 않고 이동router.back()
: 이전 페이지로 이동- ...등등.
제한 사항과 해결 방법
강력함에도 불구하고, Next.js 12 라우터는 일부 제한 사항이 있었습니다. 예를 들어, router.events
를 사용하지 않고는 라우트 변경을 쉽게 감지할 수 없었습니다.
const router = useRouter();
useEffect(() => {
const handleRouteChange = (url) => {
// 로직 작성
};
router.events.on("routeChangeComplete", handleRouteChange);
return () => {
router.events.off("routeChangeComplete", handleRouteChange);
};
}, []);
Next.js 13의 useRouter
사용
Next.js 13에서 useRouter
훅은 클라이언트 측 라우팅을 간편하게 만들어주는 다양한 메소드를 제공합니다. 이러한 메소드들은 웹 앱 내에서 페이지를 전환하거나, 데이터를 다시 불러오고, 브라우저의 히스토리를 조작할 수 있게 해줍니다.
Next.js 13 useRouter
메소드
router.push(href: string, { scroll: boolean })
이 메소드는 클라이언트 측에서 새로운 라우트로 이동을 합니다. 이 과정에서 브라우저의 히스토리 스택에 새로운 항목이 추가됩니다.
const router = useRouter();
// '/about' 페이지로 이동
router.push('/about');
router.replace(href: string, { scroll: boolean })
이 메소드는 router.push
와 유사하지만, 브라우저의 히스토리 스택에 새로운 항목을 추가하지 않습니다.
const router = useRouter();
// '/about' 페이지로 이동하지만 히스토리에 추가되지 않음
router.replace('/about');
router.refresh()
현재 라우트를 새로 고침합니다. 이 메소드는 서버에 새로운 요청을 보내고, 데이터를 다시 가져오며, 서버 컴포넌트를 다시 렌더링합니다.
const router = useRouter();
// 현재 페이지 새로 고침
router.refresh();
router.prefetch(href: string)
특정 라우트를 사전 로딩하여 클라이언트 측에서 더 빠른 페이지 전환을 가능하게 합니다.
const router = useRouter();
// '/about' 페이지를 사전 로딩
router.prefetch('/about');
router.back()
브라우저의 히스토리 스택에서 이전 페이지로 돌아갑니다.
const router = useRouter();
// 이전 페이지로 이동
router.back();
router.forward()
브라우저의 히스토리 스택에서 다음 페이지로 이동합니다.
const router = useRouter();
// 다음 페이지로 이동
router.forward();
이 메소드들을 사용하면 Next.js에서 라우팅을 더 효율적이고 유연하게 관리할 수 있습니다. 이는 사용자 경험을 향상시키는 중요한 요소 중 하나입니다.
새로운 기능과 메소드
첫 번째로 주목할 점은 Next.js 13에서는 next/navigation
에서 useRouter
를 가져와야 한다는 것입니다. 이 버전에는 새로운 기능들이 추가되었습니다:
router.refresh()
: 현재 라우트를 새로 고침router.prefetch(href: string)
: 더 빠른 클라이언트 측 전환을 위한 사전 로딩usePathname
과useSearchParams
: 경로 이름과 검색 파라미터를 얻기 위한 별도의 훅
성능 향상
router.prefetch()
메소드는 클라이언트 측 성능을 향상시키는 데 특히 유용합니다. 이는 연결된 페이지의 자산을 사전 로딩하여 페이지 로드 시간을 단축시킵니다.
Next.js 12와 13의 useRouter
주요 차이점
마이그레이션 경로
업그레이드를 계획하고 있다면 호환되지 않는 변경 사항을 알고 있어야 합니다:
router.events
가 대체되었습니다pathname
과query
문자열이 제거되었습니다- 이제
next/navigation
에서 가져와야 하며next/router
는 더 이상 사용되지 않습니다
호환되지 않는 변경 사항
주요한 변화 중 하나는 router.events
의 대체입니다. Next.js 13에서는 usePathname
과 useSearchParams
훅을 사용하여 페이지 변경을 감지할 수 있습니다.
실제 사례와 코드 스니펫
클라이언트 측 내비게이션
Next.js 13에서 클라이언트 측 내비게이션은 대체로 동일하지만, 새로운 기능들의 추가로 더 강력해졌습니다. 이제 router.refresh()
를 사용하여 현재 페이지를 원활하게 새로 고침할 수 있습니다.
const router = useRouter();
// 현재 페이지 새로 고침
<button onClick={() => router.refresh()}>새로 고침</button>
새로운 scroll 원복 기능
Next.js 13에서는 페이지 네비게이션을 할 때 스크롤 위치를 원래대로 되돌리는 것이 기본 설정입니다. 그러나 필요에 따라 이러한 동작을 비활성화할 수 있습니다. 이를 위해서는 router.push()
나 router.replace()
메소드에 scroll: false
옵션을 전달하면 됩니다.
예를 들어, 게시글 목록에서 특정 게시글을 읽다가 목록으로 돌아갈 때 동일한 스크롤 위치로 유지하고 싶다면 아래와 같이 코드를 작성할 수 있습니다.
import { useRouter } from 'next/navigation'
export default function PostPage() {
const router = useRouter()
return (
<div>
{/* 게시글 내용 */}
<button
type="button"
onClick={() => router.push('/post-list', { scroll: false })}
>
게시글 목록으로 돌아가기
</button>
</div>
)
}
이렇게 하면 /post-list
페이지로 돌아갈 때 스크롤 위치가 변경되지 않고, 사용자는 이전에 본 위치에서 계속 게시글 목록을 볼 수 있습니다.
이벤트 처리
Next.js 13에서는 라우터 이벤트를 듣는 것이 이전보다 더 간단해졌습니다. 이를 위해 새로운 훅 usePathname
과 useSearchParams
를 사용할 수 있습니다.
const pathname = usePathname();
const searchParams = useSearchParams();
useEffect(() => {
const url = `${pathname}?${searchParams}`;
// 로직 작성
}, [pathname, searchParams]);
마치며
유익하셨나요? Next.js 13의 useRouter
는 더 많은 기능, 더 나은 성능, 그리고 원활한 마이그레이션 방법을 제공합니다. 프론트엔드의 기술들은 항상 빠르게 변화하죠. 그만큼 편해지고 있다지만, 그만큼 배울게 많기도 합니다. 🥲