๐Ÿ‘ฉโ€๐Ÿ’ป
Megaptera Frontend
  • ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
    • megaptera-front
    • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 2. TypeScript
      • 3. React
      • 4. Testing Library
      • 5. Parcel & ESLint
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 2. JSX
      • 1. JSX
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 3. React๋กœ ์‚ฌ๊ณ ํ•˜๊ธฐ
      • 1. React Component
      • 2. React State
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 4. React Hooks
      • 1. Express
      • 2. Fetch API & CORS
      • 3. React์˜ Hook
      • 4. useRef & Custom Hook
      • 5. usehooks-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 5. ํ…Œ์ŠคํŠธ
      • 1. TDD
      • 2. React Testing Library
      • 3. MSW
      • 4. Playwright
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 6. External Store
      • 1. External Store
      • 2. TSyringe
      • 3. Redux ๋”ฐ๋ผํ•˜๊ธฐ
      • 4. usestore-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 7. React Router
      • 1. Routing
      • 2. Routes
      • 3. Router
      • 4. Navigation
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 8. CSS in JS
      • 1. Design System
      • 2. Style Basics
      • 3. CSS in JS
      • 4. styled-components
      • 5. props์™€ attrs
      • 6. Global Style & Theme
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 9. ์‡ผํ•‘๋ชฐ ๋ชฉ๋ก, ์ƒํ’ˆ ํŽ˜์ด์ง€
      • 1. ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „ ์ค€๋น„
      • 2. ๋ชฉ๋ก ๋ณด๊ธฐ
      • 3. ์ƒํ’ˆ ์ƒ์„ธ ๋ณด๊ธฐ
      • 4. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ณด๊ธฐ
      • 5. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ ๋‹ด๊ธฐ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 10. ์‚ฌ์šฉ์ž ์ธ์ฆ, ์ธ๊ฐ€
      • 1. ๋กœ๊ทธ์ธ
      • 2. ๋กœ๊ทธ์•„์›ƒ
      • 3. ํšŒ์›๊ฐ€์ž…
      • 4. ์ฃผ๋ฌธ ๋ชฉ๋ก & ์ฃผ๋ฌธ ์ƒ์„ธ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 11. ์ฃผ๋ฌธ, ๊ฒฐ์ œ
      • 1. ๋ฐฐ์†ก ์ •๋ณด ์ž…๋ ฅ
      • 2. ํฌํŠธ์› ๊ฒฐ์ œ ์š”์ฒญ
      • 3. ๋ฐฐ์†ก ๋ฐ ๊ฒฐ์ œ ์ •๋ณด ์ „๋‹ฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 12. ์–ด๋“œ๋ฏผ
      • 1. ๊ด€๋ฆฌ์ž ์›น ์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ ์‹œ์ž‘
      • 2. ๋กœ๊ทธ์ธ, ์‚ฌ์šฉ์ž ๋ชฉ๋ก
      • 3. ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ
      • 4. ์ฃผ๋ฌธ ๊ด€๋ฆฌ
      • 5. ์ƒํ’ˆ ๊ด€๋ฆฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
Powered by GitBook
On this page
  • 1. ๋ผ์šฐํ„ฐ
  • 2. React Router
  • SPA (Single Page Application)
  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
  • Route
  • Browser Router
  • Memory Router
  1. ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
  2. 7. React Router

2. Routes

Previous1. RoutingNext3. Router

Last updated 2 years ago

1. ๋ผ์šฐํ„ฐ

๋ผ์šฐํ„ฐ๋Š” ๋„คํŠธ์›Œํฌ ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์žฅ์น˜ ๋ณดํ†ต ๋‘˜ ์ด์ƒ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ์— ์—ฐ๊ฒฐ๋จ ๋ฐ์ดํ„ฐ(ํŒจํ‚ท)๋ฅผ ๋ชฉ์ ์ง€๋กœ ๋ณด๋‚ผ ๋•Œ ์ตœ์ ์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ๊ฒฝ๋กœ๊ฐ€ ๊ฒฐ์ •๋˜๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ์ผ(๋ผ์šฐํŒ…)์„ ์ˆ˜ํ–‰ ๋ผ์šฐํ„ฐ๋Š” ๋ผ์šฐํŒ…ํ…Œ์ด๋ธ”์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์Œ ๋ชฉ์ ์ง€์—๊ฒŒ ์ „๋‹ฌ

2. React Router

Context API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ๋™์ผํ•œ context(๋งฅ๋ฝ)๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ํ•œ ๋ฒˆ์— ๊ฐ’์„ ๋ฐ›์•„์™€์„œ ์‚ฌ์šฉ

์‹ฑ๊ธ€ํŽ˜์ด์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ ์ง€ํ•˜๋ฉด์„œ, url์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์Œ

  • ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™

  • ๋ถ๋งˆํฌ ์ถ”๊ฐ€

  • ๋„ค๋น„๊ฒŒ์ด์…˜ ์ถ”๊ฐ€

