최근에 노마드코더 React JS 마스터클래스 강의를 수강하면서 React Router Dom
v5를 사용하게 되었다. 기존 프로젝트에서 v6을 사용해 왔기 때문에 이전 버전인 v5를 사용하는 건 낯선 느낌이 강했다. v5를 굳이 사용해야하나.. 싶었으나 다운로드 수를 보니 v5가 현재까지도 꾸준히 사용되고 있었다.
v6보다 다운로드 수가 더 많다니..
그래서 이왕 v5를 사용하게 된 김에 v5로 프로젝트를 완성해 보고, v6으로 버전 업을 해볼까 한다.
우선 이번 포스팅은 React Router Dom
v5 사용에 대한 기록이다.
React Router
를 사용하여 라우팅을 관리함React Router
에서 <Route>
컴포넌트를 사용하여 라우트를 정의함React Router
에서 <BrowswerRouter>
또는 <HashRouter>
등의 라우터 컴포넌트를 사용react-router
vs. react-router-dom
react-router-dom
을 설치하고 사용하는 것이 일반적react-router
<Route>
, <Link>
, <Switch>
등의 기본 컴포넌트를 포함함react-router-dom
react-router
를 기반으로 웹 환경에서 사용할 수 있도록 추가된 패키지<BrowserRouter>
, <Link>
, <Route>
등의 웹 브라우저에서 사용하는 기능 제공SPA 지원
더 나은 사용자 경험
동적 라우팅
중첩된 라우팅
URL의 해시(#
)를 이용하여 라우팅 처리
#
) 뒷 부분을 서버에 요청하지 않기 때문에, 서버 측에서 별도의 설정이 필요하지 않음서버에서 라우팅에 대한 추가적인 설정 없이도 동작하기 때문에 간단하게 사용 가능
v5를 사용하기 위해서 버전을 명시하여 설치했다.
npm install react-router-dom@5.3.4
// Router.tsx
import { BrowserRouter, Switch, Route } from "react-router-dom";
import CoinDetailPage from "./pages/CoinDetailPage";
import HomePage from "./pages/HomePage";
const Router = () => {
return (
<BrowserRouter>
<Switch>
<Route path="/:coinId">
<CoinDetailPage />
</Route>
<Route path="/">
<HomePage />
</Route>
</Switch>
</BrowserRouter>
);
};
export default Router;
위의 코드와 같이 기본적인 설정을 하여 Router
컴포넌트를 생성했다.
내 경우, 페이지가 CoinDetailPage
와 HomePage
로 2개라서 위와 같이 코드를 작성했다.
Switch (스위치)
- 여러 라우트 중에서 맨 처음으로 매칭되는 라우트만을 렌더링하고, 나머지는 무시하는 컴포넌트
<Switch>
컴포넌트를 사용하여 가장 먼저 매칭되는 라우트만 렌더링
// App.tsx
import Router from "./Router";
const App = () => (
<>
<Router />
</>
);
export default App;
상위 렌더링 요소에서 Router
컴포넌트를 붙여주면 된다.
<Link>
컴포넌트를 사용하여 사용자가 특정 경로로 이동할 수 있는 링크를 만듦// Coins/index.tsx
import { Link } from "react-router-dom";
import * as style from "./styles";
const Coins = () => {
// ...
return (
<style.CoinsList>
{data?.map((coin) => (
<style.Coin key={coin.id}>
<Link
to={{
pathname: `/${coin.id}`,
state: { name: coin.name },
}}
>
{coin.name}
</Link>
</style.Coin>
))}
</style.CoinsList>
);
};
export default Coins;
위의 코드의 경우, Link
컴포넌트가 각 코인에 대한 링크를 생성하고 있다.
to
prop은 링크가 이동할 경로와 해당 경로로 전달할 상태를 설정한다.
pathname
은 URL 경로를 나타내며, 여기에서는 /${coin.id}
로 동적으로 생성된다.
state
는 해당 링크로 이동할 때 함께 전달되는 state이며, 여기에서는 코인의 이름이 전달되고 있다.
useParams
와 useLocation
은 라우트 매개변수 및 현재 경로에 대한 정보를 제공하는 데 사용된다. 위에서 Link
컴포넌트 내에서 to
prop을 통해 생성된 동적인 경로, coinId
를 useParams
가 가져올 수 있다. 또한 Link
컴포넌트에서 전달한 state
는 useLocation
을 사용하여 가져올 수 있다.
// CoinOverview.tsx
import { useParams, useLocation } from "react-router-dom";
interface RouteParams {
coinId: string;
}
interface RouteState {
name: string;
}
const CoinOverview = () => {
const { coinId } = useParams<RouteParams>();
const { state } = useLocation<RouteState>();
// ...
}
export default CoinOverview;
useParams
훅을 사용하여 현재 경로의 동적으로 생성된 매개변수를 가져왔다. coinId
는 동적으로 설정된 코인 id를 나타내며, 라우트 경로에서 /:coinId
에 해당하는 부분이다. 이와같이 동적으로 설정된 매개변수를 사용하면 코인 id에 따라 서로 다른 데이터를 렌더링할 수 있다.
useLocation
훅을 사용하여 현재 위치(경로)에 대한 정보를 가져왔다. 위의 코드에서는 이전 페이지인 Coins
컴포넌트에서 전달한 상태 정보를 사용하기 위해 state
를 활용하고 있다.
// CoinOverview/index.tsx
import { useHistory } from "react-router-dom";
import * as style from "./styles";
const CoinOverview = () => {
const history = useHistory();
const handleBackButtonClick = () => {
history.push("/");
};
return (
<>
<style.BackIcStyle onClick={handleBackButtonClick} />
</>
)
}
export default CoinOverview;
위의 경우, 뒤로 가기 버튼에서 useHistory
가 사용되었다.
뒤로 가기 버튼을 클릭하면 history.push("/")
를 사용하여 루트 경로로 이동하도록 설정했다.
https://velog.io/@kandy1002/React-Router-Dom-%EA%B0%9C%EB%85%90%EC%9E%A1%EA%B8%B0#react-router-dom