ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

 
๊ธฐ์—…๊ณผ์ œ๋ฅผ ํ•˜๋ฉด์„œ 'Link ํƒœ๊ทธ๋ฅผ ์จ์•ผํ•˜๋‚˜..? ๊ทธ๋ƒฅ ์ƒํ™ฉ์— ๋งž์ถฐ ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋„˜๊ฒจ์ฃผ๋ฉด ๋˜๋ ค๋‚˜..?๐Ÿค”' ํ—ท๊ฐˆ๋ ธ๋˜ ์ˆœ๊ฐ„์ด ์žˆ์—ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ํ›„์ž์˜ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰์„ ํ–ˆ์ง€๋งŒ ์•„๋ฌด๋ž˜๋„ ๋ผ์šฐํ„ฐ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜์–ด ๊ธฐ๋ณธ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ๊ฐœ๋…์„ ๋‹ค์‹œ ์žก์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

React์—์„œ์˜ ํŽ˜์ด์ง€์ด๋™

๋ผ์šฐํŒ…?๐Ÿค”

์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ URL์— ๋”ฐ๋ผ ์•Œ๋งž๋Š” ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ.

์˜ˆ์‹œ

๐Ÿ› ์‡ผํ•‘๋ชฐ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ์–ด๋–ค ํŽ˜์ด์ง€๋“ค์ด ํ•„์š”ํ• ๊นŒ?

  • ์ƒํ’ˆ ๋ชฉ๋ก ํŽ˜์ด์ง€
  • ์ƒํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํŽ˜์ด์ง€
  • ๋งˆ์ด ํŽ˜์ด์ง€
    ... ๋“ฑ

์ด์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋•Œ ํŽ˜์ด์ง€๋ณ„๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ผ์šฐํŒ… ์‹œ์Šคํ…œ์ด๋‹ค.

โš™๏ธ ์„ค์น˜

npm install react-router-dom

Router

ํ”„๋กœ์ ํŠธ์— ๋ผ์šฐํ„ฐ๋ฅผ ์ ์šฉํ•  ๋•Œ์—๋Š” src/index.js ํŒŒ์ผ์—์„œ react-router-dom์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” BrowserRouter๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด App ์„ ๊ฐ์‹ธ์ค€๋‹ค.
BrowserRouter์˜ ๊ฒฝ์šฐ, Link ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด URL์„ ์ด๋™ํ•˜๊ณ  HTML5์˜ History API๋ฅผ ์‚ฌ์šฉํ•ด ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š๊ณ ๋„ ๋‹จ์ˆœํžˆ ์ฃผ์†Œ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉฐ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๋ Œ๋”๋งํ•ด์ค€๋‹ค.

src/index.js

import { createRoot } from "react-dom/client";
import App from "./App";
import { BrowserRouter } from "react-router-dom";

const container = document.getElementById("root");
const root = createRoot(container);
root.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
);

Routes์™€ Route

ํŽ˜์ด์ง€๋กœ ์‚ฌ์šฉํ•  ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ž‘์„ฑํ•œ ํ›„, ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์›ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ Route๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŠธ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ด๋•Œ, Route๋Š” Routes์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค.
Routes๋Š” ์—ฌ๋Ÿฌ Route๋ฅผ ๊ฐ์‹ธ์„œ ๊ทธ ์ค‘ ๊ทœ์น™์ด ์ผ์น˜ํ•˜๋Š” ๋ผ์šฐํŠธ ํ•˜๋‚˜๋งŒ์„ ๋ Œ๋”๋ง ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
Route๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

<Route path="๊ฒฝ๋กœ ๊ทœ์น™" element={๋ณด์—ฌ์ค„ ์ปดํฌ๋„ŒํŠธ๋ช…} />

