๊ด€๋ฆฌ ๋ฉ”๋‰ด

ruriruriya

[React] ๋ฆฌ์•กํŠธ - React Router๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ—ค๋” ํ‘ธํ„ฐ ๊ณ ์ •ํ•˜๊ธฐ(BrowserRouter, Routes, Route) ๋ณธ๋ฌธ

๐Ÿ–Œ๏ธWeb/React

[React] ๋ฆฌ์•กํŠธ - React Router๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ—ค๋” ํ‘ธํ„ฐ ๊ณ ์ •ํ•˜๊ธฐ(BrowserRouter, Routes, Route)

๋ฃจ๋ฆฌ์•ผใ…‘ 2024. 5. 20. 23:07
๋ฐ˜์‘ํ˜•

BrowserRouter, Routes, Route๋Š” react-router-dom ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ๋กœ, React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ผ์šฐํŒ…์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

์‰ฝ๊ณ  ์‹ฌํ”Œํ•œ ์ฝ”๋“œ๋กœ ํ—ค๋”์™€ ํ‘ธํ„ฐ๋ฅผ ๊ณ ์ •ํ•ด๋ณด์ž.

1. BrowserRouter, Routes, Route

1-1. BrowserRouter

BrowserRouter๋Š” HTML5์˜ History API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  URL์„ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ผ์šฐํ„ฐ๋กœ
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์ ธ์•ผ ํ•˜๋ฉฐ,
์ด๋ฅผ ํ†ตํ•ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

import { BrowserRouter as Router } from 'react-router-dom';

const App = () => (
  <Router>
    {/* ๋ผ์šฐํŒ… ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ๋“ค */}
  </Router>
);

 

1-2. Routes

Routes๋Š” ๋ผ์šฐํŠธ ๋งค์นญ์„ ๊ด€๋ฆฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค..
์—ฌ๋Ÿฌ ๊ฐœ์˜
Route ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž์‹์œผ๋กœ ๊ฐ€์ง€๋ฉฐ,
ํ˜„์žฌ URL๊ณผ ์ผ์น˜ํ•˜๋Š”
Route๋ฅผ ์ฐพ์•„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

import { Routes, Route } from 'react-router-dom';

const App = () => (
  <Router>
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
    </Routes>
  </Router>
);

 

1-3. Route

Route๋Š” ํŠน์ • ๊ฒฝ๋กœ(path)์™€ ํ•ด๋‹น ๊ฒฝ๋กœ์— ๋งค์นญ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ(element)๋ฅผ ์ •์˜ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.
URL์ด ์ง€์ •๋œ ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋œ๋‹ค.

  • path: ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, /๋Š” ๋ฃจํŠธ ๊ฒฝ๋กœ, /about์€ About ํŽ˜์ด์ง€ ๊ฒฝ๋กœ
  • element: ๊ฒฝ๋กœ๊ฐ€ ๋งค์นญ๋  ๋•Œ ๋ Œ๋”๋งํ•  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์ •
import { Route } from 'react-router-dom';

const App = () => (
  <Router>
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
    </Routes>
  </Router>
);

 

2. Router๋กœ ํ—ค๋” ํ‘ธํ„ฐ ๊ณ ์ •ํ•˜๊ธฐ

2-1. ํŒจํ‚ค์ง€ ์„ค์น˜

npm install react-router-dom

 

2-2. Header, Footer  ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ

// Header.js
import React from 'react';
import './Header.css';

const Header = () => {
  return (
    <header className="header">
      <h1>Header</h1>
    </header>
  );
};

export default Header;
// Footer.js
import React from 'react';
import './Footer.css';

const Footer = () => {
  return (
    <footer className="footer">
      <p>Footer</p>
    </footer>
  );
};

export default Footer;

 

2-3. ๊ฐ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ

ํ—ค๋”์™€ ํ‘ธํ„ฐ ์‚ฌ์ด์˜ ์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ž‘์„ฑํ•œ๋‹ค.

// Home.js
import React from 'react';

const Home = () => {
  return (
    <div>
      <h2>Home Page</h2>
      <p>Welcome to the home page!</p>
    </div>
  );
};

export default Home;
// About.js
import React from 'react';

const About = () => {
  return (
    <div>
      <h2>About Page</h2>
      <p>This is the about page.</p>
    </div>
  );
};

export default About;

 

2-4. App ์ปดํฌ๋„ŒํŠธ์— BrowserRouter ์ถ”๊ฐ€

react-router-dom์˜ BrowserRouter, Routes, Route๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์šฐํŒ…์„ ์„ค์ •.

// App.js
import React from 'react';
import { Routes, Route } from 'react-router-dom';
import Header from './layout/Header';
import Footer from './layout/Footer';
import Home from './pages/Home';
import About from './pages/About';
import './App.css';

const App = () => {
  return (
    <div className="app">
      <Header />
      <main className="content">
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
        </Routes>
      </main>
      <Footer />
    </div>
  );
};

export default App;

 

2-5. index.js์— BrowserRouter ์ถ”๊ฐ€

import React from 'react';
import ReactDOM from 'react-dom/client';
import {BrowserRouter} from 'react-router-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <BrowserRouter>   
      <App />    
    </BrowserRouter>
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

 

2-6. ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ css๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ—ค๋”์™€ ํ‘ธํ„ฐ๋ฅผ ๊ณ ์ •

/* Header.css */
.header {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 60px;
  background-color: #333;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
}
/* Footer.css */
.footer {
  position: fixed;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 40px;
  background-color: #333;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 1000;
}
/* App.css */
.app {
  padding-top: 60px; /* Header ๋†’์ด๋งŒํผ ํŒจ๋”ฉ ์ถ”๊ฐ€ */
  padding-bottom: 40px; /* Footer ๋†’์ด๋งŒํผ ํŒจ๋”ฉ ์ถ”๊ฐ€ */
}

.content {
  padding: 20px;
}

 

3. ์‹คํ–‰ํ™”๋ฉด

3-1.  Home ๋ฉ”๋‰ด ํด๋ฆญ ์‹œ

 

3-2. About ๋ฉ”๋‰ด ํด๋ฆญ ์‹œ

๋ฐ˜์‘ํ˜•