[React] React Router Dom - 1

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

React

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

๐ŸŽฏ SPA ์—์„œ์˜ ๋ผ์šฐํŒ…

์›น์‚ฌ์ดํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฝ๋กœ๋ฅผ ์š”์ฒญํ•˜๋ฉด ๊ทธ ๊ฒฝ๋กœ์— ํ•ด๋‹นํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•œ๋‹ค.

MPA ๋ฐฉ์‹์€ ์‹ค์ œ๋กœ ํŽ˜์ด์ง€๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ์žˆ๊ณ  ์„œ๋ฒ„์ธก์—์„œ ๊ฐ ๊ฒฝ๋กœ์— ํ•ด๋‹นํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ์‘๋‹ตํ•˜๋Š” ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์„œ ํŽ˜์ด์ง€ ์ด๋™์„ ๊ตฌํ˜„ํ•˜์ง€๋งŒ, ๋ฆฌ์•กํŠธ๋Š” SPA ๋ฐฉ์‹์œผ๋กœ ์•ฑ์„ ๊ตฌ์„ฑํ•˜๋ฏ€๋กœ ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€์—์„œ ์š”์ฒญ๋ฐ›์€ ๊ฒฝ๋กœ์— ํ•ด๋‹นํ•˜๋Š” ๋ทฐ์˜ ๋ชจ์Šต์„ ๊ตฌํ˜„ํ•˜์—ฌ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ์—์„œ ๊ฐ ๊ฒฝ๋กœ์˜ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฒฝ๋กœ๋งˆ๋‹ค ๋‹ค๋ฅธ ์‘๋‹ต์„ ํ•˜์—ฌ ํŽ˜์ด์ง€ ์ด๋™์„ ๊ตฌํ˜„ํ•˜๋Š”๊ฒƒ์„ ์‰ฝ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๊ฐ€ react-router ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

React-Router๋Š” ์‹ ๊ทœ ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๋Š” ์ƒํ™ฉ์—์„œ ๊ฐ๊ฐ์˜ url์— ๋”ฐ๋ผ ์„ ํƒ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€์—์„œ ๋ Œ๋”๋ง ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ถœ์ฒ˜ : https://goddaehee.tistory.com/305

์›น์—์„œ๋Š” react-router-dom ์„ ์‚ฌ์šฉํ•œ๋‹ค. react-router์™€ react-router-dom์˜ ์ฐจ์ด๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์•„๋ž˜ ํŽ˜์ด์ง€ ์ฐธ๊ณ !

https://velog.io/@devstone/react-router-dom-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B3%A0-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0

โš“ react-router-dom

BrowserRouter

BrowserRouter๋Š” ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ ์‹ถ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ๋Š” Wrapper ์ปดํฌ๋„ŒํŠธ๋กœ, HTML5์˜ History API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UI์™€ URL์˜ ์‹ฑํฌ๋ฅผ ๋งž์ถ”๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋ฅผ BrowserRouter๋กœ ๊ฐ์‹ธ๋ฉด ๊ทธ ์ปดํฌ๋„ŒํŠธ๋Š” BrowserRouter์˜ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด ๋œ๋‹ค.

์ฆ‰ react-router-dom์„ ์ ์šฉํ•˜๊ณ ์‹ถ์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ <BrowserRouter></BrowserRouter> ๋กœ ๊ฐ์‹ธ์ค˜์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ App ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ ์‹ถ๋‹ค๋ฉด

import{ BrowserRouter, Route, Switch} from'react-router-dom'
export functionApp() {
  return (
    <BrowserRouter>
      <Switch>
        <Routepath="/about"><AboutPage/></Route>
        <Routepath="/contact"><ContactPage/></Route>
        <Routepath="/"><HomePage/></Route>
      </Switch>
    </BrowserRouter>
  );
}

์ด๋ ‡๊ฒŒ ์ปดํฌ๋„ŒํŠธ์˜ return์— ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์ฃผ๊ฑฐ๋‚˜

ReactDOM.render(<BrowserRouter><App /></BrowserRouter>, document.getElementById("root"));

