티스토리 뷰

평소에 모든 페이지 이동을 useNavigate() 훅을 이용하고 Link 태그를 쓸 생각조차 안했습니다.

하지만 상황에 따라 이 2가지를 나눠 사용하는 것이 좋다고 합니다.

 

자, 일단 useNavigate()와 Link의 차이를 알아봅시다.

useNavigate()

const navigate = useNavigate();

const handelGoDetail = () => {
    if (Object.keys(item).length === 0) {
        return;
    }
    navigate(`/pokemon-detail?id=${item.id}`);
};

 

useNavigate는 웹 페이지 이동 시 추가적인 동작이 필요할 경우에 사용합니다.

위처럼 페이지를 이동하기 전에 실행해야 할 코드가 있다면 사용하면 됩니다.

 

위처럼 item이라는 객체가 비어있다면 early return을 시키는 경우가 있고 많이 볼 수 있는 경우로는 회원 가입 페이지에서 회원 가입 버튼을 누르면 유효성 검사를 실행한 후 로그인 페이지로 넘어가는 경우가 있습니다.

Link

<Link to='/'>Home<Link/>

 

Link 태그는 사용자가 해당 요소를 클릭했을 때 페이지를 이동하도록 합니다.

 

그럼 어차피 둘 다 페이지 이동할 때 쓰니까 아무거나 쓰면 되지 않나 싶을겁니다.

Link를 적재적소에 써야 하는 이유는 바로 SEO(검색 엔진 최적화) 때문입니다.

  • <Link>는 실제로 HTML <a> 태그를 렌더링하므로, 검색 엔진이 링크를 따라가며 페이지를 색인할 수 있습니다.
  • 이는 사이트의 검색 결과 노출(인덱싱)에 도움을 줍니다.

하지만 useNavigate를 이용해 페이지 이동을 구현한다면?

  • 클라이언트 사이드 렌더링 (CSR)
    • useNavigate는 window.history.pushState()를 활용해 클라이언트에서 페이지 전환을 처리합니다.
    • 서버에서 HTML을 제공하는 게 아니라, 현재 페이지의 상태만 변경되기 때문에 검색 엔진이 페이지 전환을 인식하기 어렵습니다.
  • 검색 엔진 봇이 탐색 불가
    • useNavigate는 JS 코드 실행 이후 동작하는데, 검색 엔진 봇(Googlebot 등)은 JS 실행을 완벽하게 처리하지 못하는 경우가 많습니다.
    • 즉, useNavigate로 이동하는 페이지는 검색 엔진이 쉽게 크롤링하지 못할 수 있습니다.
  • 링크의 의미가 사라짐
    • useNavigate는 단순히 상태 변경이므로, 검색 엔진이 새로운 페이지로 이동하는 것인지 알지 못합니다.

이러한 이유로 페이지를 이동하기 전 작업이 필요하지 않는 이상 Link 태그를 이용하는 것이 좋겠죠?

이러해서 Link로 대체할 수 있는 곳을 찾다가 문제에 직면했습니다.

🛑 Styled Component에 Link는 어떻게 적용하지...?

<StDexBtn onClick={() => navigate('/dex')}>포켓몬 도감 시작하기</StDexBtn>


const StDexBtn = styled.button`
    border: none;
    border-radius: 5px;
    color: white;
    padding: 20px;
    background-color: red;
    cursor: pointer;
`;

 

HTML의 a태그랑 react-router-dom의 Link태그가 같은 역할을 하는 것은 알겠는데 styled.a로 쓰면 아예 페이지를 새로 로드하기 때문에 리액트에서 쓰기에는 굳이...? 

 

해결 방법은 간단합니다. 

✅  Styled(Link) 사용

간단하게 react-router-dom의 Link를 styled-domponent로 감싸면 됩니다.

<StDexBtn to='/dex'}>포켓몬 도감 시작하기</StDexBtn>

const StDexLink = styled(Link)`
    display: inline-block;
    text-decoration: none;
    border: none;
    border-radius: 5px;
    color: white;
    padding: 20px;
    background-color: red;
    cursor: pointer;
`;

 

 as 속성 사용

styled-components에서 as 속성은 기존 스타일을 그대로 유지하면서 다른 HTML 요소나 컴포넌트로 변경하고 싶을 때 유용합니다.

<StDexBtn as={Link} to="/dex">포켓몬 도감 시작하기</StDexBtn>

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함