SPA (Single Page Application)

ํ•˜๋‚˜์˜ url๋กœ ํ•œ ๋ฒˆ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋”ฉ๋˜๋ฉด ๊ทธ ์•ˆ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ, โŒ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๊ฐ€ ์—ด๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹Œ(์ „์ฒด์ ์ธ ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ x), โœ… ๋ถ€๋ถ„์ ์ธ ๋‚ด์šฉ๋งŒ ์—…๋ฐ์ดํŠธ(ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ณ€๊ฒฝ) โ‡’ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋™์ ์œผ๋กœ ๋ฐ›์•„์™€์„œ ๋™์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌ

  • MPA (Multiple Page Application) : ์ƒˆ๋กœ๊ณ ์นจ๋˜๋ฉฐ ํŽ˜์ด์ง€๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ์‹. html ๋ฌธ์„œ, ๋ฐ์ดํ„ฐ ๋“ฑ์„ ๋ฐ›์•„ ์กฐ๋ฆฝํ•ด์•ผ ํ•จ

  • CSR (Client Side Rendering) : ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ํŽ˜์ด์ง€ ๋ Œ๋”๋ง

  • ๋ฌธ์ œ์  : ํ™”๋ฉด ๋ถ๋งˆํฌ ๋ถˆ๊ฐ€, ๋’ค๋กœ๊ฐ€๊ธฐ/์•ž์œผ๋กœ๊ฐ€๊ธฐ ๋“ฑ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜์— ํฌํ•จ๋˜์ง€ ์•Š์Œ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

ํŒจํ‚ค์ง€ ์„ค์น˜

npm i react-router-dom

React Router ์‚ฌ์šฉํ•˜๊ธฐ

import {Routes, Route} from 'react-router-dom';

function App() {
    return (
        <div>
            <Header/>
            <main>
                <Routes>
                    <Route path="/" element={<HomePage/>}/>
                    <Route path="/about" element={<AboutPage/>}/>
                </Routes>
            </main>
            <Footer/>
        </div>
    );
}

Route

์•ฑ์˜ ์–ด๋””์—์„œ๋‚˜ ๋ Œ๋”๋ง๋˜๋ฉฐ <Routes>๋Š” ํ˜„์žฌ ์œ„์น˜์˜ ํ•˜์œ„ ๊ฒฝ๋กœ ์ง‘ํ•ฉ๊ณผ ์ผ์น˜ํ•จ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค <Routes>๋Š” ๋ชจ๋“  ์ž์‹ ๊ฒฝ๋กœ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๊ฐ€์žฅ ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์„ ์ฐพ์•„ ํ•ด๋‹น UI ๋ถ„๊ธฐ๋ฅผ ๋ Œ๋”๋ง

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

<Route> ์š”์†Œ๋Š” ์ค‘์ฒฉ๋œ URL ๊ฒฝ๋กœ์— ํ•ด๋‹นํ•˜๋Š” ์ค‘์ฒฉ๋œ UI๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์ค‘์ฒฉ๋  ์ˆ˜ ์žˆ์Œ

<Routes>
    <Route path="/" element={<Dashboard />}>
        <Route path="messages" element={<DashboardMessages />}/>
        <Route path="tasks" element={<DashboardTasks />} />
    </Route>
    <Route path="about" element={<AboutPage />} />
</Routes>

Route๋Š” React Router ์•ฑ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ URL ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๊ตฌ์„ฑ ์š”์†Œ, ๋ฐ์ดํ„ฐ ๋กœ๋“œ ๋ฐ ๋ฐ์ดํ„ฐ ๋ณ€ํ˜•์— ์—ฐ๊ฒฐ ๊ฒฝ๋กœ ์ค‘์ฒฉ์„ ํ†ตํ•ด ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ์ด์•„์›ƒ๊ณผ ๋ฐ์ดํ„ฐ ์ข…์†์„ฑ์ด ๋‹จ์ˆœํ•ด์ง€๊ณ  ์„ ์–ธ์ ์ด ๋จ

path

Route๊ฐ€ URL, link href, form action๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด URL๊ณผ ์ผ์น˜์‹œํ‚ฌ ๊ฒฝ๋กœ ํŒจํ„ด

element

Route๊ฐ€ URL๊ณผ ์ผ์น˜ํ•  ๋•Œ ๋ Œ๋”๋งํ•  React ์š”์†Œ/๊ตฌ์„ฑ ์š”์†Œ

<Route path="/mypage" element={<MyPage />} />

Browser Router

๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ ํ‘œ์‹œ์ค„์— clean URL์„ ์‚ฌ์šฉํ•ด ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๊ณ , ๋ธŒ๋ผ์šฐ์ €์˜ ๋‚ด์žฅ ๊ธฐ๋ก ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒ์ƒ‰

๐Ÿšจ Browser Router๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€

Uncaught Error: useRoutes() may be used only in the context of a <Router> component.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

