Final Project (React)

<Navigate> vs useNavigate()

taytay 2025. 1. 31. 23:51

<Navigate>와 useNavigate()는 둘 다 React Router에서 페이지를 리디렉션하거나 이동할 때 사용하는 방법이지만, 사용 시점과 목적에 따라 적합한 경우가 다릅니다.

 

 

1. <Navigate>

  • 컴포넌트 형태로 사용되며 JSX 안에서 특정 조건에 따라 리디렉션할 때 적합합니다.
  • 장점: JSX 구조에 자연스럽게 녹아들어 조건부 렌더링과 함께 사용할 수 있습니다.
  • 사용 예:
if (!user) {
  return <Navigate to="/user/signIn" replace />;
}

 

이유:

  • ProtectedRoute처럼 렌더링 과정에서 인증 여부를 확인하고, 조건에 따라 리디렉션이 필요한 경우 return문에서 바로 사용하기 편리합니다.
  • 컴포넌트 내에서 리턴하는 방식이기 때문에 코드가 간결합니다.

2. useNavigate()

  • 형태로, 함수 내부에서 프로그래밍적으로 페이지 이동을 수행할 때 사용합니다.
  • 장점: 특정 이벤트나 함수 호출 시 리디렉션을 트리거할 때 유용합니다.
  • 사용 예:
const navigate = useNavigate();

const handleLogin = () => {
  if (!user) {
    toast.error("로그인이 필요합니다.");
    navigate("/user/signIn", { replace: true });
  }
};

 

 

이유:

  • 1. 로그인 버튼 클릭 또는 기타 사용자 인터랙션 이벤트에서 사용할 때 적합합니다.
  • 2. JSX 외부에서 동작해야 하는 로직에서 리디렉션을 처리할 수 있습니다.

 

replace 속성의 역할

replace 속성은 브라우저 히스토리의 동작을 제어합니다.

  • 기본 동작:
    페이지를 이동하면 브라우저의 방문 기록에 새 항목이 추가됩니다. 사용자가 뒤로 가기를 누르면 이전 페이지로 돌아갈 수 있습니다.
  • replace: true:
    현재 페이지를 새 페이지로 대체하여 히스토리 항목을 덮어씁니다. 뒤로 가기를 누르면 이전 페이지로 돌아갈 수 없습니다.

사용 예

<Navigate to="/user/signIn" replace={true} />;

 

  • replace={true}를 설정하면 /user/signIn으로 이동한 후, 뒤로 가기를 눌러도 보호된 페이지로 돌아가지 않습니다.
  • 의도: 비인증 사용자가 보호된 페이지에 접근하려 했던 기록을 히스토리에서 제거하여, 혼란을 방지할 수 있습니다.

 

 

<Navigate> vs useNavigate()

<Navigate>와 useNavigate()는 둘 다 React Router에서 페이지를 리디렉션하거나 이동할 때 사용하는 방법이지만, 사용 시점과 목적에 따라 적합한 경우가 다릅니다.


1. <Navigate>

  • 컴포넌트 형태로 사용되며 JSX 안에서 특정 조건에 따라 리디렉션할 때 적합합니다.
  • 장점: JSX 구조에 자연스럽게 녹아들어 조건부 렌더링과 함께 사용할 수 있습니다.
  • 사용 예:
    jsx
    CopyEdit
    if (!user) { return <Navigate to="/user/signIn" replace />; }
    이유:
    • ProtectedRoute처럼 렌더링 과정에서 인증 여부를 확인하고, 조건에 따라 리디렉션이 필요한 경우 return문에서 바로 사용하기 편리합니다.
    • 컴포넌트 내에서 리턴하는 방식이기 때문에 코드가 간결합니다.

2. useNavigate()

  • 형태로, 함수 내부에서 프로그래밍적으로 페이지 이동을 수행할 때 사용합니다.
  • 장점: 특정 이벤트나 함수 호출 시 리디렉션을 트리거할 때 유용합니다.
  • 사용 예:
    jsx
    CopyEdit
    const navigate = useNavigate(); const handleLogin = () => { if (!user) { toast.error("로그인이 필요합니다."); navigate("/user/signIn", { replace: true }); } };
    이유:
    • 로그인 버튼 클릭 또는 기타 사용자 인터랙션 이벤트에서 사용할 때 적합합니다.
    • JSX 외부에서 동작해야 하는 로직에서 리디렉션을 처리할 수 있습니다.

replace 속성의 역할

replace 속성은 브라우저 히스토리의 동작을 제어합니다.

  • 기본 동작:
    페이지를 이동하면 브라우저의 방문 기록에 새 항목이 추가됩니다. 사용자가 뒤로 가기를 누르면 이전 페이지로 돌아갈 수 있습니다.
  • replace: true:
    현재 페이지를 새 페이지로 대체하여 히스토리 항목을 덮어씁니다. 뒤로 가기를 누르면 이전 페이지로 돌아갈 수 없습니다.

사용 예

jsx
CopyEdit
<Navigate to="/user/signIn" replace={true} />;
  • replace={true}를 설정하면 /user/signIn으로 이동한 후, 뒤로 가기를 눌러도 보호된 페이지로 돌아가지 않습니다.
  • 의도: 비인증 사용자가 보호된 페이지에 접근하려 했던 기록을 히스토리에서 제거하여, 혼란을 방지할 수 있습니다.

왜 ProtectedRoute에서 <Navigate>를 사용했을까?

  1. 간결성:
    if (!user) 조건에서 바로 리턴하는 방식으로, JSX 구조와 자연스럽게 연결됩니다.
  2. 명시적 리디렉션:
    <Navigate>는 선언적 방식으로, JSX 내부에서 경로 이동을 쉽게 표현할 수 있습니다.
  3. URL 직접 접근 방지:
    유저가 URL을 직접 입력했을 때 인증이 필요하면 곧바로 로그인 페이지로 리디렉션됩니다.
  4. replace 속성의 편리함: 뒤로 가기 버튼을 눌러 보호된 페이지로 돌아가는 비정상적인 동작을 예방합니다.

useNavigate()를 사용해도 될까?

  • 가능하지만, ProtectedRoute는 컴포넌트 구조 안에서 조건부 렌더링을 이용하므로 <Navigate>가 더 자연스럽고 선언적으로 보입니다.
  • useNavigate()를 사용하려면 훅을 호출해야 하므로 코드가 약간 더 복잡해질 수 있습니다:
const navigate = useNavigate();

if (!user) {
  toast.error("로그인이 필요합니다.");
  navigate("/user/signIn", { replace: true });
  return null;
}

 

위 코드는 <Navigate>보다 약간 더 장황합니다.

 


정리

  • **<Navigate>**는 렌더링 과정에서 조건부 리디렉션에 적합하고, 간결한 JSX 구조를 제공합니다.
  • **useNavigate()**는 이벤트 기반 리디렉션에 적합하며, 컴포넌트 외부 로직에서 유용합니다.
  • replace 속성은 히스토리 기록을 덮어써서 뒤로 가기를 방지하며, UX를 매끄럽게 만듭니다.