์™€ ๊ฐ™์ด App ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๋ฅผ ๊ฐ์‹ธ์ฃผ๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ App ์ปดํฌ๋„ŒํŠธ์— BrowserRouter๋ฅผ ์”Œ์›Œ์ฃผ๋ฉด App ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜ ์ •์˜๋ถ€์—์„œ BrowserRouter ์—†์ด ๊ทธ๋ƒฅ ํ•˜๊ณ ์‹ถ์€ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— BrowserRouter๋ฅผ ์”Œ์›Œ๋†จ์œผ๋ฉด ๊ทธ ์ปดํฌ๋„ŒํŠธ์˜ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊นŒ์ง€ ๋‹ค ์ ์šฉ์ด ๋˜๊ธฐ๋•Œ๋ฌธ!

์ฒ˜์Œ์—” ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ๋‹ค ์”Œ์›Œ์•ผํ•˜๋Š”์ค„์•Œ๊ณ  ํ–ˆ๋Š”๋ฐ ์•ˆ๋˜๋”๋ผ. ์ค‘์ฒฉ์œผ๋กœ ์”Œ์šฐ๋ฉด ์—๋Ÿฌ๋‚จ

Route

Route๋Š” ํŠน์ • ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์™”์„๋•Œ ํ™”๋ฉด์— ๋ Œ๋”๋ง๋  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์ •์ฃผ๋Š” ์šฉ๋„์˜ ํƒœ๊ทธ์ด๋‹ค.

Route ํƒœ๊ทธ์— path props๋ฅผ ์ง€์ •ํ•˜์—ฌ ์–ด๋–ค ๊ฒฝ๋กœ์ธ ๊ฒฝ์šฐ์— ์‘๋‹ต์„ ํ• ๊ฒƒ์ธ์ง€๋ฅผ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

v6 ์ด์ „

Route๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŒ… ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. Route ํƒœ๊ทธ ์•ˆ์— ์ปดํฌ๋„ŒํŠธ ํƒœ๊ทธ๋ฅผ ๋„ฃ๋Š” ์ƒŒ๋“œ์œ„์น˜ ๊ตฌ์กฐ
<Route path="/login"><LoginForm /></Route>
  1. Route ํƒœ๊ทธ์— component props ์‚ฌ์šฉ
<Route path="/login" component={LoginForm} />

v6

react-router-dom์ด v6๋กœ ์—…๋ฐ์ดํŠธ๋˜๋ฉด์„œ props๋ช…์ด element์ธ props๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ†ต์ผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

<Route path="/login" element={ <LoginForm /> }

element props์˜ ๊ฐ’๋„ ์›๋ž˜ ์ปดํฌ๋„ŒํŠธ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ <LoginForm /> ์ด๋ผ๊ณ  ํ•ด์ค˜์•ผํ•จ!


v6 ์ด์ „

Route๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ํ•œ๊ฐ€์ง€ ์ฃผ์˜์‚ฌํ•ญ์ด ์žˆ๋‹ค.

์–˜๋Š” path๋กœ ์ง€์ •ํ•œ ๊ฒฝ๋กœ์™€ ์™„์ „ํžˆ ๊ฐ™์€ ๊ฒฝ์šฐ ๋ง๊ณ  ๋ถ€๋ถ„์ ์œผ๋กœ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋„ ์‘๋‹ต์„ ์‹œํ‚จ๋‹ค.

<Route path="/" element={<Topics />} />
<Route path="/topics" element={<Topics />} />

์ด๋ ‡๊ฒŒ ๋‘๊ฐœ์˜ ๋ผ์šฐํ„ฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

"/" path ์š”์ฒญ์ด ์˜ค๋ฉด "/" ๋ผ์šฐํ„ฐ๊ฐ€ ์‘๋‹ตํ•œ๋‹ค.

ํ•˜์ง€๋งŒ "/topics" ๋ผ๋Š” path ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๋‹น์—ฐํžˆ "/topics" ๋ผ์šฐํ„ฐ๊ฐ€ ์‘๋‹ตํ•˜์ง€๋งŒ, "/" ๋ผ์šฐํ„ฐ๋„ ๊ฐ™์ด ์‘๋‹ตํ•œ๋‹ค.

