๐ŸŽฏ React Router์—์„œ Router๋Š” ์™œ index.tsx์— ์žˆ์–ด์•ผ ํ• ๊นŒ?

HMJยท2025๋…„ 5์›” 29์ผ

๊ฐœ๋…์ •๋ฆฌ

๋ชฉ๋ก ๋ณด๊ธฐ
5/8

useLocation ํ›…์„ ์‚ฌ์šฉํ•˜๋ ค๋Š”๋ฐ ์ž๊พธ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค๋ฉด, Router ์œ„์น˜๋ฅผ ์˜์‹ฌํ•ด๋ณด์„ธ์š”!


๐Ÿงฉ ๋ฌธ์ œ ์ƒํ™ฉ

React ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์Œ์ฒ˜๋Ÿผ AppRouter ๋‚ด๋ถ€์—์„œ useLocation()์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ Router๊นŒ์ง€ ํ•จ๊ป˜ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ:

import { Router, useLocation } from "react-router-dom";

const AppRouter = () => {
  const location = useLocation(); // โŒ ์—ฌ๊ธฐ์„œ ์—๋Ÿฌ ๋ฐœ์ƒ!

  return (
    <Router>
      {/* Routes ๊ตฌ์„ฑ */}
    </Router>
  );
};

์ด๋Ÿด ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

โ—useLocation() must be used within a <Router> component


โœ… ์ด์œ : useLocation์€ Router์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—ฌ์•ผ ๋™์ž‘

React Router์˜ ๋ชจ๋“  ํ›…๋“ค (useLocation, useNavigate, useParams ๋“ฑ)์€ ๋‚ด๋ถ€์ ์œผ๋กœ Router Context๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰, ์ด ํ›…๋“ค์ด ์ •์ƒ ์ž‘๋™ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ Router ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜(์ž์‹)์—์„œ ํ˜ธ์ถœ๋ผ์•ผ ํ•ด์š”.


โœ… ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๐Ÿ”ง Router๋Š” index.tsx์—, AppRouter๋Š” ๊ฒฝ๋กœ ๊ตฌ์„ฑ๋งŒ

๐Ÿ“ index.tsx (๋˜๋Š” main.tsx)

import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import AppRouter from "./AppRouter";

const root = ReactDOM.createRoot(document.getElementById("root")!);
root.render(
  <React.StrictMode>
    <BrowserRouter>
      <AppRouter />
    </BrowserRouter>
  </React.StrictMode>
);

๐Ÿ“ AppRouter.tsx

import { Routes, Route, useLocation } from "react-router-dom";
import Header from "./components/common/Header";
import StudyRoomHeader from "./components/studyRoom/StudyRoomHeader";
import HomePage from "./pages/HomePage";
import StudyRoomPage from "./pages/StudyRoomPage";

const AppRouter = () => {
  const location = useLocation();
  const isStudyRoom = location.pathname.startsWith("/study-room");

  return (
    <>
      {isStudyRoom ? <StudyRoomHeader /> : <Header />}
      <Routes>
        <Route path="/" element={<HomePage />} />
        <Route path="/study-room" element={<StudyRoomPage />} />
      </Routes>
    </>
  );
};

export default AppRouter;

โ“ ๊ทธ๋Ÿผ useLocation์„ ์•ˆ ์“ฐ๋ฉด Router๋ฅผ ์–ด๋””์— ๋‘ฌ๋„ ๋˜๋Š” ๊ฑธ๊นŒ?

โœ”๏ธ ๋งž์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ AppRouter ๋‚ด๋ถ€์—์„œ useLocation()์ด๋‚˜ useNavigate(), useParams() ๊ฐ™์€ ํ›…์„ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด,
Router๋ฅผ AppRouter ์•ˆ์— ๋‘๋”๋ผ๋„ ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๊ฑด ์šฐ์—ฐํžˆ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ๋ฟ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค:


๐Ÿšซ ๋‚ด๋ถ€์—์„œ Router๋ฅผ ์„ ์–ธํ•˜๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ 

๋ฌธ์ œ์„ค๋ช…
โŒ ์œ„์น˜ ๋ถ€์ ์ ˆ๋ผ์šฐํŒ… ํ™˜๊ฒฝ๊ณผ ๊ตฌ์กฐ๋ฅผ ํ•œ ์ปดํฌ๋„ŒํŠธ์— ์„ž๊ฒŒ ๋จ
โŒ ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€์ถ”ํ›„ useLocation ์‚ฌ์šฉ ์‹œ ๋‹ค์‹œ ๊ตฌ์กฐ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ
โŒ ์ปจํ…์ŠคํŠธ ์ค‘์ฒฉ ์˜ค๋ฅ˜์ค‘์ฒฉ๋œ Router๋‚˜ ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„๊ทธ ์œ ๋ฐœ ๊ฐ€๋Šฅ

โœ… ๊ตฌ์กฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒŒ ์ข‹์€ ์ด์œ 

์žฅ์ ์„ค๋ช…
โœ… ์•ˆ์ •์„ฑ๋ชจ๋“  ๋ผ์šฐํ„ฐ ํ›…๋“ค์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘๋™
โœ… ์—ญํ•  ๋ถ„๋ฆฌindex.tsx โ†’ ํ™˜๊ฒฝ ์ œ๊ณต, AppRouter.tsx โ†’ ๊ฒฝ๋กœ ๊ตฌ์„ฑ
โœ… ํ™•์žฅ์„ฑ์ดํ›„ Layout, AuthRoute ์ถ”๊ฐ€ํ•˜๊ธฐ ์‰ฌ์›€
โœ… ์˜ˆ์ธก ๊ฐ€๋Šฅ๋™์ž‘ ์œ„์น˜๊ฐ€ ๋ช…ํ™•ํ•˜๋ฏ€๋กœ ๋””๋ฒ„๊น…์ด ์‰ฌ์›€

๐Ÿง  ์ •๋ฆฌ

์ƒํ™ฉRouter ์œ„์น˜์„ค๋ช…
useLocation() ์‚ฌ์šฉํ•จindex.tsx (์ตœ์ƒ๋‹จ)๋ฐ˜๋“œ์‹œ ํ•„์š”
์•„๋ฌด ํ›…๋„ ์‚ฌ์šฉ ์•ˆ ํ•จ๋‚ด๋ถ€์— ๋‘ฌ๋„ ์—๋Ÿฌ ์—†์Œ๊ทธ๋Ÿฌ๋‚˜ ๋น„์ถ”์ฒœ

โœจ ๊ฒฐ๋ก 

โ€œHook์„ ์“ฐ๋ ค๋ฉด, ๊ทธ Hook์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ ์•ˆ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.โ€

React Router์˜ ํ›…์„ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ Router๋Š” ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€, ๋ณดํ†ต์€ index.tsx์— ์œ„์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ›…์€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์•ˆ ์“ฐ๋”๋ผ๋„ ๋ฏธ๋ž˜๋ฅผ ์ƒ๊ฐํ•ด ๊ตฌ์กฐ๋ฅผ ๋‚˜๋ˆ ๋‘๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ๐ŸŒฑ

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