ReactNextCentral
Published on

Next.js에서의 링크 사용과 내비게이션

Next.js를 사용하여 웹 애플리케이션 내에서 사용자의 내비게이션 경험을 효율적으로 관리하는 방법을 알아봅니다.
Next.js에서의 링크 사용과 내비게이션
Authors
Table of Contents

Next.js에서 사용자 내비게이션의 핵심: <Link>useRouter

웹 애플리케이션 개발에 있어 사용자 내비게이션은 사용자 경험의 흐름을 결정짓는 중요한 요소입니다. 특히 Next.js와 같은 최신의 웹 프레임워크를 사용할 때는 더욱 더 그렇습니다. Next.js는 사용자의 웹사이트 탐색을 쉽고 빠르게 만드는 데 필요한 도구들을 제공합니다. 이 글에서는 Next.js 애플리케이션 내에서 사용자 내비게이션을 구현하는 두 가지 주요 방법, 즉 <Link> 컴포넌트와 useRouter 훅에 대해 알아보겠습니다.

<Link> 컴포넌트는 Next.js의 핵심 요소 중 하나로, 사용자가 다른 페이지로 쉽게 이동할 수 있게 해주는 컴포넌트입니다. 일반 HTML의 <a> 태그와 유사하게 작동하지만, <Link>는 페이지를 미리 가져오는(prefetch) 기능을 제공해 더 빠른 페이지 전환을 가능하게 합니다.

useRouter 훅은 클라이언트 사이드에서 프로그래매틱하게 경로를 변경할 수 있는 기능을 제공합니다. 사용자 이벤트에 따라 동적으로 페이지를 전환하고자 할 때 유용하게 사용할 수 있습니다.

useRouter 훅은 클라이언트 사이드에서만 실행

useRouter 훅은 클라이언트 사이드에서만 실행됩니다. Next.js의 useRouter 훅은 리액트의 컨텍스트를 사용하여 현재 라우트의 상태를 관리하고 그 상태에 기반한 다양한 라우팅 관련 기능을 제공합니다. 서버 사이드에서는 라우트 상태가 존재하지 않으며 페이지가 서버에서 렌더링되는 시점에는 사용자의 브라우저 환경에 대한 정보가 없기 때문에 useRouter를 사용할 수 없습니다.

기본 사용법과 <Link>의 특징

Next.js의 <Link> 컴포넌트는 사용자의 페이지 전환 경험을 개선하기 위한 필수 도구입니다. 이 컴포넌트는 HTML의 <a> 태그와 비슷하지만, 페이지 전환 시 미리 데이터를 가져와 빠른 로딩을 가능하게 하는 미리 가져오기(prefetching) 기능이 내장되어 있습니다. 기본 사용법은 매우 간단합니다.

import Link from 'next/link';

function Navigation() {
  return (
    <nav>
      <ul>
        <li>
          <Link href="/about">소개</Link>
        </li>
        <li>
          <Link href="/contact">연락처</Link>
        </li>
      </ul>
    </nav>
  );
}

동적 경로와 활성 링크 스타일링

Next.js에서는 동적 경로를 다루는 것도 <Link> 컴포넌트로 쉽게 할 수 있습니다. 예를 들어 사용자의 ID에 따라 다른 프로필 페이지를 보여줄 때, 다음과 같이 작성할 수 있습니다.

<Link href={`/profile/${userId}`}>프로필</Link>

현재 활성화된 링크에 대해 다른 스타일을 적용하고 싶다면, next/link와 함께 useRouter 훅을 사용하여 현재 경로와 링크의 경로를 비교하는 방법이 있습니다.

import { useRouter } from 'next/router';
import Link from 'next/link';

function ActiveLink({ href, children }) {
  const router = useRouter();
  const style = {
    color: router.pathname === href ? 'red' : 'black',
  };

  return (
    <Link href={href}>
      <a style={style}>{children}</a>
    </Link>
  );
}

이와 같이 <Link> 컴포넌트와 useRouter 훅을 활용하면, 동적 경로를 다루고 현재 활성화된 링크에 대해 스타일링하는 것이 훨씬 용이해집니다. 이를 통해 사용자에게 더 나은 내비게이션 경험을 제공할 수 있습니다.

