๐ ํ์ต ๋ชฉํ
Path Parameter์ Query Parameter ์ ์ฐจ์ด์ ์ ๋ํด์ ์ค๋ช ํ ์ ์๋ค.
useNavigate, useLocation, useParams ํ ์ ์ฉ๋๊ฐ ๋ฌด์์ธ์ง ์ค๋ช ํ ์ ์๋ค.
URL ์์ ๋์ ์ธ ๋ถ๋ถ์ ๋ณ์๋ก ์ฒ๋ฆฌํ ์ ์๊ณ , ์ด๋ฅผ ํตํด ๋์ ๋ผ์ฐํ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
offset ๊ณผ limit ๊ฐ๋ ์ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ค์ด์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
route + -ing
: ๊ฒฝ๋ก(route)๋ฅผ ์ฐพ์๊ฐ๋ ํ์- ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๋ทฐ๋ก ์ด๋ํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ทฐ๋ฅผ ๋์ ์ผ๋ก ๋ค์ ๊ทธ๋ฆผ.
React๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ผ์ฐํ ์์คํ ์ ๊ฐ์ถ๊ณ ์์ง ์์ผ๋ฏ๋ก(๋ผ์ด๋ธ๋ฌ๋ฆฌ!), react-router-dom ๊ณผ ๊ฐ์ ๋ถ๊ฐ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํด์ ๋ผ์ฐํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
// index.html
<!DOCTYPE html>
<head>
<title>React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
// index.js
ReactDOM.render(<Router />, document.getElementById("root"));
// Router.js
const Router = () => {
return (
<BrowserRouter>
<Nav />
<Routes>
<Route path="/" element={<App />} />
<Route path="/users" element={<Users />} />
<Route path="/products" element={<Products />} />
<Route path="*" element={<NotFound />} />
</Routes>
<Footer />
</BrowserRouter>
);
};
index.html
: public/index.html์ ์์นํ๋ฉฐ React ํ์ด์ง ๋ก๋ ์ ๊ฐ์ฅ ๋จผ์ ํธ์ถ๋๋ ์์ญ
index.js
: React ์ฑ์ ๋ ๋ํ๊ณ index.html์ div#root ์ดํ์ ๋ผ์๋ฃ๋ ์ญํ
Router.js
: React ์ฑ์ด ๊ฒฝ๋ก์ ๋ฐ๋ผ ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค์ง ๊ฒฐ์ ํ๋ ์ญํ (ํ๋ฉด ๋ฐ๊ฟ ๋ผ์ฐ๊ธฐ)
์๋ถํฐ ์ง๊ธ๊น์ง ํด์๋๊ฒ๋ค์ ์ ์ ๋ผ์ฐํ
์ง๊ธ๊น์ง ํด์จ ๋ผ์ฐํ ๋ฐฉ๋ฒ์ผ๋ก๋ ์์ ํ ์ ํด์ง ๊ฒฝ์ฐ(์ ์ , static)์ ๋ํด์๋ง ๊ฒฝ๋ก๋ฅผ ํํ ํ ์ ์์์ต๋๋ค.
"/" => <App />
"/users" => <Users />
"/products" => <Products />
url ์ ์ดํด๋ณด๋ฉด url ๋ง์ง๋ง์ ํน์ id ๊ฐ์ด ๋ค์ด๊ฐ๊ณ (/32692, /53424), ํด๋น id ๊ฐ์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ์์ธ ํ์ด์ง ์ ๋ณด๊ฐ ํ๋ฉด์ ๊ทธ๋ ค์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. id ๊ฐ์ ๋ฐ๋ผ ๋ฌด์ํ ๋ง์ url ์ด ๋ํ๋ ๊ฒ์ด๊ณ , ๊ฐ๊ฐ์ ๋ชจ๋ url ์ ๋ํด ๋ฏธ๋ฆฌ ๊ฒฝ๋ก์ ํํ์ ๊ฐฏ์๋ฅผ ๊ฒฐ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ฆ, URL์ ๋ค์ด๊ฐ id๋ฅผ ๋ณ์์ฒ๋ผ ๋ค๋ค์ผ ํ ํ์์ฑ์ด ์๊ธด ๊ฒ์ ๋๋ค.
์ด์ฒ๋ผ ์ ์ ์ด์ง ์์, ๋์ ์ผ ์ ์๋ ๊ฒฝ๋ก์ ๋ํ์ฌ ๋ผ์ฐํ ์ ํ๋ ๊ฒ์ ๋์ ๋ผ์ฐํ (Dynamic Routing)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ด๋ ๋ค์ ๋ ๊ฐ์ง ๊ฐ๋ (Path Parameter, Query Parameter)์ ํตํด ์ ์ฉํด๋ณผ ์ ์์ต๋๋ค.
๋์ ์ธ ๊ฒฝ๋ก๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก Path Parameter ์ Query Parameter ์ด ์์ต๋๋ค.
// Bad
"/users/1" => <Users id={1} />
"/users/2" => <Users id={2} />
"/users/3" => <Users id={3} />
"/users/4" => <Users id={4} />
"/users/5" => <Users id={5} />
// Good
"/users/:id" => <Users /> // useParams().id
// Bad
"/search?keyword=์์ฝ๋" : <Search keyword="์์ฝ๋" />
"/search?keyword=๋ฆฌ์กํธ" : <Search keyword="๋ฆฌ์กํธ" />
"/search?keyword=๋ผ์ฐํ
" : <Search keyword="๋ผ์ฐํ
" />
"/search?keyword=์ฟผ๋ฆฌ์คํธ๋ง" : <Search keyword="์ฟผ๋ฆฌ์คํธ๋ง" />
"/search?keyword=SPA" : <Search keyword="SPA" />
// Good
"/search?keyword=something" : <Search /> // useLocation().search