프론트엔드 개발을 하면서 빼놓을 수 없는 필수적인 작업 중 하나는 페이지를 이동하는 기능의 구현이다. 간단하지만 그렇기에 의외로 구현이 복잡하거나 어려운 상황에 직면하기 쉽고, 기능 구현에 사용할 수 있는 수많은 방법들을 구분하는 것도 쉽지 않은 일이다. 이번 글에서는 프론트엔드 개발에서 페이지를 이동하는 여러가지 방법들을 정리하고자 한다.
성능 최적화: 브라우저의 기본 동작을 방해하지 않으면서 내비게이션을 최적화한다.
간결성: 단순히 to 속성에 경로를 지정하는 것만으로 페이지 이동이 가능하다.
유연성 부족: 페이지 이동 전에 추가 로직을 실행하기 어렵다.
스타일링 제한: 기본적으로 앵커a 태그로 렌더링되므로, 특정 스타일이나 동작 적용에 제한이 있을 수 있다.
간단한 페이지 이동, 특별한 로직이 필요 없는 경우.
import { Link } from 'react-router-dom';
const MyComponent = () => (
<Link to="/about">About Page</Link>
);
유연성: 페이지 이동 전에 추가 로직을 실행할 수 있습니다.
커스터마이즈 가능: 버튼의 스타일이나 동작을 완전히 제어할 수 있습니다.
보일러플레이트 코드: 추가적인 코드 작성이 필요합니다.
React Router와의 통합 부족: URL 업데이트나 상태 관리 기능을 수동으로 관리해야 할 수도 있습니다.
복잡한 상태 관리나 추가 로직이 필요한 경우.
const MyComponent = ({ history }) => (
<button onClick={() => {
// 추가 로직
history.push('/about');
}}>
About Page
</button>
);
직접 제어: 프로그래밍 방식으로 내비게이션을 제어할 수 있습니다.
조건부 이동: 특정 조건이 충족될 때 페이지 이동을 제어할 수 있습니다.
복잡성: history 객체에 대한 이해가 필요합니다.
SPA 특성 무시: 일부 경우 SPA의 장점을 제대로 활용하지 못할 수 있습니다.
사용자 인터랙션 없이 페이지 이동이 필요할 때, 예를 들어 로그인한 다음 리다이렉트.
const MyComponent = ({ history }) => {
const navigateToAbout = () => {
history.push('/about');
};
return (
<button onClick={navigateToAbout}>About Page</button>
);
};
자동 리다이렉트: 특정 조건에서 자동으로 다른 경로로 리다이렉트합니다.
유연성 부족: 리다이렉트 로직이 고정적일 수 있습니다.
접근 권한이 없는 페이지로부터 보호할 때.
import { Redirect } from 'react-router-dom';
const MyComponent = ({ isAuthenticated }) => (
isAuthenticated ? <Redirect to="/dashboard" /> : <Redirect to="/login" />
);
훅 기반의 접근: 함수 컴포넌트에서 쉽게 사용할 수 있습니다.
간결하고 직관적: 코드가 간결하고 이해하기 쉽습니다.
React Router v6 필요: 오래된 프로젝트에서는 사용하기 어려울 수 있습니다.
함수 컴포넌트에서의 페이지 이동
import { useNavigate } from 'react-router-dom';
const MyComponent = () => {
const navigate = useNavigate();
return (
<button onClick={() => navigate('/about')}>About Page</button>
);
};
간단함: JavaScript의 기본 기능을 사용하기 때문에 추가 라이브러리가 필요 없습니다.
SPA 특성 무시: 페이지가 완전히 새로 로드되어 SPA의 장점을 잃을 수 있습니다.
외부 URL로의 리다이렉트나, SPA가 아닌 전통적인 웹페이지에서의 사용.
const MyComponent = () => (
<button onClick={() => window.location.href = 'https://example.com'}>
Visit Example.com
</button>
);