Next.js의 <Link> 컴포넌트는 강력하면서도 사용하기 쉬운 내비게이션 도구입니다. 미리 가져오기 기능으로 빠른 페이지 로딩을 지원하며, 동적 경로 처리와 활성 링크 스타일링으로 다양한 사용자 요구에 유연하게 대응할 수 있습니다. 사용자 경험을 향상시키고 싶다면, <Link> 컴포넌트의 효과적인 활용을 고려해보세요.

useRouter 훅으로 경로 제어하기

기본 사용법

Next.js의 useRouter 훅은 프로그래매틱한 방식으로 경로를 제어할 수 있는 강력한 기능을 제공합니다. 이 훅을 사용하면 현재 경로의 정보를 얻을 수 있을 뿐만 아니라, 페이지를 이동하거나 쿼리 파라미터를 변경하는 등의 동작을 코드 내에서 직접 수행할 수 있습니다.

import { useRouter } from 'next/router';

function NavigateButton() {
  const router = useRouter();

  const goToHomePage = () => {
    router.push('/');
  };

  return <button onClick={goToHomePage}>홈으로 가기</button>;
}

버튼 클릭 이벤트를 통한 경로 변경

useRouter 훅을 활용하면, 사용자의 특정 액션에 따라 다른 페이지로의 이동을 구현할 수 있습니다. 예를 들어, 아래 예제에서는 버튼을 클릭했을 때 대시보드 페이지로 이동하는 기능을 보여줍니다.

import { useRouter } from 'next/router';

function DashboardButton() {
  const router = useRouter();

  const goToDashboard = () => {
    router.push('/dashboard');
  };

  return <button onClick={goToDashboard}>대시보드로 이동</button>;
}

useRouter 훅은 push 메서드를 사용하여 새로운 경로로 이동할 수 있습니다. 이 방법을 통해 버튼 클릭과 같은 이벤트에 반응하여 사용자를 다른 페이지로 안내할 수 있습니다.

useRouter 훅은 Next.js에서 경로를 프로그래매틱하게 제어할 수 있는 유용한 도구입니다. 이를 통해 사용자 상호작용에 따라 다양한 페이지 이동을 구현할 수 있으며, 애플리케이션의 내비게이션 경험을 풍부하게 만들 수 있습니다. 사용자의 액션에 기반한 페이지 전환을 구현하고 싶다면, useRouter 훅의 활용을 고려해 보세요.

스크롤 관리와 미리 가져오기 기능

페이지 이동과 스크롤 위치 제어

Next.js 애플리케이션에서 사용자가 새로운 페이지로 이동할 때, 기본적으로 페이지 상단으로 자동 스크롤됩니다. 이는 사용자가 새로운 컨텐츠를 볼 때마다 일관된 시작점을 가질 수 있도록 합니다. 하지만 특정 사용 사례에서는 이동 후의 스크롤 위치를 유지하거나 사용자 정의 위치로 조정해야 할 필요가 있습니다.

import Link from 'next/link';

function CustomLink() {
  return (
    <Link href="/about" scroll={false}>
      소개 페이지로 이동
    </Link>
  );
}

위 코드는 Link 컴포넌트의 scroll 속성을 false로 설정하여 페이지 이동 시 스크롤 위치를 초기화하지 않고 현재 위치를 유지하도록 합니다.

미리 가져오기와 캐싱을 통한 빠른 페이지 로딩

Next.js는 페이지 사이의 빠른 전환을 위해 미리 가져오기(prefetching) 기능을 제공합니다. 사용자가 링크를 클릭하기 전에 페이지의 데이터를 미리 불러와 빠른 로딩 시간을 보장합니다. 이 기능은 Link 컴포넌트에 내장되어 있으며, 특별한 설정 없이도 자동으로 작동합니다.

import Link from 'next/link';

function PrefetchLink() {
  return <Link href="/profile">프로필 페이지</Link>;
}

또한, Next.js는 캐싱을 통해 이미 방문한 페이지의 데이터를 저장하고, 사용자가 같은 페이지로 다시 이동할 때 캐시된 데이터를 사용하여 즉시 로딩할 수 있도록 합니다. 이는 애플리케이션의 성능을 크게 향상시키며 사용자 경험을 개선합니다.

