<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 구조에 자연스럽게 녹아들어 조건부 렌더링과 함께 사용할 수 있습니다.
- 사용 예:
jsxCopyEditif (!user) { return <Navigate to="/user/signIn" replace />; }
- ProtectedRoute처럼 렌더링 과정에서 인증 여부를 확인하고, 조건에 따라 리디렉션이 필요한 경우 return문에서 바로 사용하기 편리합니다.
- 컴포넌트 내에서 리턴하는 방식이기 때문에 코드가 간결합니다.
2. useNavigate()
- 훅 형태로, 함수 내부에서 프로그래밍적으로 페이지 이동을 수행할 때 사용합니다.
- 장점: 특정 이벤트나 함수 호출 시 리디렉션을 트리거할 때 유용합니다.
- 사용 예:
jsxCopyEditconst 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>를 사용했을까?
- 간결성:
if (!user) 조건에서 바로 리턴하는 방식으로, JSX 구조와 자연스럽게 연결됩니다. - 명시적 리디렉션:
<Navigate>는 선언적 방식으로, JSX 내부에서 경로 이동을 쉽게 표현할 수 있습니다. - URL 직접 접근 방지:
유저가 URL을 직접 입력했을 때 인증이 필요하면 곧바로 로그인 페이지로 리디렉션됩니다. - 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를 매끄럽게 만듭니다.
'Final Project (React)' 카테고리의 다른 글
[자동로그인 기능 구현] zustand middleware를 활용한 persist와 setOptions으로 유연하고 일관된 상태 관리 (0) | 2025.01.13 |
---|---|
자동로그인 시 액세스 토큰 및 리프레시 토큰 관리 (0) | 2025.01.12 |
파일 업로드 API 사용법 (0) | 2025.01.10 |
스크롤 위치가 이전 페이지 상태를 유지하거나 내려간 상태로 이동하는 문제 (1) | 2025.01.09 |
Query Parameters와 Path Parameters의 차이 (0) | 2025.01.07 |