๐Ÿ‘ฉโ€๐Ÿ’ป
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. RouterProvider
  • 2. createBrowserRouter
  • routes
  • 3. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
  • ๋ผ์šฐํŒ… ์ •๋ณด ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ
  • App.tsx์—์„œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
  • 4. createMemoryRouter
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
  1. ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
  2. 7. React Router

3. Router

Previous2. RoutesNext4. Navigation

Last updated 2 years ago

1. RouterProvider

React Router ๋ฒ„์ „ 6.4๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š”, ๋ผ์šฐํ„ฐ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์“ฐ๋Š” ๋ฐฉ๋ฒ• ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ผ์šฐํ„ฐ ๊ฐœ์ฒด๋Š” ์ด ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ „๋‹ฌ๋˜์–ด ์•ฑ์„ ๋ Œ๋”๋งํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๋ฐ์ดํ„ฐ API๋ฅผ ํ™œ์„ฑํ™”

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

React Router๊ฐ€ Context API๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋Š” ๊ฒƒ์ด ๋ฌผ์”ฌ ๋А๊ปด์ง€๋Š” ํŒŒํŠธ์˜€๋‹ค. Context API๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ์ ์ด ๋งŽ์ง€ ์•Š์•„์„œ ๊ทธ๋Ÿฐ์ง€, '๊ตณ์ด RouterProvider๋ฅผ ์‚ฌ์šฉํ•ด ๋ผ์šฐํŒ…์„ ๊ตฌํ˜„ํ•ด์•ผ ํ• ๊นŒ?'๋ผ๋Š” ์˜๋ฌธ์ด ๋“ ๋‹ค. 2๊ฐ•์—์„œ ๋ฐฐ์› ๋˜ ๊ธฐ์กด์˜ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์–ด๋А ์ˆœ๊ฐ„ ๋ถˆํŽธํ•ด์ง€๋Š” ์ผ์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ผ๊นŒ? ํŽ˜์ด์ง€๊ฐ€ ๋งŽ์ด ๋‚˜์˜ค์ง€ ์•Š๋Š” ์ž‘์€ ํ”„๋กœ์ ํŠธ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ƒฅ ์ด์ „ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, ์—ฐ์Šต ์ฐจ์›์—์„œ RouterProvider๋„ ์‚ฌ์šฉํ•ด ๋ด์•ผ๊ฒ ๋‹ค.

2. createBrowserRouter

React Router ์›น ํ”„๋กœ์ ํŠธ์— ๊ถŒ์žฅ๋˜๋Š” ๋ผ์šฐํ„ฐ DOM History API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ URL์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๊ธฐ๋ก ์Šคํƒ์„ ๊ด€๋ฆฌ loaders, actions, fetchers ๋“ฑ๊ณผ ๊ฐ™์€ v6.4 ๋ฐ์ดํ„ฐ API๋ฅผ ํ™œ์„ฑํ™”

routes

children ํ”„๋กœํผํ‹ฐ์— ์ค‘์ฒฉ๋œ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” Route ๊ฐ์ฒด์˜ ๋ฐฐ์—ด

createBrowserRouter([
  {
    path: "/",
    element: <Root />,
    loader: rootLoader,
    children: [
      {
        path: "events/:id",
        element: <Event />,
        loader: eventLoader,
      },
    ],
  },
]);

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

๐Ÿ“‹ App.tsx๊ฐ€ ํ•˜๋Š” ์ผ

  1. ์ „์ฒด์ ์ธ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ

  2. ๋ผ์šฐํŒ… ๊ตฌ์„ฑ

๋ผ์šฐํŒ… ์ •๋ณด ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ

์ปดํฌ๋„ŒํŠธ ๋ ˆ์ด์•„์›ƒ ์žก๊ธฐ

// src/components/Layout.tsx

import Header from './Header';
import Footer from './Footer';

import { Outlet } from 'react-router-dom';
 
export default function Layout() {
    return (
        <div>
            <Header/>
            <Outlet/>
            <Footer/>
        </div>
    );
}

๋ ˆ์ด์•„์›ƒ ์ ์šฉ

๐Ÿ’ก ํ…Œ์ŠคํŠธ์—์„œ๋„ routes ์ •๋ณด๋ฅผ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ…Œ์ŠคํŠธ๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

// src/routes.tsx

import HomePage from './pages/HomePage';
import AboutPage from './pages/AboutPage';

import Layout from './components/Layout';

const routes = [
    {
        element: <Layout/>,
        children: [
            {path: '/', element: <HomePage/>},
            {path: '/about', element: <AboutPage/>},
        ],
    },
];

export default routes;

App.tsx์—์„œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

๐Ÿšจ RouterProvider์™€ BrowserRouter๋ฅผ ๋™์‹œ์— ์“ธ ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€

caught Error: You cannot render a <Router> inside another <Router>. You should never have more than one in your app.

// src/App.tsx

import {createBrowserRouter, RouterProvider} from 'react-router-dom';
import routes from './routes';

const router = createBrowserRouter(routes);

export default function App() {
    return (
        <RouterProvider router={router}/>
    );
}

๐Ÿ’ก App ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ๋ธŒ๋ผ์šฐ์ € ๋ผ์šฐํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋จ

// src/main.tsx

import {createBrowserRouter, RouterProvider} from 'react-router-dom';

import routes from './routes';

const router = createBrowserRouter(routes);

root.render((
    <React.StrictMode>
        <RouterProvider router={router}/>
    </React.StrictMode>
));

4. createMemoryRouter

App.tsx๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—, routes.test.tsx๋กœ ๋ณ€๊ฒฝ routes๊ฐ€ ๋ผ์šฐํŒ… ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ

createMemoryRouter๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ก์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ ๋ผ์šฐํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž์ฒด ๊ธฐ๋ก ์Šคํƒ์„ ๊ด€๋ฆฌ Storybook๊ณผ ๊ฐ™์€ ํ…Œ์ŠคํŠธ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ๋„๊ตฌ์— ์ฃผ๋กœ ์œ ์šฉํ•˜์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ React Router๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

๋ฉ”๋ชจ๋ฆฌ ๋ผ์šฐํ„ฐ ๋งŒ๋“ค์–ด์„œ ํ…Œ์ŠคํŠธ

describe('routes', () => {
    function renderRouter(path: string) {
        const router = createMemoryRouter(routes, {initialEntries: [path]});
        render(<RouterProvider router={router}/>);
    }
    
    context('when the current path is โ€œ/โ€', () => {
        it('renders the home page', () => {
            renderRouter('/');
            
            screen.getByText(/Hello/);
        });
    });
    
    context('when the current path is โ€œ/aboutโ€', () => {
        it('renders the about page', () => {
            renderRouter('/about');
            
            screen.getByText(/About/);
        });
    });
});

RouterProvider
createBrowserRouter
๐Ÿ”— ์‹ค์Šต ๋งํฌ
createMemoryRouter