Next.js에서 제공하는 스크롤 관리와 미리 가져오기 기능은 사용자의 내비게이션 경험을 원활하고 직관적으로 만듭니다. 페이지 이동 시 스크롤 위치를 제어할 수 있으며, 미리 가져오기와 캐싱을 통해 빠른 페이지 로딩을 보장합니다. 이러한 기능들을 통해 사용자에게 더 나은 웹 경험을 제공하며, 개발자는 성능과 사용성을 동시에 개선할 수 있습니다. Next.js를 사용할 때 이러한 기능들을 적극 활용해보세요.

동적 라우팅과 정적 파라미터 활용

동적 라우팅의 이해

Next.js에서 동적 라우팅은 특정 패턴을 가진 URL을 다루기 위해 사용됩니다. 이 기능은 사용자가 다양한 경로로 접근할 때 해당 경로의 정보를 페이지에 동적으로 전달하고 싶을 때 유용합니다. 예를 들어, 블로그 게시글이나 제품 상세 페이지 등 각기 다른 데이터를 보여줘야 하는 경우, 동적 라우팅을 사용하여 구현할 수 있습니다.

// pages/posts/[slug].js
import { useRouter } from 'next/router';

const Post = () => {
  const router = useRouter();
  const { slug } = router.query;

  return <div>게시글: {slug}</div>;
};

export default Post;

위 예제에서 [slug]는 동적 세그먼트로, URL에서 slug 부분이 변화함에 따라 다른 내용을 표시할 수 있습니다.

정적 파라미터 사전 생성

getStaticPaths 함수는 동적 라우트를 사용하는 페이지에서 정적 생성을 할 때 필요한 경로를 사전에 정의합니다. 이 함수는 빌드 타임에 호출되어, 어떤 동적 경로들이 미리 렌더링 될지 결정하는 데 사용됩니다.

// pages/posts/[slug].js
export async function getStaticPaths() {
  const posts = await fetch('https://.../posts').then(res => res.json());

  const paths = posts.map(post => ({
    params: { slug: post.slug },
  }));

  return { paths, fallback: false };
}

export async function getStaticProps({ params }) {
  const post = await fetch(`https://.../posts/${params.slug}`).then(res => res.json());

  return { props: { post } };
}

위 코드에서 getStaticPaths는 모든 게시글의 slug를 기반으로 필요한 경로를 생성하고, getStaticProps는 각 경로에 필요한 데이터를 불러와 페이지에 전달합니다.

Next.js의 동적 라우팅과 정적 파라미터 사전 생성 기능을 활용하면, 다양한 데이터를 보여주는 페이지를 효율적으로 구성할 수 있습니다. 이러한 기능은 사용자 경험을 개선하고, 개발자가 웹 애플리케이션을 더 유연하게 구축할 수 있도록 돕습니다. 동적 라우팅과 정적 파라미터를 적극적으로 활용하여, 다양한 사용 사례에 맞는 웹 페이지를 만들어보세요.

내부 및 외부 링크 구현 실습

내부 링크 구현: TabNavItem 컴포넌트

Next.js 애플리케이션에서 내부 링크를 구현할 때는 <Link> 컴포넌트를 사용하여 페이지 간의 빠른 이동을 가능하게 합니다. 여기서는 탭 내비게이션 아이템을 위한 TabNavItem 컴포넌트를 구현하는 방법을 살펴보겠습니다.

// components/TabNavItem.js
import Link from 'next/link';
import clsx from 'clsx';

export const TabNavItem = ({ href, label, isActive }) => {
  return (
    <Link href={href} passHref>
      <a className={clsx('p-2 text-sm', { 'text-blue-500': isActive, 'text-gray-500': !isActive })}>
        {label}
      </a>
    </Link>
  );
};

TabNavItem 컴포넌트는 href, label, 그리고 현재 탭이 활성화 되었는지를 나타내는 isActive 프로퍼티를 받습니다. 활성 탭은 파란색으로 표시되고, 비활성 탭은 회색으로 표시됩니다.

외부 링크를 위해, Next.js의 <Link> 컴포넌트 대신 기본 HTML <a> 태그를 사용하되, 몇 가지 스타일을 추가하여 구현할 수 있습니다. 여기서는 ExternalLink 컴포넌트를 예로 들어 보겠습니다.

// components/ExternalLink.js
export const ExternalLink = ({ href, label }) => {
  return (
    <a href={href} target="_blank" rel="noopener noreferrer" className="p-2 text-sm text-blue-500 hover:underline">
      {label}
    </a>
  );
};

