Published on

Next.js 13으로 업그레이드한 후 발생한 Link 컴포넌트 문제와 해결 방법

Authors
  • avatar
    Name
    Hyo814
    Twitter

Next.js 13으로 업그레이드한 후 발생한 Link 컴포넌트 문제와 해결 방법

Next.js 12에서 잘 작동하던 Link 컴포넌트가 Next.js 13에서 문제가 발생하는 이유와 해결 방법을 아래와 같이 정리할 수 있습니다.

Next.js 12에서 잘 작동하던 프로젝트를 Next.js 13으로 업그레이드한 후, Link 컴포넌트가 예상대로 작동하지 않는 문제가 발생할 수 있습니다. 이 포스트에서는 Next.js 13으로 업그레이드한 후 Link 컴포넌트에서 발생할 수 있는 문제와 이를 해결하는 방법을 살펴보겠습니다.

문제 상황

Next.js 12에서 Link 컴포넌트는 페이지 간의 네비게이션을 쉽게 구현할 수 있는 주요 컴포넌트였습니다. 하지만 Next.js 13으로 업그레이드한 후, 다음과 같은 문제가 발생할 수 있습니다:

  • Link를 클릭해도 페이지가 이동하지 않음
  • 경로가 제대로 인식되지 않음
  • 콘솔에 에러 메시지가 출력됨

이러한 문제는 주로 Link 컴포넌트의 사용 방식이 변경되었기 때문입니다.


원인 분석

Next.js는 버전 업그레이드마다 내부 동작 방식이나 API가 변경될 수 있습니다. Next.js 13에서는 성능 개선과 개발자 경험을 향상시키기 위해 Link 컴포넌트와 라우팅 시스템에 변경이 있었습니다:

  • Link 컴포넌트의 속성 변경: Next.js 13에서는 Link 컴포넌트에 몇 가지 새로운 속성이 추가되었고, 기존 속성의 동작 방식이 일부 변경되었습니다.
  • 라우팅 시스템 개선: Next.js 13에서는 더 나은 성능과 사용자 경험을 제공하기 위해 라우팅 시스템이 개선되었고, 이 과정에서 몇 가지 breaking changes가 발생했습니다.

해결 방법

이러한 문제를 해결하기 위해 다음과 같은 방법을 사용할 수 있습니다:

  1. Link 컴포넌트 속성 확인 및 수정:

Next.js 13에서는 Link 컴포넌트에 legacyBehavior 속성을 추가하여 이전 버전과의 호환성을 유지할 수 있습니다. legacyBehavior 속성을 사용하면 Next.js 12에서 사용하던 방식대로 Link를 사용할 수 있습니다.

import Link from 'next/link';

export default function Home() {
  return (
    <Link href="/about" legacyBehavior>
      <a>About</a>
    </Link>
  );
}

   ```

이 코드는 Link 컴포넌트 내부에 `<a>` 태그를 직접 사용하는 방식으로, Next.js 13의 새로운 Link 동작 방식에서 발생할 수 있는 호환성 문제를 해결해 줍니다.

2. **Router 업데이트:**

Next.js 13에서는 라우팅 방식이 개선되었기 때문에, `useRouter` 훅을 사용하는 경우에도 코드를 최신 방식으로 수정해야 할 수 있습니다. 최신 라우팅 시스템에 맞춰 관련 API 문서를 참조하고, 필요한 부분을 업데이트하세요.

3. **Next.js 13 문서 참조:**

Next.js 13의 공식 문서를 통해 Link 컴포넌트와 라우팅 시스템의 변경 사항을 자세히 확인하고, 코드의 호환성을 유지하기 위해 필요한 부분을 수정합니다.


### 추가적으로 주의해야 할 사항

### 1. **라우팅 변경**

Next.js 13에서는 라우팅 시스템이 업데이트되었습니다. 특히, 동적 경로와 관련된 사항에서 문제가 발생할 수 있습니다. 이러한 문제를 해결하려면 공식 문서에서 라우팅 관련 변경 사항을 확인하고, 필요하다면 동적 경로 정의를 업데이트해야 합니다.

**예시: 동적 경로를 정의하는 방식이 변경된 경우**

```jsx
import { useRouter } from 'next/router';

const DynamicPage = () => {
 const router = useRouter();
 const { id } = router.query;

 return <div>Page ID: {id}</div>;
};

export default DynamicPage;

2. 데이터 페칭 및 SSR/SSG 변경

Next.js 13에서는 데이터 페칭 관련 API나 SSR(서버 사이드 렌더링)과 SSG(정적 사이트 생성) 방식이 변경되었습니다. 따라서 getServerSideProps, getStaticProps, getInitialProps와 같은 데이터 페칭 함수를 최신 방식으로 업데이트해야 합니다.

예시: getStaticProps를 사용하여 정적 사이트 생성

export async function getStaticProps() {
  const res = await fetch('<https://api.example.com/data>')
  const data = await res.json()

  return {
    props: {
      data,
    },
  }
}

const Page = ({ data }) => {
  return <div>{data}</div>
}

export default Page

3. 스타일링 및 CSS 모듈 변경

Next.js 13에서는 스타일링 방식이나 CSS 모듈의 사용 방법이 일부 변경될 수 있습니다. CSS 및 스타일링 관련 변경 사항을 확인하고, 필요하다면 스타일링 코드와 CSS 모듈을 업데이트합니다.