<BrowserRouter window>๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜„์žฌ ๋ฌธ์„œ์˜ defaultView๋ฅผ ์‚ฌ์šฉ ๋‹ค๋ฅธ ์ฐฝ์˜ URL์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ (Ex. <iframe>)

import * as React from "react";
import {createRoot} from "react-dom/client";
import {BrowserRouter} from "react-router-dom";

const root = createRoot(document.getElementById("root"));

root.render(
    <BrowserRouter>
        <App />
    </BrowserRouter>
);

โœ๏ธ ์กฐ๊ฐ๊ธ€

์˜ˆ์ „์— ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๊ธ€์„ ์ ์–ด๋‘” ๋‚ด์šฉ๊ณผ ๋™์ผํ•œ ์ด์Šˆ๊ฐ€ ๊ฐ•์˜์—์„œ ๋“ฑ์žฅํ–ˆ๋‹ค. ์ด์ œ ๋ณด๋‹ˆ ์ € ๊ธ€ ์ œ๋ชฉ๋„ ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์ ์—ˆ์œผ๋ฉด ์ข‹์•˜์œผ๋ จ๋งŒ, ๋‹น์‹œ์—๋Š” ์ •ํ™•ํžˆ ์–ด๋–ค ์นดํ…Œ๊ณ ๋ฆฌ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๋ชฐ๋ผ์„œ 'react router v6 ์˜ค๋ฅ˜' ๋ผ๊ณ  ํ•ด๋‘์—ˆ๋‹ค. ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ๋‚˜์„œ๋Š” ์–ด๋–ค ํŒŒํŠธ๊ฐ€ ๋ฌธ์ œ์˜€๋Š”์ง€ ์•Œ๊ฒŒ ๋˜์–ด ๋ช…์พŒํ•ด์ง„ ๋А๋‚Œ์ด๋‹ค. ๋”๋ถˆ์–ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ๋Š” Memory Router๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ๊นŒ์ง€ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด ๋‚ด์šฉ์„ ๋ชฐ๋ž๋‹ค๋ฉด, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋˜ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ์„ ๊ฒƒ์ด๊ณ  ๋‘ ๋ฒˆ์ด๋‚˜ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์„ ํ•  ๋ป” ํ–ˆ๋‹ค.

Memory Router

โš ๏ธ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” Browser Router๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹คํŒจ ๐Ÿ’ก ๋ธŒ๋ผ์šฐ์ €์—๋Š” Window๊ฐ€ ์žˆ์ง€๋งŒ, ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” Memory Router ์‚ฌ์šฉ

<MemoryRouter>๋Š” ๋ฐฐ์—ด์— ๋‚ด๋ถ€์ ์œผ๋กœ ์œ„์น˜๋ฅผ ์ €์žฅํ•จ <BrowserHistory>, <HashHistory>์™€ ๋‹ฌ๋ฆฌ, ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ก ์Šคํƒ๊ณผ ๊ฐ™์€ ์™ธ๋ถ€ ์†Œ์Šค์— ์—ฎ์ด์ง€ ์•Š์Œ โ†’ ํ…Œ์ŠคํŠธ๊ฐ™์ด ๊ธฐ๋ก ์Šคํƒ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์— ์ด์ƒ์ 

  • initialEntries : ๊ธฐ๋ณธ๊ฐ’์€ ["/"] (root '/' URL์˜ ๋‹จ์ผ ํ•ญ๋ชฉ)

  • initialIndex : ๊ธฐ๋ณธ๊ฐ’์€ initialEntries์˜ ๋งˆ์ง€๋ง‰ index

๋Œ€๋ถ€๋ถ„์˜ React Router ํ…Œ์ŠคํŠธ๋Š” ์ง„์‹ค์˜ ์ถœ์ฒ˜๋กœ <MemoryRouter>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด๊ธฐ๋งŒ ํ•ด๋„ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ข‹์€ ์˜ˆ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Œ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

import {render, screen} from '@testing-library/react';
import {MemoryRouter} from 'react-router-dom';

import App from './App';

const context = describe;

describe('App', () => {
    function renderApp(path: string) {
        render((
            <MemoryRouter initialEntries={[path]}>
                <App />
            </MemoryRouter>
        ));
    }

    context('when the current path is โ€œ/โ€', () => {
        it('renders the home page', () => {
            renderApp('/');

            screen.getByText(/Hello/);
        });
    });

    context('when the current path is โ€œ/aboutโ€', () => {
        it('renders the about page', () => {
            renderApp('/about');

            screen.getByText(/About/);
        });
    });
});

React Router
Client Side Routing
์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
๐Ÿ”— ์‹ค์Šต ๋งํฌ : React Router ์„ค์น˜ ๋ฐ ์ ์šฉ, App ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
Routes
Route
BrowserRouter
๐Ÿ”— [ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…] react router v6 ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
๐Ÿ”— TIL : react router v6 ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
MemoryRouter
๋ผ์šฐํ„ฐ
router