KDT/TIL

10/5 TIL : React Router

ebulsok 2022. 10. 14. 14:24

๐Ÿ”Ž public ํด๋” ์‚ฌ์šฉ

  • ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ด์šฉํ•ด์„œ src ํด๋” ์ด์ƒ์œผ๋กœ ๊ฐ€์„œ ๋‹ค๋ฅธ ํด๋”์— ์ ‘๊ทผํ•˜์—ฌ ๋‚ด๋ ค๊ฐ€๋Š” ๋ฐฉ์‹, ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • ๊ธฐ์กด ๋ฐฑ์—”๋“œ์—์„œ๋Š” public ํด๋”๋ฅผ static์ด๋ผ๋Š” express ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŠน์ • ์ฃผ์†Œ ๊ฐ’์„ ์š”์ฒญํ•˜๋ฉด ์—ฐ๊ฒฐ์ด ๋˜์—ˆ์Œ
  • npx create-react-app์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ฆฌ์•กํŠธ ์•ฑ์˜ ๊ฒฝ์šฐ๋Š” public ํด๋”๊ฐ€ ์ž๋™์œผ๋กœ static ์ฒ˜๋ฆฌ๋จ
  • ๋”ฐ๋ผ์„œ ์–ด๋А ์œ„์น˜์—์„œ๊ฑด / ๋ฅผ ์จ์„œ ์ ‘๊ทผํ•˜๋ฉด public ํด๋”๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ

 

๐Ÿ”Ž Composition(ํ•ฉ์„ฑ), Specialization, Containment

 

๐Ÿ”Ž React Router

  • ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ๋ณ„ ๋ผ์šฐํŒ…์ด ๊ฐ€๋Šฅ
  • [ํ„ฐ๋ฏธ๋„] npm i react-router-dom
  • index.js ์—์„œ App ์ปดํฌ๋„ŒํŠธ๋ฅผ <BrowserRouter>๋กœ ๊ฐ์‹ธ๊ธฐ
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom';

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

reportWebVitals();
  • Routes ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— Route ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  ๊ฐ๊ฐ์˜ ์ฃผ์†Œ ๊ฐ’์€ path์—, ํ˜ธ์ถœํ•  ์ปดํฌ๋„ŒํŠธ๋Š” element ์†์„ฑ์œผ๋กœ ๋ถˆ๋Ÿฌ์ฃผ๊ธฐ
  • <a> ํƒœ๊ทธ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ ˆ๋ฒจ์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ž๋™์œผ๋กœ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— React์—์„œ๋Š” ์ด๋ฅผ ๋ง‰๊ณ ์ž <Link to="">๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ
// src/app.js
import { Routes, Route } from 'react-router-dom';

function App() {
  return (
    <div className="App">
      <Routes>
        <Route path="/" element={<Header />} />
        <Route path="/profile" element={<Profile />} />
        <Route path="/board" element={<Board />} />
        <Route path="/board/:boardID" element={<BoardDetail />} />
      </Routes>
    </div>
  );
}

export default App;

 

๐Ÿšฉ PageNotFound

  • ์ž˜๋ชป ์ž…๋ ฅ๋œ ์ฃผ์†Œ์— ๋Œ€ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
  • * ๋Š” ๋ชจ๋“  ์ฃผ์†Œ ์ž…๋ ฅ์„ ์˜๋ฏธํ•จ
  • React-router-dom๋„ ์ฝ”๋“œ ์„ ์–ธ ์ˆœ์„œ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ง€๋ง‰ ๋ผ์šฐํ„ฐ์—์„œ *๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ผ์น˜ํ•˜์ง€ ์•Š์€ ์ฃผ์†Œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
// src/app.js
import { Routes, Route } from 'react-router-dom';

function App() {
  return (
    <div className="App">
      <Routes>
        <Route path="/" element={<Header />} />
        <Route path="/profile" element={<Profile />} />
        <Route path="/board" element={<Board />} />
        <Route path="/board/:boardID" element={<BoardDetail />} />
        <Route path="*" element={<NotFound />} />
      </Routes>
    </div>
  );
}

export default App;

 

๐Ÿšฉ ์ฃผ์†Œ parameter ํ™œ์šฉ

  • parameter๋Š” useParams๋กœ ์„ ์–ธํ•œ ๊ฐ์ฒด ๋ณ€์ˆ˜์— ๋‹ด๊ธฐ๊ฒŒ ๋จ
// src/components/Board.js
import { Link } from "react-router-dom"
import Header from "./Header"

export default function Board() {
  return (
    <>
      <Header />
      <h1>๊ฒŒ์‹œํŒ ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.</h1>
      <Link to="1"><h2>๊ฒŒ์‹œ๊ธ€ 1๋ฒˆ</h2></Link>
      <Link to="2"><h2>๊ฒŒ์‹œ๊ธ€ 2๋ฒˆ</h2></Link>
    </>
  )
}
// src/components/BoardDetail.js
import { useLocation, useParams } from "react-router-dom"
import Header from "./Header"

export default function BoardDetail() {
    const { boardID} = useParams();
    
    return (
        <>
            <Header />
            <h1>{boardID}๋ฒˆ ๊ฒŒ์‹œ๊ธ€์ž…๋‹ˆ๋‹ค.</h1>
        </>
    )
}

 

๐Ÿšฉ ์ฃผ์†Œ query ๋ฐ›๊ธฐ

  • ์›๋ž˜ query๋Š” react-query ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•จ
  • ์ด๋ฒˆ์—๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™•์ธ๋งŒ ํ•  ๊ฒƒ์ด๋ฏ€๋กœ react-router-dom์˜ ๊ธฐ๋Šฅ ํ™œ์šฉ
  • search: ?๋ฅผ ํฌํ•จํ•œ query string
  • path: ํ˜„์žฌ์˜ ์ฃผ์†Œ
  • hash: ์ฃผ์†Œ์— ๋“ค์–ด์žˆ๋Š” # ๋ฌธ์ž์—ด ๋’ค์˜ ๊ฐ’(ํ•ด์‹œ ์ฃผ์†Œ ๊ฐ’)
// src/components/BoardDetail.js
import { useLocation, useParams } from "react-router-dom"
import Header from "./Header"

export default function BoardDetail() {
    const { boardID} = useParams();
    const location = useLocation();
    
    return (
        <>
            <Header />
            <h1>{boardID}๋ฒˆ ๊ฒŒ์‹œ๊ธ€์ž…๋‹ˆ๋‹ค.</h1>
            <p>์ฟผ๋ฆฌ: {location.search}</p>
            <p>์ฃผ์†Œ: {location.pathname}</p>
            <p>ํ•ด์‰ฌ: {location.hash}</p>
        </>
    )
}