-
[Next.js] router / a / Link 의 차이개발 여정/FrontEnd 2023. 5. 19. 20:40
Next.js router / a / Link 의 차이
Next.js 상에서 페이지 이동을 구현할 때 router, a 태그, Link를 사용할 수 있다. 페이지 이동만 봤을 때는 셋이 비슷해 보이지만, 섬세한 기능 구현을 위해서는 셋의 차이점을 인지하고 있는 것이 좋다.
1. rotuer
react hook 중 하나인 useRouter를 통해 객체 router를 생성해서 페이지를 이동하는 방식이다. 페이지 전체를 로드하는 것이 아닌 필요한 부분만 새로 가져오는 방식을 취한다. 보통 push 메소드를 이용해 다음과 같이 사용한다.
import { useRouter } from 'next/router'; export default function Page() { const router = useRouter(); return ( <button type="button" onClick={() => router.push('/주소')}> Click me </button> ); }
router의 장점은 다양한 객체 속성을 활용할 수 있다는 점이다. 가령 basepath 속성을 이용해 기본 path를 지정할 수 있고, fallback 속성을 이용해 path에 문제가 있을 경우 에러 페이지를 내보낼 수 있다.
단점은 onClick이라는 이벤트 핸들러에 의해 움직이기 때문에, Next.js의 장점 중 하나인 SEO 기능을 활용할 수 없다는 것이다. SEO는 이벤트를 읽을 수 없기 때문에 router 사용 시 페이지 이동을 감지하지 못한다.
2. a
순수 HTML 요소인 a 태그는 페이지를 완전히 새롭게 로드한다. SEO 크롤링에는 적합하지만, 페이지 전체를 로드하다 보니 성능 면에서 뒤떨어진다. 필요한 요소만 갈아끼우는 rotuer와 달리, HTML 파일 전체를 로딩하는 a 태그는 화면 깜빡임이나 시간이 오래 걸리는 단점을 가질 수밖에 없다.
3. Link (v.13 기준)
Next.js의 Link는 a 태그의 확장된 버전이라고 할 수 있다. 기존 Link 컴포넌트는 a 태그를 감싸는 형식을 취해야 했다(<Link><a>...</a></Link>). 이는 웹 표준을 해친다는 지적이 있었고, v13에서는 Link 컴포넌트가 a 태그를 완전히 대체해 <Link href="주소" /> 라고만 써도 된다.
// 사용예시 import Link from 'next/link'; function Home() { return ( <ul> <li> <Link href="/">Home</Link> </li> <li> <Link href="/about">About Us</Link> </li> <li> <Link href="/blog/hello-world">Blog Post</Link> </li> </ul> ); } export default Home;
Link의 장점은 CSR과 SSG 방식이 적절히 혼합되어 있다는 것이다. 이동할 페이지의 js 파일을 프리렌더링해서 라우팅 시 빠르게 이동한다. 또한 HTML 파일을 가지고 있기 때문에 SEO 크롤링에도 문제가 없다. 그리고 화면 상 Link가 노출되지 않을 때는 다음 페이지의 js 파일을 가져오지 않는다. 이를 통해 불필요한 네트워크 요청을 줄일 수 있다.
Reference
'개발 여정 > FrontEnd' 카테고리의 다른 글
[Next.js] Hydration이란? (0) 2023.07.01 [React] setInterval을 통해 React Hooks 알아보기 (useEffect, useState, useRef) (0) 2023.05.26 서버 컴포넌트 (RSC, React Server Component) (0) 2023.05.12 [Next.js] v13의 Next/Image (이미지 최적화) (0) 2023.03.18 [TypeScript] Any, Union, Type Aliases, Type Guard (0) 2023.03.02