예시: CSS 모듈 사용

/* styles.module.css */
.container {
  background-color: blue;
}
/* CSS 모듈을 사용한 컴포넌트 */
import styles from './styles.module.css'

const StyledComponent = () => {
  return <div className={styles.container}>Hello World</div>
}

export default StyledComponent

4. 빌드 및 배포 설정 변경

Next.js 13에서는 빌드 및 배포 설정이 변경될 수 있으며, 특히 Vercel을 사용하는 경우 이러한 변경 사항이 영향을 미칠 수 있습니다. 최신 빌드 및 배포 설정 가이드를 확인하고, 설정 파일을 업데이트하세요

Next.js 13에서는 Link 컴포넌트의 사용 방식이 일부 변경되었습니다. 최신 사용 방식은 다음과 같습니다:

  1. 직접적인 <a> 태그 사용 불필요: Next.js 13에서는 Link 컴포넌트 내에 <a> 태그를 직접 사용할 필요가 없어졌습니다. 대신, Link 컴포넌트 자체가 네비게이션을 관리하며, legacyBehavior 속성을 사용하지 않을 경우 <a> 태그를 자동으로 생성합니다.
import Link from 'next/link';

export default function Home() {
  return (
    <Link href="/about">
      About
    </Link>
  );
}
   ```

2. **새로운 속성 및 동작:** Next.js 13은 Link 컴포넌트의 속성을 더 세분화하여 사용자가 네비게이션 동작을 더 잘 제어할 수 있도록 했습니다. 예를 들어, `prefetch`, `replace`, `scroll`, `shallow`와 같은 속성을 사용하여 네비게이션 동작을 세밀하게 설정할 수 있습니다.
3. **`legacyBehavior` 속성 사용:** Next.js 13로 업그레이드한 후에도 기존 방식으로 Link를 사용하고 싶다면 `legacyBehavior` 속성을 추가할 수 있습니다. 이 속성을 사용하면 Link 컴포넌트가 Next.js 12와 같은 방식으로 작동합니다.

```jsx
import Link from 'next/link';

export default function Home() {
  return (
    <Link href="/about" legacyBehavior>
      <a>About</a>
    </Link>
  );
}
   ```


Next.js 13로 업그레이드한 후 발생하는 라우팅 문제를 해결하는 방법은 무엇인가요?

Next.js 13으로 업그레이드한 후 라우팅 문제를 해결하려면 다음과 같은 방법을 사용할 수 있습니다:

1. **Link 컴포넌트와 useRouter 훅 검토:** Link 컴포넌트의 `legacyBehavior` 속성을 사용하여 기존 방식으로 작동하게 하거나, 최신 사용 방식으로 코드를 업데이트합니다. `useRouter` 훅을 사용하는 경우에도 최신 Next.js 문서를 참고하여 변경된 API를 반영합니다.
2. **경로 정의 업데이트:** Next.js 13에서는 라우팅 시스템이 개선되었으므로, 동적 경로나 중첩 경로와 관련된 부분을 업데이트해야 할 수 있습니다. 기존의 라우팅 코드를 최신 방식으로 변경하고, 공식 문서에서 라우팅 관련 변경 사항을 확인합니다.
3. **라우팅 설정 문제 해결:** Next.js 13의 새로운 라우팅 방식에 따라 동적 경로나 SSR 관련 설정을 업데이트합니다. 예를 들어, 동적 경로를 정의하는 방식이나 SSR, SSG의 데이터 페칭 메서드(`getServerSideProps`, `getStaticProps`)를 최신 방식으로 검토하고 수정합니다.

```jsx
import { useRouter } from 'next/router';

const DynamicPage = () => {
  const router = useRouter();
  const { id } = router.query;

  return <div>Page ID: {id}</div>;
};

export default DynamicPage;
   ```


### Next.js의 업데이트 주기에 따라 코드 호환성을 유지하는 방법은 무엇인가요?

Next.js의 업데이트 주기에 따라 코드 호환성을 유지하기 위해서는 다음과 같은 접근이 필요합니다:

1. **정기적인 문서 확인:** Next.js는 빠르게 발전하는 프레임워크이므로, 정기적으로 공식 문서와 릴리즈 노트를 확인하여 변경 사항과 새로운 기능을 숙지합니다. 특히 주요 버전 업그레이드 시에는 breaking changes를 잘 확인해야 합니다.
2. **의존성 관리:** 프로젝트의 `package.json` 파일에서 Next.js와 관련된 의존성을 명확하게 관리합니다. 버전 업그레이드 시에는 새로운 버전과 호환되지 않는 다른 라이브러리의 의존성도 함께 관리하여 충돌을 방지합니다.
3. **테스트 코드 작성:** 주요 기능에 대한 테스트 코드를 작성하여, Next.js의 버전 업그레이드 후에도 기존 기능이 정상적으로 작동하는지 확인합니다. 테스트 코드는 업그레이드 후 발생할 수 있는 문제를 빠르게 발견하고 수정하는 데 큰 도움이 됩니다.
4. **점진적 마이그레이션:** Next.js는 주로 점진적 업데이트를 권장합니다. `legacyBehavior`와 같은 속성을 사용하여 이전 방식과의 호환성을 유지하면서 새로운 기능으로 전환하는 과정을 단계적으로 진행합니다. 이를 통해 전체 프로젝트를 한번에 업그레이드하는 위험을 줄일 수 있습니다.