"/topics" path ์š”์ฒญ์—์„œ topics๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „์— "/" ๋ผ๋Š” ๊ฒฝ๋กœ์™€ ๋งค์นญ์ด ๋˜๋‹ˆ "/" ๋ผ์šฐํ„ฐ๋„ ์‘๋‹ต์„ ํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰ path๊ฐ€ A๋ผ๊ณ  ํ•˜๋ฉด, path๊ฐ€ A๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹ค๋ฅธ ์š”์ฒญ๋“ค๊ณผ๋„ ๋งค์นญ์ด ๋˜์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

Route์— exact๋ผ๋Š” ์†์„ฑ์„ ์ง€์ •ํ•˜๋ฉด ์ด๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค. exact๋ฅผ ์ง€์ •ํ•˜๋ฉด path์™€ ์™„์ „ํžˆ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ์š”์ฒญ์—๋งŒ ๋ผ์šฐํ„ฐ๊ฐ€ ์‘๋‹ตํ•œ๋‹ค.

<Route exact path="/"><Main /></Route>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด ๋ผ์šฐํ„ฐ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์˜ค์ง "/" ์ธ ์š”์ฒญ์—๋งŒ ์‘๋‹ตํ•˜๊ฒŒ ๋œ๋‹ค.
"/"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋“ค์—๋Š” ์‘๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ตœ์ƒ์œ„ ๊ฒฝ๋กœ "/"๋Š” ์–ด๋–ค ๊ฒฝ๋กœ์—๋„ ์‹œ์ž‘๋ถ€๋ถ„์œผ๋กœ ํฌํ•จ๋˜๊ธฐ๋•Œ๋ฌธ์— ๋ณดํ†ต "/" ๊ฒฝ๋กœ ๋ผ์šฐํ„ฐ์—๋Š” exact๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.

v6

โ€ป react-router-dom v6๋กœ ์—…๋ฐ์ดํŠธ๋˜๋ฉด์„œ Route๋Š” ๋ฐ˜๋“œ์‹œ Routes ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค.

react-router-dom v6 ์—์„œ๋Š” Route๋Š” ๋ช‡๊ฐœ๋ฅผ ์“ฐ๋“  ๋ฐ˜๋“œ์‹œ ๋’ค์— ๋‚˜์˜ฌ Routes ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋กœ์ธํ•ด exact๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด์ œ ์“ฐ์ด์ง€ ์•Š๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ฐ”๋กœ ๋ฐ‘์—์„œ ์ž์„ธํžˆ ์„ค๋ช…


Routes(Switch)

exact๋ฅผ ์“ฐ์ง€ ์•Š๊ณ ๋„ Route๋“ค์ค‘ ๋งค์นญ๋˜๋Š” ๊ฒฝ๋กœ ํ•˜๋‚˜๋งŒ ์‘๋‹ต์„ ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ๊ทธ๋•Œ ์“ฐ๋Š”๊ฒŒ Switch ํƒœ๊ทธ์ด๋‹ค. (v6 ์ด์ „)

โ€ป react-router-dom v6๋กœ ์—…๋ฐ์ดํŠธ๋˜๋ฉด์„œ ์ด๋ฆ„์ด Switch -> Routes ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค.

Routes(Switch)๋กœ Route๋“ค์„ ๊ฐ์‹ธ๋ฉด ์ด ๋ผ์šฐํ„ฐ๋“ค์ค‘ ๊ฒฝ๋กœ๊ฐ€ ๋งค์นญ๋˜๋Š” ํ•˜๋‚˜์˜ ๋ผ์šฐํ„ฐ๋งŒ ์‘๋‹ตํ•œ๋‹ค.


v6 ์ด์ „

ํ•˜์ง€๋งŒ ์–˜๋„ ์ฃผ์˜ํ•ด์•ผํ•  ์ ์ด ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ ์–ด๋– ํ•œ ๋ผ์šฐํ„ฐ์— path๊ฐ€ ๋งค์นญ๋˜๋ฉด ๊ฑ”๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ๋ฐ‘์—์žˆ๋Š” ์• ๋“ค์€ ๋ฌด์‹œํ•œ๋‹ค๋Š”๊ฑฐ๋‹ค.

<Routes>
  <Route path="/" element={<Main />} />
  <Route path="/topics" element={<Topics />} />
  <Route path="/login" element={<Login />} />
