์ต๊ทผ์ react-router-dom์ ์ฐ๋ ค๊ณ ๋ณด๋ ๋ฒ์ ์ ์ด ๋์ด์ ๊ธฐ์กด์ ์๋ v5์ ์ฌํญ๋ค์ด ๋ง์ด ๋ฐ๋ ๊ฒ์ ์์๋ค. ๊ฐ๋ น Switch๊ฐ Routes๋ก, Redirect๊ฐ Navigate ๋ฑ์ผ๋ก ๋์ฒด๋๋ ๊ฒ์ด ์์๋๋ฐ, ์ข ๋ ํ์คํ ์ดํด ๊ฐ๋ฅํ ์ปดํฌ๋ํธ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝ๋๊ธฐ๋ ํ๊ณ , ๊ธฐ์กด rediect ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Navigate API๊ฐ ๋์ ๋๊ธฐ๋ ํ๋ค. ์๋๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ์ผ๋ฉด์ ํ์ํ ๋ด์ฉ๋ง ์ ๋ฆฌํด๋ณด์๋๋ฐ, ๋ ์์ธํ ๋ด์ฉ์ ์ด๊ณณ์์ ํ์ธํ ์ ์๋ค.
๊ณต์ ๋ฌธ์์์ ๋งํ๊ธธ, ์ฐ์ v5์์ ํ์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํ ํจํค์ง๋ ์กฐ๊ธ ์์ผ์ด ๊ฑธ๋ฆด ๊ฒ ๊ฐ๋ค๊ณ ํ๋ค. ๋ช ๊ฐ์ง ์ถ๊ฐ๋๋ routes๊ฐ ์์ ๊ฒ์ธ์ง, ๋ณ๊ฒฝ๋ ๊ฒ์ด ์์์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง..!
We recommend waiting for the backwards compatibility package to be released before upgrading apps that have more than a few routes.
๊ฐ์
์ ๊ท ๋ฆฌ์กํธ ์ ๋ฐ์ดํธ์ ๋ง์ถฐ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ด ์ ๊ท ๋์ ๋์๋ค. ์์ ๋งํ ๊ฒ์ฒ๋ผ v6๋ v4, 5์ ๋นํด์ ๋ง์ ๋ณํ๊ฐ ์์๋ค. ์์ ์ฝ๋ ์ค ์ผ๋ถ๋ฅผ ๋ฒ์ ์ ์ ํด๋ณด๋ฉด์ ์ด๋ป๊ฒ ๋ฌ๋ผ์ก๋์ง ๋ณด๋ ค๊ณ ํ๋ค.
์๋๋ ์ด์ ๋ฆฌ์กํธ ํ๋ก์ ํธ์ package.json. react-router-dom์ด 6 ๋ฒ์ ์ด์ ์ด๋ผ๋ฉด ์ ๊ทธ๋ ์ด๋ ํด๋ด์งํ๋ค.
"@testing-library/jest-dom": "^5.11.4",
"@testing-library/react": "^11.1.0",
"@testing-library/user-event": "^12.1.10",
"axios": "^0.21.1",
"react": "^17.0.2",
"react-dom": "^17.0.2",
"react-router-dom": "^5.2.0",
"react-scripts": "4.0.3",
"web-vitals": "^1.0.1"
React v16.8๋ก ์ ๊ทธ๋ ์ด๋
๋ฆฌ์กํธ๋ ์ด๋ฏธ ๋ฒ์ 17์ ์ฐ๊ณ ์์๋ค. React Router v6๋ ๋ฆฌ์กํธ ํ
์ ๋ง์ด ์ฐ๊ณ ์์ด์, 16.8 ๋ฒ์ ์ด์
์ ๊ถ๊ณ ํ๊ณ ์๋ค.
React Router v5.1๋ก ์ ๊ทธ๋ ์ด๋ํ๊ธฐ
๋ง์ผ 5.1 ๋ฒ์ ์ด์ ์ ๊ฒ์ ์ฐ๊ณ ์์๋ค๋ฉด, ์ฐ์ 5.1 ๋ฒ์ ์ผ๋ก ๋จผ์ ์ ๊ทธ๋ ์ด๋ ํ๊ณ , ๊ทธ ์ดํ์ v6๋ก ๋์ด๊ฐ๋ ๊ฒ์ด ์์ํ๋ค๊ณ ์ค๋ช ํ๊ธธ๋ ํ ๋ฒ ์ง๊ณ ๋์ด๊ฐ๊ธฐ๋ก ํ๋ค. ์ด๋ฐ ์ ๋ฐ ์คํ์ค๋ฒํ๋ก์ฐ ๋ต๋ณ๋ค์ ๋ณด๋ฉด ์ฌ๋ฌ ๋ฒ์ ์ ์ฝ๋๋ฅผ ์์ด์ ๋ณด๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ถํ ์ค ์๋ฉด ํ์ฌ ์ฝ๋ ์ฌํญ์ ๋ง๊ฒ ์ ์ฉํ๊ธฐ๊ฐ ๋ ์ฌ์ธ ๊ฒ์ด๋ค.
// v5.1 ์ด์ ์ v4 ๋๋ v5
function User({ id }) {
// ...
}
function App() {
return (
<Switch>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
<Route
path="/users/:id"
render={({ match }) => (
<User id={match.params.id} />
)}
/>
</Switch>
);
}
render props๋ฅผ ํตํด ์ปดํฌ๋ํธ๋ฅผ ๋ค๋ฃจ์๋ค๋ฉด, v5์์๋ children props๋ฅผ ํตํด์ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ usePramas
ํ
์ ํตํด ์ ๋ฌ๋๋ params ๊ฐ์ ๋ฐ์ ์ ์์๋ค.
// v5.1 preferred style
function User() {
let { id } = useParams();
// ...
}
function App() {
return (
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route path="/about">
<About />
</Route>
{/* Can also use a named `children` prop */}
<Route path="/users/:id" children={<User />} />
</Switch>
);
}
v6๋ฅผ ํฌํจํด v5๋ ์ด๋ฐ ์์ ์ปดํฌ๋ํธ ๋์ elements ๋ฅผ ์ฐ๋ ๊ฒ์ ์ ํธํ๋ค.
์ฆ, ์ด๋ฒ ๋ฒ์ ์์๋
<Route render>
๋<Route component>
๋์<Route children>
์ ์ธ ๊ฒ- location, params ๊ฐ์ state์ ์ ๊ทผํ๊ณ ์ ํ ๋๋ hook์ ์ธ ๊ฒ
<Switch>
๋ด๋ถ์ ์กด์ฌํ์ง ์๋<Route>
๋ ๋ชจ๋<Switch>
์์ ์ ๋๋ก ์์นํ๋๋ก ํ๊ฑฐ๋useRouteMatch
๋ก ๋์ฒดํ ๊ฒ.
React Route v6์ผ๋ก ์ ๊ทธ๋ ์ด๋ ํ๊ธฐ
<Switch>
์์ ์๋ <Redirect>
์ ๊ฑฐํ๊ธฐ : <Navigate>
API
๊ธฐ์กด์๋ Redirect๋ฅผ ์ํ ๋ ์๋ง ์ด๋ฐ ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ์ ๊ฒ์ด๋ค.
import { Switch, Route, Redirect } from "react-router-dom";
function App() {
return (
<Switch>
<Route path="/home">
<HomePage />
</Route>
<Redirect from="/" to="/home" />
</Switch>
);
}
์ฆ, ๋ธ๋ผ์ฐ์ ๋ ๋ฆฌ์กํธ์ Node.js ์๋ฒ ํ๊ฒฝ์์ ์ ์ ๊ฐ ์ฑ์ / URL์ ๋๋ฌํ์ ๋, ์๋์ผ๋ก /home์ผ๋ก ์ด๋์์ผ์ฃผ๋ ์ฝ๋์ด๋ค. ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ <Redirect>
๊ฐ ํ๋ ์ญํ ์ ์ด๊ธฐ ๋ ๋ ์์ history.replaceState()
๋ฅผ ํด์ฃผ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด์๊ฐ ๋ช ๊ฐ์ง ์๋๋ฐ, ๊ฐ๋ น ๋ธ๋ผ์ฐ์ ์์์ ๋ฆฌ๋ค์ด๋ ํธ๋ ์ฌ์ค์ ๋ฆฌ๋ค์ด๋ ํธ๊ฐ ์๋๋ผ๊ณ ํ๋ค. ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๋ URL์ ๋ํด์๋ ์๋ฒ๊ฐ status code 200์ผ๋ก, ์ ํจํ HTML ํ์ด์ง๋ฅผ ์๋ธํ๊ฒ ๋๋ค. ๋ง์ผ ๊ฒ์์์ง ํฌ๋กค๋ฌ๋ก ๋ค์ด์จ ์์ฒญ์ด์๋ค๋ฉด, ์ ํจํ HTML์ด ์๋ธ๋๋, ํด๋น ์ธ๋ฑ์ค๊ฐ ์ง์ง ์ธ๋ฑ์ค ํ์ด์ง๋ก ์ธ์ํ ๊ฒ์ด๋ค. ์๋๋๋ก redirectํด์ ๋ณด๋ธ ํ์ด์ง์ ๋ํด์๋ ์ ๊ฒฝ์ฐ์ง ์์ผ๋ฏ๋ก SEO์ ์ข์ง ๋ชปํ๋ค.
ํน์ ์๋ฒ ์์์์ ์ด๊ธฐ ๋ ๋ ์์ redirect ์ด์์ ๋ํด์๋ ์ด ๋ฌธ์๋ฅผ ๋ ์ฝ์ด๋ณด๋ฉด ์ข๋ค. ์ ๋ด์ฉ๋ ๋ฌธ์์์ ํฌํจํ๊ณ ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด React๋ฅผ ๋ ๋ํ๊ธฐ ์ ์ ๋ฐ๋ก ์๋ฒ ์์์ ๋ฆฌ๋ค์ด๋ ํธํ๊ณ , ์ ์ ํ status code๋ฅผ ๋ณด๋ด๋ฉด ๋๋ค. ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ์ฑ์ด ์๋๋ผ๋ฉด ์ด๊ธฐ ๋ ๋๋ง ์์ ์๋์ฒ๋ผ ์ฝ๋๋ฅผ ์งค ์ ์๋ค.
import { Routes, Route, Navigate } from "react-router-dom";
function App() {
return (
<Routes>
<Route path="/home" element={<Home />} />
<Route path="/" element={<Navigate replace to="/home" />} />
</Routes>
);
}
์ด๋๊น์ง๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ์ฑ์ด ์๋ ๋ ์ธ ์ ์๋ค. navigation
์ React.useEffect()
๋ก ์ธํด ์ผ์ด๋๋ ๋ผ์ดํ ์ฌ์ดํด์ด๋ผ๋ ์ !
<Navigate>
์๋ฆฌ๋จผํธ๋ useNavigate()
ํ
์ declarative version์ด๋ผ ๋ณผ ์ ์๋๋ฐ, ์ด์ ๋ฒ์ ์์ <Switch>
๋ฐ๊นฅ์ <Redirect>
๋ฅผ ๋์ฒดํ ๋ชฉ์ ์ผ๋ก ์ข๋ค.
<Navigate replace>
์์ replace prop์ history.replaceState()
๋ฅผ ์ธ์ง ์ฌ๋ถ๋ฅผ ๋ฌป๋๋ค.