Router

createBrowserRouter()

BrowserRouter๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋กœ, v6์—์„œ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ๋ผ์šฐํŒ… ์„ค๊ณ„ ๋ฐฉ๋ฒ•

ํ•ด๋‹น ๋ผ์šฐํŒ… ์„ค๊ณ„๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด v6.4์— ์ถ”๊ฐ€๋œ Data APIs๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Data APIs๋ž€?

๋ผ์šฐํ„ฐ๊ฐ€ ๋ Œ๋”๋งํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ ๋“ฑ, ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ์™€ ๊ด€๋ จ๋œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์ด ๋Œ€๊ฑฐ ์ถ”๊ฐ€ ๋˜์—ˆ๋‹ค.

function createBrowserRouter(
  routes: RouteObject[],
  opts?: {
    basename?: string;
    future?: FutureConfig;
    hydrationData?: HydrationState;
    window?: Window;
  }
): RemixRouter;
  • routes โ†’ ๋ผ์šฐํŠธ ๊ฐ์ฒด ๋ฐฐ์—ด

  • basename โ†’ ์•ฑ์˜ ๊ธฐ๋ณธ ์ด๋ฆ„, '/app' ์ด๋ผ๊ณ  ์„ค์ •์‹œ '/'๋Š” '/app'์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

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

const router = createBrowserRouter([
  {
    path: '/',
    element: <Layout />,
    children: [
      { index: true, element: <HomePage /> },
      { path: '/dashboard', element: <DashboardPage /> }
    ]
  }
]);

function App() {
  return (
    <ReactProvider router={router} />
  );
}

Routes.tsx

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋„ ๋ผ์šฐํŠธ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์šฐํŠธ ๊ฐ์ฒด ๋ฐฐ์—ด์„ ๋ณ„๋„์˜ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌ

routes.tsx

import Layout from './components/Layout';
import HomePage from './pages/HomePage';
import DashboardPage from './pages/DashboardPage';

const routes = [
  {
    path: '/',
    element: <Layout />,
    children: [
      { index: true, element: <HomePage /> },
      { path: '/dashboard', element: <DashboardPage /> }
    ]
  }
];

export default routes;

createRoutesFromElements()

React Element ๋ฐฐ์—ด์„ ๋ผ์šฐํŠธ ๊ฐ์ฒด ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

createBrowserRouter()๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ด์ „์— ์‚ฌ์šฉ๋˜๋˜ JSX ํ˜•ํƒœ๋กœ ๋ผ์šฐํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

declare function createRoutesFromElements(
  children: React.ReactNode
): RouteObject[];

interface RouteObject {
  caseSensitive?: boolean;
  children?: RouteObject[];
  element?: React.ReactNode;
  index?: boolean;
  path?: string;
}

Usage

const router = createBrowserRouter(
  createRoutesFromElements(
    <Route path='/' element={<Layout />}>
      <Route index element={<HomePage />} />
      <Route path='/dashbaord' element={<DashboardPage />} />
    </Route>
  )
);

createMemoryRouter()

Test ํ™˜๊ฒฝ์—์„œ createBrowserRouter ๋Œ€์‹  createMemoryRouter๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

export declare function createMemoryRouter(routes: RouteObject[], opts?: {
    basename?: string;
    future?: FutureConfig;
    hydrationData?: HydrationState;
    initialEntries?: InitialEntry[];
    initialIndex?: number;
}): RemixRouter;
  • initialEntries โ†’ ์ดˆ๊ธฐ ์—”ํŠธ๋ฆฌ ๋ชฉ๋ก ์„ค์ •, ์ฆ‰ ํ…Œ์ŠคํŠธํ•  ํŽ˜์ด์ง€์˜ ์ฒซ ๋ Œ๋”๋ง ๊ฒฝ๋กœ ์„ค์ •

    • ๋ฐฐ์—ด์ธ ์ด์œ ๋Š” ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ ์Šคํƒ๊ณผ ๋™์ผ, (๋’ค๋ก๊ฐ€๊ธฐ, ์•ž์œผ๋กœ๊ฐ€๊ธฐ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•จ)

  • initialIndex โ†’ ์ดˆ๊ธฐ ์—”ํŠธ๋ฆฌ ๋ชฉ๋ก[๋ฐฐ์—ด] ์ค‘ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ๊ฒฝ๋กœ๋ฅผ ์„ ํƒ

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

import routes from '../routes';

descirbe('App', () => {
  it('render correctly', () => {
    const router = createMemoryRouter(routes);
    render(<RouterProvider router={router} />)
  )
});

ํ•ด๋‹น ํ•จ์ˆ˜๋„ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’ํžˆ๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•˜์ž.

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

import routes from '../routes';

export function withRoutes(initialEntries = '/') {
  const router = createMemoryRouter(routes, {initialEntries: [initialEntries]});
  return <RouterProvider router={router} />;
  )
}

describe('App', () => {
  it('render correctly', () => {
    render(withRoutes());

    expect(screen.getByText(/์ด๋‹ค์ž‰/)).toBeInTheDocument();
  });
});

MemoryRouter VS createMemoryRouter()

๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋ผ์šฐํŒ…์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

createMemoryRouter()๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ „์ฒด ๋ผ์šฐํŒ… ์ •๋ณด๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€์„œ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์ ์ธ ๋ผ์šฐํŒ… ์ƒํ˜ธ์ž‘์šฉ์„ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์ ํ•ฉํ• ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜๋ฉด MemoryRouter๋Š” ๋ผ์šฐํŠธ๋ฅผ ์ฃผ์ž… ๋ฐ›๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปค์Šคํ…€ํ•˜๊ธฐ ์‰ฝ๊ณ , ์ข€ ๋” ์œ ์—ฐํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์„œ ํŠน์ • ๋ผ์šฐํŒ… ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์ ํ•ฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.

Last updated