[React] React Router Dom - 2

eonisalยท2023๋…„ 9์›” 21์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
10/10
post-thumbnail

๐ŸŽ ์ค‘์ฒฉ ๋ผ์šฐํŒ…

์›น์‚ฌ์ดํŠธ๋ผ๋ฉด ์–ด๋– ํ•œ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ํ•˜์œ„ ๊ฒฝ๋กœ๋“ค์„ ํŒŒ์„œ ํŽ˜์ด์ง€๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋ถ„๊ธฐ์‹œ์ผœ์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ์–ด๋– ํ•œ ํŽ˜์ด์ง€(๊ฒฝ๋กœ)์— ๋“ค์–ด๊ฐ”๋Š”๋ฐ ๊ฑฐ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ๋งํฌ๊ฐ€ ์žˆ๊ณ , ๊ทธ ๋งํฌ๋ฅผ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€ ๋‚ด์—์„œ ๋˜ ๋‹ค๋ฅธ ๋ทฐ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฐ™์€ ๊ฒฝ๋กœ ๋‚ด์—์„œ ํ•˜์œ„ ๊ฒฝ๋กœ๋“ค์˜ ๋ผ์šฐํŒ…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ค‘์ฒฉ ๋ผ์šฐํŒ…์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ react router dom ์œผ๋กœ ์ค‘์ฒฉ ๋ผ์šฐํŒ…์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.


home, topics, login ๋งํฌ๋งˆ๋‹ค ๊ฐ๊ฐ ์ œ๋ชฉ๊ณผ ์ œ๋ชฉ + page๋ผ๋Š” ๋ณธ๋ฌธ ๋‚ด์šฉ์ด ๋œจ๋Š” ํ•˜์ฐฎ์€ ์‚ฌ์ดํŠธ๋‹ค.

home๊ณผ login์€ ๋“ค์–ด๊ฐ€๋ฉด ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ๋งŒ ๋‚˜์˜ค์ง€๋งŒ topics๋Š” ์ œ๋ชฉ, ๋ณธ๋ฌธ๊ณผ topic1, topic2, topic3 ๋งํฌ๊ฐ€ ๋‚˜์˜จ๋‹ค.

topics ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ๊ฒฝ๋กœ์ธ topic1, topic2, topic3 ์„ ์ค‘์ฒฉ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์คฌ๊ธฐ ๋•Œ๋ฌธ์— topic1, 2, 3 ๋งํฌ๋ฅผ ๋ˆ„๋ฅด๋ฉด topic/1, topic/2, topic/3 ์ด๋ผ๋Š” ๊ฒฝ๋กœ์˜ ์š”์ฒญ์ด ๊ฐ€๊ณ  ๊ทธ ์š”์ฒญ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ด ์˜ˆ์‹œ๋กœ ์ค‘์ฒฉ๋ผ์šฐํŒ…์„ ์‚ดํŽด๋ณด์ž

// App.js
function App() {
  return (
    <BrowserRouter>
      <div>
        <ul>
          <li><Link to="/home">home</Link></li>
          <li><Link to="/topics">topics</Link></li>
          <li><Link to="/login">login</Link></li>
        </ul>
        <Routes>
          <Route path="/home" element={<Home />} />
          <Route path="/topics/*" element={<Topics />} />
          <Route path="/login" element={<Login />} />
        </Routes>
      </div>
    </BrowserRouter>
  )
}

์ „์ฒด ํŽ˜์ด์ง€์— ํ•ด๋‹นํ•˜๋Š” App ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. home, topics, login ๋งํฌ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  ๊ฐ ๋งํฌ์˜ ๊ฒฝ๋กœ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ผ์šฐํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

