blog

React 메모: 중첩 라우팅과 커스텀 훅

Front-end / React#React#React Router#커스텀 훅#팁 모음

React Router v6 중첩 라우팅으로 레이아웃 공유하기

기존에는 라우트를 나열하고 페이지마다 헤더·푸터를 넣고 있었다.

<Routes>
  <Route path="/" element={<Main />} />
  <Route path="/rooms/:roomId" element={<RoomDetail />} />
  <Route path="/orders/:orderId" element={<Payment />} />
  <Route path="/orders/:orderId/complete" element={<CompletePayment />} />
</Routes>

중첩 라우팅으로 바꾸면 공통 레이아웃을 부모 라우트 하나에 두고, 자식 페이지는 <Outlet /> 자리에 렌더링된다.

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

const Layout = () => (
  <Container>
    <Header />
    <Outlet />
    <Footer />
  </Container>
);

export const router = createBrowserRouter([
  {
    path: '/',
    element: <Layout />,
    children: [
      { index: true, element: <Main /> },
      { path: 'rooms/:roomId', element: <RoomDetail /> },
      { path: 'orders/:orderId', element: <Payment /> },
      { path: 'orders/:orderId/complete', element: <CompletePayment /> },
    ],
  },
]);
  • 라우트를 그룹으로 묶기 쉽고, 레이아웃이 한 곳에서 관리된다.
  • 레이아웃 컨테이너에 최대 너비(예: 768px)를 지정해 두면 페이지마다 따로 맞출 필요가 없다.
  • 라우트마다 헤더 모양이 다르다면, 레이아웃을 여러 개 만들어 라우트 그룹마다 다르게 쓰거나 헤더가 props·라우트 정보를 받아 유연하게 바뀌도록 만든다.

커스텀 훅은 상태가 아니라 로직을 공유한다

같은 커스텀 훅을 두 컴포넌트에서 호출하면, 각 컴포넌트가 자기만의 상태를 갖는다. 커스텀 훅이 공유하는 것은 상태를 다루는 로직이지 상태 자체가 아니다.

function useCounter() {
  const [count, setCount] = useState(0);
  return { count, increase: () => setCount((c) => c + 1) };
}

function A() {
  const { count } = useCounter(); // A만의 count
}
function B() {
  const { count } = useCounter(); // B만의 count (A와 무관)
}

여러 컴포넌트가 같은 값을 봐야 한다면 상태를 공통 부모로 올리거나, Context·상태 관리 라이브러리(Zustand 등)·서버 상태 라이브러리(TanStack Query)를 쓴다.