[React] Advanced Router

์ •์žฌ์„ฑยท2022๋…„ 6์›” 6์ผ
0
post-thumbnail

๐Ÿš€ ํ•™์Šต ๋ชฉํ‘œ

Path Parameter์™€ Query Parameter ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

useNavigate, useLocation, useParams ํ›…์˜ ์šฉ๋„๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

URL ์—์„œ ๋™์ ์ธ ๋ถ€๋ถ„์„ ๋ณ€์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๋™์  ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

offset ๊ณผ limit ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

1. Routing

  • route + -ing: ๊ฒฝ๋กœ(route)๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ํ–‰์œ„
  • ์ฆ‰ ๋ผ์šฐํŒ… ์ด๋ž€, ๋‹ค๋ฅธ ๊ฒฝ๋กœ(url ์ฃผ์†Œ)์— ๋”ฐ๋ผ ๋‹ค๋ฅธ View(ํ™”๋ฉด)๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ.

1-1. SPA (Single Page Application, ๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)

  • SPA ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ํš๊ธฐ์ ์œผ๋กœ ๋ฐ”๊พผ ๊ธฐ์ˆ .

- ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ๋ทฐ๋กœ ์ด๋™ํ•  ๋•Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ทฐ๋ฅผ ๋™์ ์œผ๋กœ ๋‹ค์‹œ ๊ทธ๋ฆผ.

  • SPA๋Š” MPA(Multi Page Application) ๋Œ€๋น„ ํŽ˜์ด์ง€ ๊ฐ„ ์ด๋™ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ๋Š๋‚„ ์ˆ˜ ์žˆ๋Š” ๋”œ๋ ˆ์ด๋ฅผ ์ œ๊ฑฐํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋‚˜์€ UX๋ฅผ ์ œ๊ณต. (ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ! โ† ๋งค์šฐ ์ค‘์š”)

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 ์•ฑ์ด ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์—ญํ•  (ํ™”๋ฉด ๋ฐ”๊ฟ” ๋ผ์šฐ๊ธฐ)

์œ„๋ถ€ํ„ฐ ์ง€๊ธˆ๊นŒ์ง€ ํ•ด์™”๋˜๊ฒƒ๋“ค์€ ์ •์  ๋ผ์šฐํŒ…

2. ์ •์  ๋ผ์šฐํŒ…, ๋™์  ๋ผ์šฐํŒ…

์ง€๊ธˆ๊นŒ์ง€ ํ•ด์˜จ ๋ผ์šฐํŒ… ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์™„์ „ํžˆ ์ •ํ•ด์ง„ ๊ฒฝ์šฐ(์ •์ , static)์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฒฝ๋กœ๋ฅผ ํ‘œํ˜„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

"/"         => <App />
"/users"    => <Users />
"/products" => <Products />


  • url ์„ ์‚ดํŽด๋ณด๋ฉด url ๋งˆ์ง€๋ง‰์— ํŠน์ • id ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ณ (/32692, /53424), ํ•ด๋‹น id ๊ฐ’์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์ƒ์„ธ ํŽ˜์ด์ง€ ์ •๋ณด๊ฐ€ ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. id ๊ฐ’์— ๋”ฐ๋ผ ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ url ์ด ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด๊ณ , ๊ฐ๊ฐ์˜ ๋ชจ๋“  url ์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ๊ฒฝ๋กœ์˜ ํ˜•ํƒœ์™€ ๊ฐฏ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ์ฆ‰, URL์— ๋“ค์–ด๊ฐˆ id๋ฅผ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋‹ค๋ค„์•ผ ํ•  ํ•„์š”์„ฑ์ด ์ƒ๊ธด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์ด์ฒ˜๋Ÿผ ์ •์ ์ด์ง€ ์•Š์€, ๋™์ ์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์— ๋Œ€ํ•˜์—ฌ ๋ผ์šฐํŒ…์„ ํ•˜๋Š” ๊ฒƒ์„ ๋™์  ๋ผ์šฐํŒ…(Dynamic Routing)์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

  • ์ด๋Š” ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๊ฐœ๋…(Path Parameter, Query Parameter)์„ ํ†ตํ•ด ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2-1. ๋™์ ์ธ ๋ผ์šฐํŒ…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

๋™์ ์ธ ๊ฒฝ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ Path Parameter ์™€ Query Parameter ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1) Path 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

2) Query Parameter

// 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
profile
๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ / ์ผ์ƒ๋ธ”๋กœ๊ทธ

0๊ฐœ์˜ ๋Œ“๊ธ€