</Routes>

์ด๋ ‡๊ฒŒ ๋˜์–ด์žˆ์„๋•Œ, "/topics" ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด /topics ๋ผ์šฐํ„ฐ๊ฐ€ ์‘๋‹ตํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ "/" ๋ผ์šฐํ„ฐ๊ฐ€ ์‘๋‹ตํ•œ๋‹ค.

Routes ๋‚ด์— ์žˆ๋Š” ๋ผ์šฐํ„ฐ๋“ค์ค‘ /topics ๊ฒฝ๋กœ์™€ ๋งค์นญ๋˜๋Š”์• ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š”๋ฐ, ์œ„์˜ Route ์—์„œ ์–ธ๊ธ‰ํ•œ ์ด์œ ๋กœ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” "/" ๊ฒฝ๋กœ๊ฐ€ /topics ๊ฒฝ๋กœ์™€ ๋งค์นญ์ด ๋˜๋ฉด์„œ ๋‚˜๋จธ์ง€ ์• ๋“ค์€ ๋ฒ„๋ฆฌ๊ณ  ์–˜๋กœ ๋ฐ”๋กœ ์‘๋‹ต์„ ํ•ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

"/" ๋ผ์šฐํ„ฐ๋ฅผ ์ œ์ผ ๋ฐ‘์— ๋ฐฐ์น˜์‹œํ‚ค๋ฉด ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

<Routes>
  <Route path="/topics" element={<Topics />} />
  <Route path="/login" element={<Login />} />
  <Route path="/" element={<Main />} />
</Routes>

๋˜ํ•œ exact ์†์„ฑ์„ ์จ์„œ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

<Routes>
  <Route exact path="/" element={<Main />} />
  <Route path="/topics" element={<Topics />} />
  <Route path="/login" element={<Login />} />
</Routes>

exact๋ฅผ ์“ฐ์ง€ ์•Š๋Š”์ด์ƒ "/" ๊ฒฝ๋กœ๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋งค์นญ๋œ๋‹ค๋Š” ์ ์„ ์ด์šฉํ•ด์„œ "/" ๋ผ์šฐํ„ฐ๋ฅผ ์ œ์ผ ๋ฐ‘์— ๋ฐฐ์น˜์‹œ์ผœ ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ์ „๋‹ด์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ๋ญ”์ง€๋ชจ๋ฅผ ์ด์ƒํ•œ ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ, ์–ด๋– ํ•œ ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ ์‹ถ๋‹ค๊ณ  ํ•ด๋ณด์ž.

๊ทธ ์ด์ƒํ•œ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋ผ์šฐํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์•„๋ฌด ํ™”๋ฉด๋„ ๋œจ์ง€ ์•Š์„๊ฒƒ์ด๋‹ค. ๊ทธ ๊ฒฝ๋กœ์— ๋งž๋Š” ๋ผ์šฐํ„ฐ๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๊ฒฝ๋กœ๋ฅผ ์น ์ง€ ๋ชจ๋ฅด๋‹ˆ ๋”ฑ ๋งž๋Š” ๋ผ์šฐํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ๋†“์„์ˆ˜๋„ ์—†๋Š” ๋…ธ๋ฆ‡์ด๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ, "/" path๊ฐ€ ์–ด๋–ค path์—๋„ ๋‹ค ๋งค์นญ๋˜๋‹ˆ๊นŒ "/" ๋ผ์šฐํ„ฐ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋– ํ•œ ๊ฒฝ๋กœ๋ฅผ ์น˜๋“  ์‹œ์ž‘์€ /๋กœ ์‹œ์ž‘ํ• ํ…Œ๋‹ˆ "/" ๋ผ์šฐํ„ฐ์— ๊ฑธ๋ฆด๊ฒƒ์ด๋‹ค.

<Routes>
  <Route exact path="/" element={<Main />} />
  <Route path="/topics" element={<Topics />} />
  <Route path="/login" element={<Login />} />
  <Route path="/" element={<Error />} />
</Routes>

