๐Ÿฑ #9 React.js - Router 6.4

๋ฐ•์ค€์„ยท2022๋…„ 11์›” 10์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
10/13
post-thumbnail

๐Ÿงถ Router

Router๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ฃผ์†Œ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฌ๋Ÿฌ ์ข…์œ ์˜ ๋ผ์šฐํ„ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๐Ÿงฉ Router ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

$ cd <your new project directory>
$ npm install react-router-dom localforage match-sorter sort-by

๐Ÿงฉ ํ”„๋กœ์ ํŠธ์— ๋ผ์šฐํ„ฐ ์ ์šฉ

ํ”„๋กœ์ ํŠธ์— ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ๋ฅผ ์ ์šฉํ•  ๋•Œ๋Š” src/index.js ํŒŒ์ผ์—์„œ react-router-dom์— ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” 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(
<BrowserRouter>
  <App />
</BrowserRouter>

);

๐Ÿงฉ ํŽ˜์ด์ง€ ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ

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

import React from 'react'

const Loginpage = () => {
  return (
    <div>
        <h1>Login Page</h1>
    </div>
  )
}

export default Loginpage

๐Ÿงฉ Route ์ปดํฌ๋„ŒํŠธ๋กœ ํŠน์ • ๊ฒฝ๋กœ์— ์›ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋ณด์—ฌ์ฃผ๊ธฐ

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

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

<Route path="์ฃผ์†Œ๊ทœ์น™" element={๋ณด์—ฌ ์ค„ ์ปดํฌ๋„ŒํŠธ JSX} />
import { useState } from 'react';
import './App.css';
import Homepage from './page/Homepage';
import Aboutpage from './page/Aboutpage';
import Productpage from './page/Productpage';
import ProductDetailPage from './page/ProductDetailPage';
import {  BrowserRouter as Route, Routes, Navigate} from "react-router-dom";
import Loginpage from './page/Loginpage';
import Userpage from './page/Userpage';


function App() {

  const [authenticate, setAuthenticate] = useState(true);
  const PrivateRoute = () =>{
    return authenticate == true?<Userpage/> : <Navigate to="/login" />
  }

  return (
    <div>
      <Routes>
        <Route path="/" element={<Homepage />} /> {/*path ๊ฐ ํŽ˜์ด์ง€ ์ฃผ์†Œ elemnet ๊ทธ ์ฃผ์†Œ์— ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ํŽ˜์ด์ง€ */}
        <Route path="/about" element={<Aboutpage />} />
        <Route path="/products" element={<Productpage />} />
        <Route path="/products/:id" element={<ProductDetailPage />} />
        <Route path="/login" element={<Loginpage />} />
        <Route path='/user' element={<PrivateRoute />} />
      </Routes>

    </div>
  );
}

export default App;

์ด๋ฒˆ์—๋Š” Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๋งํฌ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž ์›น ํŽ˜์ด์ง€์—์„œ๋Š” ์›๋ž˜ ๋งํฌ๋ฅผ ๋ณด์—ฌ์ค„ ๋•Œ a ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ a ํƒœ๊ทธ๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, a ํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Navigate ๋Š” Link ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™์„ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ์‚ฌ์šฉํ•˜๋Š” Hook ์ž…๋‹ˆ๋‹ค.

<Link to="๊ฒฝ๋กœ">๋งํฌ ์ด๋ฆ„</Link>
import React from 'react'
import { Link, useNavigate } from 'react-router-dom'

const Homepage = () => {
  const navigate =useNavigate();
  const goProductPage=()=>{
        navigate("/products?q=pants") // ?์ฟผ๋ฆฌ ๋’ค์— ์žˆ๋Š” ๊ฐ’์€ url ๊ฒฝ๋กœ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ ์„ ํƒ์ ์ธ ์ •๋ณด์ž„.
  }
  return (
    <div>
        <h1>Homepage</h1>
        <Link to="/about">Go to about page</Link>
        <button onClick={goProductPage}>Go to Product page</button>
    </div>
  )
}

export default Homepage

๐Ÿงฉ RESTful Routes

๐Ÿ‘Ÿ Route๋ž€?

์‚ฌ์ดํŠธ๋ฅผ ํด๋ฆญํ•  ๋•Œ ๋งˆ๋‹ค ์„œ๋ฒ„์— ๋‹ค๋ฅธ ๋Œ€์ƒ์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ์š”์ฒญํ•œ๋‹ค. ์š”์ฒญ์„ ๋ฐ›๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌด์—‡์„ ๋‹ค์‹œ ๋ณด๋‚ผ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

๐Ÿ‘Ÿ CRUD๋ž€?

์ƒ์„ฑ, ์ฝ๊ธฐ, ์—…๋ฐ์ดํŠธ ๋ฐ ์‚ญ์ œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋„ค ๊ฐ€์ง€ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์œ ํ˜•์ด๋‹ค.

๐Ÿ‘Ÿ HTTP๋ช…๋ น์–ด

  • Get : ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์“ฐ์ž„ (fetchํ•˜๋ฉด ๊ธฐ๋ณธ ๋ช…๋ น์–ด ์†์„ฑ์ด Get์ž„)
  • Post : ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์“ฐ์ž„.
  • Put : ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์“ฐ์ž„(Patch ๋ผ๊ณ ๋„ ๋ถˆ๋ฆผ)
  • Delete: ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ• ๋•Œ ์“ฐ์ž„

๐Ÿงฉ UseParams

๋ฆฌ์•กํŠธ์—์„œ ๋ผ์šฐํ„ฐ ์‚ฌ์šฉ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ํ™œ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด useParams๋ผ๋Š” ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

import React from 'react'
import { useParams } from 'react-router-dom'

const ProductDetailPage = () => {

    const{id} = useParams(); //url์˜ ํŒŒ๋ฆฌ๋ฐ‘ํ„ฐ๊ฐ’์„ ์ฝ์–ด์˜ค๋Š” ํ•จ์ˆ˜.
  return (
    <div>
        <h1>Show Product Detail{id}</h1>
    </div>
  )
}

export default ProductDetailPage
profile
์•ˆ๋…•ํ•˜์„ธ์š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค. ๊ธ€์„ ์ด์ „ ์ค‘์ž…๋‹ˆ๋‹ค.

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