๐Ÿ’ก v5 โžก๏ธ v6 ์—…๋ฐ์ดํŠธ ์‚ฌํ•ญ

  1. exact ํ‚ค์›Œ๋“œ ์‚ญ์ œ
  2. Swich โžก๏ธ Routes ๋กœ ๋ณ€๊ฒฝ
  3. component โžก๏ธ element ๋กœ ๋ณ€๊ฒฝ

src/App.js

import { Route, Routes } from "react-router-dom";
import { Header } from "./Components/Header/Header";
import { Home } from "./Components/Home";
import { About } from "./Components/About";
import { Record } from "./Components/Record";
import { Articles } from "./Components/Articles";

function App() {
  return (
    <div>
      <Header />
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/record" element={<Record />} />
        <Route path="/articles" element={<Articles />} />
      </Routes>
    </div>
  );
}
export default App;

Link ์ปดํฌ๋„ŒํŠธ

<Link> ๋Š” HTML์˜ <a> ํƒœ๊ทธ ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํƒญ์„ ํ†ตํ•ด ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์š”์†Œ์ด๋‹ค.

๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ <a>ํƒœ๊ทธ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋˜๊ณ  Link์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Link์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

<Link to="๊ฒฝ๋กœ">๋งํฌ ์ด๋ฆ„</Link>

src/Components/Header.jsx

import React from "react";
import { Link } from "react-router-dom";
import "./style.css";

export const Header = () => {
  return (
    <>
      <header>
        <h1>
          <Link to="/">ํ™ˆ</Link>
        </h1>
        <ul>
          <li>
            <Link to="/about">about me</Link>
          </li>
          <li>
            <Link to="/record">์ด๋ ฅ</Link>
          </li>
          <li>
            <Link to="/articles">ํฌํŠธํด๋ฆฌ์˜ค</Link>
          </li>
        </ul>
      </header>
    </>
  );
};

๊ฒฐ๊ณผ

์ค‘์ฒฉ ๋ผ์šฐํŠธ

์œ„์—์„œ ์‡ผํ•‘๋ชฐ ํŽ˜์ด์ง€๋Š” ์ƒํ’ˆ ๋ชฉ๋ก ํŽ˜์ด์ง€์™€ ์ƒํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ–ˆ์—ˆ๋‹ค.
๊ฒฝ๋กœ๋ฅผ ์ž„์˜๋กœ ์ž‘์„ฑํ•ด๋ณด๋ฉด /product ์™€ /product/1 ์˜ ํ˜•ํƒœ๊ฐ€ ๋˜์–ด์•ผ ํ• ํ…๋ฐ ์ด๊ฑด ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

src/App.js

import { Route, Routes } from "react-router-dom";
import { Header } from "./Components/Header/Header";
import { Home } from "./Components/Home";
import { About } from "./Components/About";
import { Record } from "./Components/Record";
import { Articles } from "./Components/Articles";
import { Article } from "./Components/Article";

function App() {
  return (
    <div>
      <Header />
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/record" element={<Record />} />
        <Route path="/articles" element={<Articles />} />
        <Route path="/articles/:id" element={<Article />} /> // โญ๏ธ ์ด ๋ถ€๋ถ„์„ ์ถ”๊ฐ€!
      </Routes>
    </div>
  );
}
export default App;

App.js์—์„œ ๋ผ์šฐํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ, ์ด๋•Œ path ๋ถ€๋ถ„์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค.

src/Components/Articles.jsx

import React from "react";
import { Link } from "react-router-dom";

export const Articles = () => {
  return (
    <div>
      <h2>ํฌํŠธํด๋ฆฌ์˜ค</h2>
      <ul>
        <li>
          <Link to="/articles/1">ํฌํŠธํด๋ฆฌ์˜ค 1</Link>
        </li>
        <li>
          <Link to="/articles/2">ํฌํŠธํด๋ฆฌ์˜ค 2</Link>
        </li>
        <li>
          <Link to="/articles/3">ํฌํŠธํด๋ฆฌ์˜ค 3</Link>
        </li>
      </ul>
    </div>
  );
};