"/" ๋ผ๋Š” ๊ฒฝ๋กœ๋Š” exact ๋œ "/" ๋ผ์šฐํ„ฐ๊ฐ€ ๋ฐ›๊ณ , "/"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์ค‘ Route๋กœ ์ง€์ •๋˜์–ด์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒฝ๋กœ๋Š” ๋งจ ๋งˆ์ง€๋ง‰ "/" ๋ผ์šฐํ„ฐ๊นŒ์ง€ ๋‚ด๋ ค์™€์„œ ์—ฌ๊ธฐ์— ๊ฑธ๋ฆด๊ฒƒ์ด๋‹ˆ ์—ฌ๊ธฐ์—์„œ ์—๋ŸฌํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ๋กœ ์‘๋‹ตํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

v6

โ€ป react-router-dom v6๋กœ ์—…๋ฐ์ดํŠธ๋˜๋ฉด์„œ exact ์˜ต์…˜์ด ์‚ญ์ œ๋˜์—ˆ๋‹ค.

๊ธฐ์กด์—๋Š” ๋ผ์šฐํ„ฐ์˜ path๊ฐ€ ์š”์ฒญ๋ฐ›์€ path name์˜ ์•ž๋ถ€๋ถ„๊ณผ ์ผ์น˜ํ•˜๋ฉด ๋‹ค ๋งค์นญ๋˜์—ˆ๊ณ  ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ๋กœ๋งŒ ๋งค์นญ์‹œํ‚ค๊ธฐ ์œ„ํ•ด exact ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

ํ•˜์ง€๋งŒ v6 ๋ฒ„์ „์€ exact ์˜ต์…˜์ด ์‚ฌ๋ผ์กŒ๊ณ , ์ด์ œ ์‹œ์ž‘๋ถ€๋ถ„์ด ๊ฐ™๋‹ค๊ณ  ๋‹ค ๋งค์นญ๋˜์ง€ ์•Š๊ณ  ์ •ํ™•ํžˆ ๊ฐ™์€ ๊ฒฝ๋กœ์—๋งŒ ๋งค์นญ๋œ๋‹ค.

์‹œ์ž‘๋ถ€๋ถ„์ด ๊ฐ™์€ ๋ณต์ˆ˜๊ฐœ์˜ ๊ฒฝ๋กœ๋ฅผ ๋งค์นญ์‹œํ‚ค๊ณ ์‹ถ๋‹ค๋ฉด * ๊ธฐํ˜ธ(์• ์Šคํ„ฐ๋ฆฌ์Šคํฌ)๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

<Routes>
  <Route path="/" element={<Main />} />
  <Route path="/topics" element={<Topics />} />
  <Route path="/login" element={<Login />} />
  <Route path="/*" element={<Error />} />
</Routes>