ExternalLink 컴포넌트는 hreflabel 프로퍼티를 받으며, 클릭 시 새 탭에서 링크를 열도록 설정되어 있습니다. 보안을 위해 rel="noopener noreferrer" 속성을 추가했습니다.

외부 링크를 `<a>` 태그로 구현하고 `<Link>` 컴포넌트를 사용하지 않는 주된 이유

Next.js의 <Link> 컴포넌트가 내부적으로 프리페칭(prefetching) 기능을 제공하기 때문입니다. 이 프리페칭 기능은 Next.js 애플리케이션 내의 페이지 간 빠른 전환을 가능하게 하지만, 외부 웹사이트로의 링크에는 적용되지 않습니다. 따라서 외부 링크의 경우 <a> 태그를 사용하고, 명시적으로 새 탭에서 링크를 열도록 설정하여 사용자 경험을 개선합니다.

<Link> 컴포넌트의 프리페칭 기능은 사용자가 링크를 클릭하기 전에 해당 페이지의 데이터를 미리 로드함으로써, 클릭 시 거의 즉각적으로 페이지를 보여줄 수 있게 합니다. 이는 내부 페이지 이동에 있어서 매우 유용하지만, 외부 URL에는 해당되지 않습니다. 외부 URL의 경우, 프리페칭이 불가능하므로 <a> 태그를 사용하여 일반적인 웹 링크처럼 동작하게 합니다.

rel="noopener noreferrer" 속성은 보안 및 성능 관련 이유로 중요합니다. noopener는 새 창이 기존 페이지와 같은 프로세스를 공유하지 않도록 하여, 퍼포먼스 문제 또는 보안 취약점(예: window.opener API를 통한 취약점)을 방지합니다. noreferrer는 HTTP 리퍼러 헤더를 전송하지 않도록 하여 사용자의 프라이버시를 보호합니다.

결론적으로, 외부 링크에 <a> 태그를 사용하는 것은 프리페칭과는 별개의 이유로, 보안과 사용자 경험을 위한 최선의 방법입니다.

Next.js에서 내부 및 외부 링크를 구현하는 것은 매우 간단합니다. 내부 링크의 경우 <Link> 컴포넌트를 사용하여 앱 내의 다른 페이지로 빠르게 이동할 수 있게 하고, 외부 링크의 경우 <a> 태그를 사용하여 외부 사이트로의 연결을 만들 수 있습니다. 이러한 방식을 통해 사용자 경험을 향상시키고 웹 애플리케이션의 내비게이션을 간소화할 수 있습니다.

Next.js 내비게이션: 사용자 경험의 핵심

내비게이션 기능의 중요성

Next.js는 웹 애플리케이션 내에서 사용자가 효율적으로 이동할 수 있도록 다양한 내비게이션 도구를 제공합니다. <Link> 컴포넌트와 useRouter 훅을 중심으로, Next.js는 빠르고 부드러운 페이지 전환을 가능하게 하여 사용자 경험을 크게 향상시킵니다. 이러한 기능들은 애플리케이션의 내부적인 연결뿐만 아니라 외부 링크 처리에도 유용하게 활용됩니다.

내비게이션 전략의 중요성

Next.js를 사용하여 구축한 웹 애플리케이션에서 효과적인 내비게이션 전략을 채택하는 것은 사용자가 원하는 정보나 기능을 빠르고 쉽게 찾을 수 있도록 합니다. 페이지 간의 이동이 매끄럽고 직관적일수록 사용자는 애플리케이션을 더 긍정적으로 인식하게 되며, 이는 전반적인 사용자 만족도를 높이는 데 기여합니다. 따라서, 개발자는 내비게이션 요소를 구현할 때 사용자 중심의 접근 방식을 취하고, 사용성을 최우선으로 고려해야 합니다.

Next.js의 내비게이션 기능은 웹 애플리케이션 개발에서 중요한 부분을 차지하며, 사용자에게 매끄럽고 직관적인 경험을 제공합니다. 효과적인 내비게이션 전략을 통해 개발자는 사용자가 원활하게 정보를 탐색하고 원하는 작업을 수행할 수 있도록 돕습니다. 이는 사용자 만족도를 높이고, 최종적으로 애플리케이션의 성공에 기여하는 결정적 요소가 됩니다. Next.js를 활용한 내비게이션 구현은 단순한 기술적 실행을 넘어서 사용자 중심의 웹 경험을 실현하는 핵심적인 수단입니다.