src/Components/Article.jsx

import React from "react";
import { useNavigate, useParams } from "react-router-dom";

export const Article = () => {
  const { id } = useParams();
  const navigate = useNavigate();

  const goBack = () => {
    navigate(-1);
  };
  return (
    <div>
      <button onClick={goBack}>๋’ค๋กœ๊ฐ€๊ธฐ</button>
      <p>Article {id}</p>
    </div>
  );
};

๊ฒฐ๊ณผ

๋งŒ์•ฝ, ๊ฐ๊ฐ์˜ ํฌํŠธํด๋ฆฌ์˜ค ํŽ˜์ด์ง€์—์„œ ํฌํŠธํด๋ฆฌ์˜ค ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค˜์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?
๊ฒŒ์‹œํŒ์—์„œ๋„ ๊ฒŒ์‹œ๋ฌผ์„ ๋‹ค ๋ณด๊ณ  ์Šคํฌ๋กค์„ ๋ฐ‘์œผ๋กœ ๋‚ด๋ ค๋ณด๋ฉด ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก์ด ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข…์žˆ๋Š”๋ฐ ๊ทธ๋Ÿฐ๊ฑด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€๋„ ์•Œ์•„๋ณด์ž!

src/App.js

import { Route, Routes } from "react-router-dom";
import { Header } from "./Components/Header/Header";
import { Home } from "./Components/Home";
import { About } from "./Components/About";
import { Record } from "./Components/Record";
import { Articles } from "./Components/Articles";
import { Article } from "./Components/Article";

function App() {
  return (
    <div>
      <Header />
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/record" element={<Record />} />
        <Route path="/articles" element={<Articles />}>
          <Route path=":id" element={<Article />} />
        </Route> // โญ๏ธ ์ฝ”๋“œ ๋ณ€๊ฒฝ!
      </Routes>
    </div>
  );
}
export default App;

articles ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง„ ๋ผ์šฐํŠธ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง„ ๋ผ์šฐํŠธ๋ฅผ ๊ฐ์‹ธ์ค€๋‹ค. ์ฆ‰, ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง„ ๋ผ์šฐํŠธ๋ฅผ children์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

src/Components/Articles.jsx

import React from "react";
import { Link, Outlet } from "react-router-dom";

export const Articles = () => {
  return (
    <div>
      <h2>ํฌํŠธํด๋ฆฌ์˜ค ๋ชฉ๋ก</h2>
      <Outlet /> // โญ๏ธ ์ถ”๊ฐ€!
      <ul>
        <li>
          <Link to="/articles/1">ํฌํŠธํด๋ฆฌ์˜ค 1</Link>
        </li>
        <li>
          <Link to="/articles/2">ํฌํŠธํด๋ฆฌ์˜ค 2</Link>
        </li>
        <li>
          <Link to="/articles/3">ํฌํŠธํด๋ฆฌ์˜ค 3</Link>
        </li>
      </ul>
    </div>
  );
};

๋ชฉ๋ก์ด ๋  ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ <Outlet>์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์ค€๋‹ค.
<Outlet>๋Š” Route์˜ children์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š” JSX ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ• ์ด๋‹ค.

๊ทธ๋Ÿผ <h2>ํฌํŠธํด๋ฆฌ์˜ค ๋ชฉ๋ก</h2> ๋ฐ‘์—๋Š”

<Route path=":id" element={<Article />} />

ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๋ณด์—ฌ์ง€๊ฒŒ๋˜๊ณ  ๊ทธ ๋ฐ‘์— Articles์— ํ•ด๋‹นํ•˜๋Š” ๋ชฉ๋ก์ด ๋ณด์—ฌ์งˆ ๊ฒƒ์ด๋‹ค.

 

๊ฒฐ๊ณผ

๐Ÿ“š ์ฐธ๊ณ 

๋Œ“๊ธ€