๊ฒฝ๋กœ์— * ๊ฐ€ ์žˆ์œผ๋ฉด ์—ฌ๊ธฐ๋ถ€ํ„ฐ๋Š” ์–ด๋–ค path name์ด๋“  ๋‹ค ๋งค์นญํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๋งจ ๋งˆ์ง€๋ง‰ ๋ผ์šฐํ„ฐ์ฒ˜๋Ÿผ path๋ฅผ /* ๋กœ ํ•˜๋ฉด / ๋’ค๋กœ๋Š” ๋ญ๊ฐ€ ์˜ค๋“  ๋‹ค ๋ฐ›๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ˆ, /๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ๋กœ๋Š” ์œ„์—์„œ ๋”ฐ๋กœ ๋ผ์šฐํ„ฐ๋กœ ์ง€์ •๋œ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹ˆ๋ฉด ์–ด๋–ค ๊ฒฝ๋กœ๋“  ๋‹ค ๋งค์นญ๋˜๋Š” ์—๋ŸฌํŽ˜์ด์ง€ ๋‹ด๋‹น ๋ผ์šฐํ„ฐ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

<li><a href="/">home</a></li>
<li><a href="/topics">topics</a></li>
<li><a href="/login">login</a></li>

์–ด๋– ํ•œ ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋งํฌ๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜๋ฉด ๋ณดํ†ต์€ ์œ„์™€๊ฐ™์ด a ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด ์š”์ฒญํ•  ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋งํฌ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ a ํƒœ๊ทธ๋กœ ๋งŒ๋“  ๋งํฌ๋Š” ๊ทธ ๊ฒฝ๋กœ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต ํŽ˜์ด์ง€๋ฅผ ๋งค๋ฒˆ ์ƒˆ๋กœ ๋ฐ›์•„์™€์„œ ํŽ˜์ด์ง€๊ฐ€ ๋ฆฌ๋กœ๋“œ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ react-router-dom์—๋Š” SPA ๋ฐฉ์‹์œผ๋กœ path ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ Link ํƒœ๊ทธ๊ฐ€ ์žˆ๋‹ค.

Link ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  ๋งํฌ๋Š” ํ•ด๋‹น ๋งํฌ๋ฅผ ๋ˆŒ๋ €์„๋•Œ, ํŽ˜์ด์ง€ ๋ฆฌ๋กœ๋“œ ์—†์ด ํ•ด๋‹น ๊ฒฝ๋กœ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ฐ›์•„ ๋ฐ”๋กœ ํ™”๋ฉด์ด ๋ Œ๋”๋ง ๋œ๋‹ค.
(๋ฌผ๋ก  ํ•ด๋‹น ๋งํฌ์˜ ๊ฒฝ๋กœ์— ํ•ด๋‹จ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ์„๋•Œ์˜ ์–˜๊ธฐ)

a ํƒœ๊ทธ์˜ ๊ฒฝ๋กœ ์ง€์ • ์†์„ฑ์€ href ์ง€๋งŒ Link ํƒœ๊ทธ์˜ ๊ฒฝ๋กœ ์ง€์ • ์†์„ฑ์€ to ์ด๋‹ค.

<li><Link to="/">home</Link></li>
<li><Link to="/topics">topics</Link></li>
<li><Link to="/login">login</Link></li>

Link ํƒœ๊ทธ์™€ ๊ธฐ๋Šฅ์€ ๊ฐ™์€๋ฐ ์—ฌ๊ธฐ์— ์ข‹์€ ๊ธฐ๋Šฅ์ด ํ•˜๋‚˜ ์ถ”๊ฐ€๋œ ํƒœ๊ทธ์ด๋‹ค.

NavLink๋กœ ๊ฐ์‹ผ ๋งํฌ๋ฅผ ๋ˆŒ๋Ÿฌ ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋ฉด HTML ์ƒ์— NavLink๋กœ ๊ฐ์‹ผ ์š”์†Œ์— active๋ผ๋Š” ์ด๋ฆ„์˜ ํด๋ž˜์Šค๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค.

home ๋งํฌ๋ฅผ ๋ˆŒ๋Ÿฌ / ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์™€์žˆ๋Š” ๊ฒฝ์šฐ์˜ ํ™”๋ฉด์ด๋‹ค. ์‹ค์ œ HTML ์ƒ์—์„œ๋Š” NavLink๋กœ ๊ฐ์‹ผ ๋ถ€๋ถ„์ด a ํƒœ๊ทธ๋กœ ๋‚˜์˜ค๋Š”๋ฐ ๊ฑฐ๊ธฐ์— home์„ ๊ฐ์‹ธ๋Š” a ํƒœ๊ทธ์—๋งŒ active ๋ผ๋Š” ์ด๋ฆ„์˜ ํด๋ž˜์Šค์™€ aria-current๋ผ๋Š” ๋ญ”์ง€๋ชจ๋ฅผ๊ฒŒ ์ถ”๊ฐ€๋˜์–ด์žˆ๋Š” ๋ชจ์Šต์ด๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ active ๋ผ๋Š” ํด๋ž˜์Šค๋ช…์˜ css๋ฅผ ์ง€์ •ํ•ด์ค˜์„œ ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋Š ๋งํฌ๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ๋“ค์–ด์™€์žˆ๋Š”์ง€๋ฅผ ์›ํ•˜๋Š” ๋ชจ์Šต์œผ๋กœ ํ‘œ์‹œํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ Nav ๋ฐ” ๊ฐ™์€๋ฐ์— ์‚ฌ์šฉํ•˜๋ฉด ๊ต‰์žฅํžˆ ์œ ์šฉํ• ๋“ฏ ํ•˜๋‹ค.





์ฐธ๊ณ ์ž๋ฃŒ

https://velog.io/@po05360/React-Router-Dom
https://phsun102.tistory.com/91

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

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