์—ฌ๊ธฐ์„œ topics ๊ฒฝ๋กœ ๋ผ์šฐํ„ฐ์˜ path๊ฐ€ /topics๊ฐ€ ์•„๋‹ˆ๋ผ /topics/* ์ธ๊ฒƒ์— ์ฃผ์˜ํ•˜๊ณ  Topics ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ดํŽด๋ณด์ž.

Parameter

// Topics.js
export default function Topics() {
  return (
    <div>
      <h2>Topics</h2>
      <p>Topics Page</p>
      <hr />
      <ul>
        <li><Link to="/topics/1">topic1</Link></li>
        <li><Link to="/topics/2">topic2</Link></li>
        <li><Link to="/topics/3">topic3</Link></li>
      </ul>
        <Routes>
          <Route exact path=":tid" element={<Topic />} />
        </Routes>
    </div>
  );
}

Topics ์ปดํฌ๋„ŒํŠธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ topic1, topic2, topic3 ๋งํฌ๊ฐ€ ์žˆ๊ณ  ๊ฐ ๊ฒฝ๋กœ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ผ์šฐํ„ฐ๊ฐ€ ์žˆ๋Š”๋ฐ ๋ผ์šฐํ„ฐ๊ฐ€ :tid ๋ผ๋Š” path name ํ•˜๋‚˜๋งŒ ์กด์žฌํ•œ๋‹ค.

๊ธฐ์กด์— ์•Œ๊ณ ์žˆ๋˜ ๋ผ์šฐํŒ… ๋ฐฉ๋ฒ•๋Œ€๋กœ ๋‹จ์ˆœํžˆ ์ƒ๊ฐํ•˜์ž๋ฉด

<Routes>
  <Route exact path="/topics/1" element={<Topic1 />} />
  <Route exact path="/topics/2" element={<Topic2 />} />
  <Route exact path="/topics/3" element={<Topic3 />} />
</Routes>

์ด๋Ÿฐ์‹์œผ๋กœ topic1, topic2, topic3์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ๋กœ๋งˆ๋‹ค ๊ฐ๊ฐ ๋ผ์šฐํ„ฐ๊ฐ€ ์กด์žฌํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™์€๋ฐ ๋ง์ด๋‹ค.

๋ฌผ๋ก  ์ด๊ฒƒ๋„ ๋งž๊ธด ๋งž๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ topic์ด 1, 2, 3์œผ๋กœ 3๊ฐœ๋‹ˆ๊นŒ ๋ณ„ ์ƒ๊ด€์—†์ง€๋งŒ topic์˜ ์ˆ˜๊ฐœ ๊ต‰์žฅํžˆ ๋งŽ๋‹ค๋ฉด ๊ทธ๊ฒƒ๋“ค์˜ ๋ผ์šฐํ„ฐ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ์ž‘์„ฑํ•˜๋Š”๊ฑด ์ƒ๊ฐ๋งŒํ•ด๋„ ํ˜„๊ธฐ์ฆ์ด ๋‚œ๋‹ค.

๊ฒฝ๋กœ์—์„œ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ /topics ๋’ค์— ์˜ค๋Š” ์ˆซ์ž๋ฐ–์— ์—†๋Š”๋ฐ ์ด๊ฑธ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ์ง€์ •ํ•˜๋Š”๊ฑด ๊ต‰์žฅํžˆ ๋น„ํšจ์œจ์ ์ด๋‹ค.

์ด๋Ÿฐ ๋ถ€๋ถ„์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ Parameter ๋ผ๋Š” ๊ฐœ๋…์ด๋‹ค. Parameter๋ž€ url ์ƒ์—์„œ์˜ ๋ณ€์ˆ˜๊ฐ™์€๊ฑฐ๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

/topics/1, /topics/2, /topics/3 ๋“ฑ๋“ฑ. ์—ฌ๊ธฐ์„œ ๋ฐ”๋€Œ๋Š”๊ฑด /topics ๋’ค์˜ ์ˆซ์ž์ด๋‹ค. ์ด ์ˆซ์ž๋ฅผ ๋งˆ์น˜ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋ณ€์ˆ˜ํ™”์‹œ์ผœ์„œ ๋„˜๊ฒจ์ฃผ๋ฉด ์ข‹์ง€ ์•Š์„๊นŒ! ์‹ถ์€๊ฑฐ๋‹ค.

๊ทธ ๋ณ€์ˆ˜์ฒ˜๋ฆฌ ํ•ด์ฃผ๊ณ ์‹ถ์€ ๋ถ€๋ถ„์„ < ์ฝœ๋ก (:) + ๋ณ€์ˆ˜๋ช… > ์˜ ํ˜•์‹์œผ๋กœ url์— ์ž‘์„ฑํ•˜๋ฉด ์ด ๋ถ€๋ถ„์ด ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ๋ณ€์ˆ˜๋ช…์„ tid๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, path="/topics/:tid" ๋ผ๊ณ  ํ•˜๋ฉด ์š”์ฒญ ๊ฒฝ๋กœ๊ฐ€ /topics/1 ์ผ๋•Œ๋Š” tid = 1์ด ๋˜๊ณ , /topics/2 ์ด๋ฉด tid = 2๊ฐ€ ๋˜๋Š”๊ฒƒ์ด๋‹ค. ๋•Œ๋ฌธ์— /topics/1, /topics/2, ... ์™€ ๊ฐ™์€ ๊ฒฝ๋กœ์˜ ์š”์ฒญ๋“ค์„ /topics/:tid ๋ผ๋Š” ๊ฒฝ๋กœ์˜ ๋ผ์šฐํ„ฐ ํ•˜๋‚˜๋กœ ๋‹ด๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด ํŒŒ๋ผ๋ฏธํ„ฐ ๋ณ€์ˆ˜๋ฅผ useParams ๋ผ๋Š” ํ›…์„ ์ด์šฉํ•ด ์ ‘๊ทผํ•˜์—ฌ ์ฝ”๋“œ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ€ป react-router-dom v6 ์—์„œ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ

๊ทผ๋ฐ ์œ„์˜ ์˜ˆ์‹œ์ฝ”๋“œ์—์„œ๋Š” path๋ฅผ /topics/:tid ๊ฐ€ ์•„๋‹ˆ๋ผ :tid ๋ผ๊ณ  ํ•ด๋†จ๋‹ค.

์ด๋Š” react-router-dom์ด v6๋กœ ์—…๋ฐ์ดํŠธ๋˜๋ฉด์„œ ๋ฐ”๋€ ์‚ฌํ•ญ์ธ๋ฐ, ์›๋ž˜๋Š” ์ƒ์œ„ ๊ฒฝ๋กœ์˜ ๋ผ์šฐํ„ฐ(์ด ์˜ˆ์‹œ์—์„œ๋Š” App ์ปดํฌ๋„ŒํŠธ์˜ /topics ๋ผ์šฐํ„ฐ)์—์„œ๋Š” ๊ทธ๋ƒฅ path๋ฅผ /topics๋กœ ํ•ด๋†“๊ณ  ํ•˜์œ„ ๊ฒฝ๋กœ์˜ ๋ผ์šฐํ„ฐ์—์„œ /topics/:tid ๋ผ๊ณ  ํ•˜๋ฉด ๋๋‹ค.

ํ•˜์ง€๋งŒ ์ด์ œ๋Š” ์ƒ์œ„ ๊ฒฝ๋กœ์˜ ๋ผ์šฐํ„ฐ์—์„œ ๊ฒฝ๋กœ์˜ ๋งˆ์ง€๋ง‰์— * ์„ ๋ช…์‹œํ•˜๊ณ  ํ•˜์œ„ ๊ฒฝ๋กœ์˜ ๋ผ์šฐํ„ฐ์—์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’๋งŒ ์ ์œผ๋ฉด ๋œ๋‹ค.

v5 ๊นŒ์ง€์˜ ๋ฐฉ์‹

// App.js
function App() {
  return (
    <BrowserRouter>
      <div>
        <ul>
          <li><Link to="/home">home</Link></li>
          <li><Link to="/topics">topics</Link></li>
          <li><Link to="/login">login</Link></li>
        </ul>
        <Routes>
          <Route path="/home" element={<Home />} />
          <Route path="/topics" element={<Topics />} />
          <Route path="/login" element={<Login />} />
        </Routes>
      </div>
    </BrowserRouter>
  )
}
// Topics.js
export default function Topics() {
  return (
    <div>
      <h2>Topics</h2>
      <p>Topics Page</p>
      <hr />
      <ul>
        <li><Link to="/topics/1">topic1</Link></li>
        <li><Link to="/topics/2">topic2</Link></li>
        <li><Link to="/topics/3">topic3</Link></li>
      </ul>
        <Routes>
          <Route exact path="/topics/:tid" element={<Topic />} />
        </Routes>
    </div>
  );
}

๊ธฐ์กด์—๋Š” /topics ๊ฒฝ๋กœ ๋ผ์šฐํŒ… ํ•ด๋†“๊ณ  /topics ๊ฒฝ๋กœ ํ•˜์œ„ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” /topics/:tid ์™€ ๊ฐ™์ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ full ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋์—ˆ๋‹ค.


v6 ๋ฐฉ์‹

// App.js
function App() {
  return (
    <BrowserRouter>
      <div>
        <ul>
          <li><Link to="/home">home</Link></li>
          <li><Link to="/topics">topics</Link></li>
          <li><Link to="/login">login</Link></li>
        </ul>
        <Routes>
          <Route path="/home" element={<Home />} />
          <Route path="/topics/*" element={<Topics />} />
          <Route path="/login" element={<Login />} />
        </Routes>
      </div>
    </BrowserRouter>
  )
}
// Topics.js
export default function Topics() {
  return (
    <div>
      <h2>Topics</h2>
      <p>Topics Page</p>
      <hr />
      <ul>
        <li><Link to="/topics/1">topic1</Link></li>
        <li><Link to="/topics/2">topic2</Link></li>
        <li><Link to="/topics/3">topic3</Link></li>
      </ul>
        <Routes>
          <Route exact path=":tid" element={<Topic />} />
        </Routes>
    </div>
  );
}

ํ•˜์ง€๋งŒ v6๋ถ€ํ„ฐ๋Š” ์ƒ์œ„ ๊ฒฝ๋กœ์—์„œ /topics ๋’ค์— * ๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค.

/topics/* ๋ผ๊ณ  ํ•˜๋ฉด /topics ๋’ค์— ์–ด๋–ค ๊ฒฝ๋กœ๊ฐ€ ์˜ค๋“  ๋‹ค ๋ฐ›๊ฒ ๋‹ค๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ๋˜๋‹ˆ ๋’ค์— ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์˜ค๋Š” ๊ฒฝ์šฐ์— ๊ทธ๊ฒƒ์„ ๋ฐ›๊ธฐ์œ„ํ•ด ์จ์ค˜์•ผ๋˜๋Š” ๊ฑฐ ๊ฐ™๋‹ค.

์ €๋ ‡๊ฒŒ ํ•ด๋†“๊ณ  ํ•˜์œ„ ๊ฒฝ๋กœ ๋ถ€๋ถ„์—์„œ๋Š” ๊ทธ๋ƒฅ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ์“ฐ๋ฉด ๋œ๋‹ค.

useParams

ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์„ ์ง€์ •ํ•ด์คฌ์œผ๋ฉด useParams ๋ผ๋Š” ํ›…์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

// topic.js
export default function Topic() {
  const param = useParams();
  console.log(param);
  return (
    <div>
      <h2>{`Topic${param.tid}`}</h2>
      <p>{`Topic${param.tid} page`}</p>
    </div>
  );
}

/topics/:tid ๊ฒฝ๋กœ์— ํ•ด๋‹นํ•˜๋Š” ์ด ์ปดํฌ๋„ŒํŠธ์—์„œ useParams ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ์ธ tid๊ฐ€ ํ”„๋กœํผํ‹ฐ๋กœ ํฌํ•จ๋œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋งŒ์•ฝ /topics/1 ๊ฒฝ๋กœ๋กœ ๋“ค์–ด๊ฐ”๋‹ค๋ฉด console.log(param)์— ์˜ํ•ด ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์ฐฝ์—

์ด์™€ ๊ฐ™์ด ์ฐํžˆ๋Š”๋ฐ * ์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๋„ ๊ฐ’์ด ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์ธ 1๋กœ ์ง€์ •๋˜์–ด ์ถ”๊ฐ€๋˜์–ด์žˆ๋Š”๊ฑด App.js์—์„œ์˜ <Route path="/topics/*" element={<Topics />} /> ๋•Œ๋ฌธ์ธ ๊ฑฐ ๊ฐ™์€๋ฐ ์ •ํ™•ํ•œ ์ด์œ ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค..

์•„๋ฌดํŠผ ์ค‘์š”ํ•œ๊ฑด useParams ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด์— ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๊ทธ์˜ ๊ฐ’์ด ํ”„๋กœํผํ‹ฐ๋กœ ๋‹ด๊ฒจ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ๋”ฐ๋ผ์„œ ์ด ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด tid์˜ ๊ฐ’์— ์ ‘๊ทผํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

<h2>{`Topic${param.tid}`}</h2>
<p>{`Topic${param.tid} page`}</p>

๊ทธ๋ž˜์„œ useParams๋กœ ๊ฐ€์ ธ์˜จ param ๊ฐ์ฒด์˜ tid์— ์ ‘๊ทผํ•˜์—ฌ /topics/1 ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด Topic1๊ณผ Topic1 page ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ์ถœ๋ ฅ๋˜๊ฒŒ ๋œ๋‹ค.





์ฐธ๊ณ ์ž๋ฃŒ

https://whales.tistory.com/140#google_vignette
https://blog.woolta.com/categories/1/posts/211

profile
์–ธ์ œ๊นŒ์ง€_์ด๋ ‡๊ฒŒ_์‚ด์•„์•ผ๋ผ_

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