๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/React

[React] React Router 2 : Link, Switch, history ๊ธฐ๋Šฅ ์•Œ์•„๋ณด๊ธฐ

by Connecting-the-dots 2022. 3. 24.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

๐Ÿ’œ ์ƒ์„ธํŽ˜์ด์ง€๋ฅผ ๋‹ด์„ Detail Component ๋งŒ๋“ค๊ธฐ

import React from "react";

function Detail() {
  return (
    <div className="container">
          <div className="row">
            <div className="col-md-7">
              <img src="https://codingapple1.github.io/shop/shoes1.jpg" width="100%" />
            </div>
            <div className="col-md-5 mt-4">
              <h4 className="pt-5">White and Black</h4>
              <p>Born in France</p>
              <p>120000</p>
              <button className="btn btn-danger mx-1">์ฃผ๋ฌธํ•˜๊ธฐ</button> 
              <button className="btn btn-danger mx-1">๋’ค๋กœ๊ฐ€๊ธฐ</button> 
            </div>
          </div>
    </div>  
  )
}

export default Detail;
  • ์ง€๋‚œ ์‹œ๊ฐ„์—๋Š” <Route></Route> ํƒœ๊ทธ ์•ˆ์— html ๋‚ด์šฉ ์ „์ฒด๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒˆ์—๋Š” Main Component ์ฒ˜๋Ÿผ ๋”ฐ๋กœ Detail.js ํŒŒ์ผ์„ ๋งŒ๋“  ํ›„ Detail ์ด๋ผ๋Š” ์ด๋ฆ„์˜ Component ๋ฅผ ์ƒ์„ฑํ•ด์„œ export ํ•ด์ฃผ์—ˆ๋‹ค.
// ์ „์ฒด ์ฝ”๋“œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
// ์ „์ฒด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์„œ ๋ถˆํ•„์š”ํ•œ ๋ถ€๋ถ„์€ ์ œ์™ธํ–ˆ๋‹ค.

import Main from './Main'
import Detail from './Detail';

function App() {

  let [shoes, setShoes] = useState(Data);
  
  return (
    <div className="App">

          {/* Main */}
          <Route exact path='/'>
            <Main shoes={shoes}/>
          </Route>
          
          {/* Detail */}
          <Route path='/detail'>
            <Detail />
          </Route>
    
    </div>
  );
}
  • App.js ์— Detail ํŒŒ์ผ์˜ Detail ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ import ํ•ด์˜ค๋ฉด ์ด์ œ App.js ์—์„œ Detail Component ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๐Ÿ’œ ํŽ˜์ด์ง€ ์ด๋™ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

๐Ÿค Link ํƒœ๊ทธ๋กœ ํŽ˜์ด์ง€ ์ด๋™ ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ

// ๊ธฐ์กด Navbar
<Nav.Link href="#home">Home</Nav.Link>
<Nav.Link href="#link">Link</Nav.Link>

// Link ํƒœ๊ทธ๋กœ ํŽ˜์ด์ง€ ์ด๋™ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
<Nav.Link><Link to='/'>Home</Link></Nav.Link>
<Nav.Link><Link to='/detail'>Detail</Link></Nav.Link>
  • ์ด๋ฒˆ์—๋Š” Link ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด์„œ ์ƒ๋‹จ Navbar ์—์„œ ์›ํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋ณด์•˜๋‹ค.
  • ๋‚˜๋Š” Home ์ด๋ผ๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด / ๊ฒฝ๋กœ๋กœ, Detail ์ด๋ผ๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด /detail ๊ฒฝ๋กœ๋กœ ์ด๋™์‹œ์ผœ์ค„ ๊ฒƒ์ด ๋•Œ๋ฌธ์— ๊ฐ ๊ธ€์ž๋ฅผ <Link></Link> ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ค€ ํ›„ to ๋ผ๋Š” ์†์„ฑ์„ ์ด์šฉํ•ด์„œ ๊ฒฝ๋กœ๋ฅผ ์ ์–ด์ฃผ์—ˆ๋‹ค.
    (์ฐธ๊ณ ๋กœ Link ํƒœ๊ทธ๋Š” 'react-router-dom' ์„ ์„ค์น˜ํ•œ ํ›„์— import ํ•ด์˜ค๋ฉด ๋œ๋‹ค.)

๐Ÿค ํŽ˜์ด์ง€ ์ด๋™ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ (๋’ค๋กœ๊ฐ€๊ธฐ)

  • <Link></Link> ํƒœ๊ทธ ์™ธ์—๋„ ํŽ˜์ด์ง€ ์ด๋™ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€ ์ด๋™ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
import React, { useState } from "react";
import { useHistory } from 'react-router-dom';

function Detail(props) {

    let history = useHistory();

    return (
        <div className="container">
              <div className="row">
                <div className="col-md-7">
                  <img src="https://codingapple1.github.io/shop/shoes1.jpg" width="100%" />
                </div>
                <div className="col-md-5 mt-4">
                  <h4 className="pt-5">White and Black</h4>
                  <p>Born in France</p>
                  <p>120000</p>
                  <button className="btn btn-danger mx-1">์ฃผ๋ฌธํ•˜๊ธฐ</button> 
                  <button className="btn btn-danger mx-1" onClick={()=>{history.goBack()}}>๋’ค๋กœ๊ฐ€๊ธฐ</button> 
                </div>
              </div>
        </div>  
    )
}

export default Detail;
  • ์ด๋ฒˆ์—๋Š” Detail.js ํŒŒ์ผ์— '์ฃผ๋ฌธํ•˜๊ธฐ' ๋ฒ„ํŠผ๊ณผ ๋™์ผํ•œ ์Šคํƒ€์ผ์˜ '๋’ค๋กœ๊ฐ€๊ธฐ' ๋ฒ„ํŠผ์„ ์ถ”๊ฐ€ํ•ด๋ณด์•˜๋‹ค.
  • ๋’ค๋กœ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด useHistory() ํ•จ์ˆ˜๋ฅผ import ํ•ด์˜จ ๋‹ค์Œ history ๋ผ๋Š” ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด์ฃผ์—ˆ๋‹ค.
    (์ฐธ๊ณ ๋กœ useHistory() ํ•จ์ˆ˜๋Š” ์ผ์ข…์˜ Hook ์ด๋‹ค. ํŽธํ•˜๊ฒŒ useState ์™€ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.)
  • ์ด์ œ history ๋ผ๋Š” ์ด๋ฆ„์˜ ๋ณ€์ˆ˜์—๋Š” ํŽ˜์ด์ง€ ์ด๋™ ๋‚ด์—ญ๊ณผ ์œ ์šฉํ•œ ํ•จ์ˆ˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํฐ object ์ž๋ฃŒ๊ฐ€ ํ• ๋‹น๋œ ๊ฒƒ์ด๋‹ค.
  • history ์— ์ €์žฅ๋œ ์—ฌ๋Ÿฌ ์ž๋ฃŒ๋“ค ์ค‘ ๊ฐ€์žฅ ์œ ์šฉํ•˜๊ณ  ๋’ค๋กœ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ํ•จ์ˆ˜๋Š” goBack() ์ด๋ผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  • goBack() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ํŽ˜์ด์ง€๊ฐ€ ๋’ค๋กœ ๊ฐ„๋‹ค.
  • ๋”ฐ๋ผ์„œ '๋’ค๋กœ๊ฐ€๊ธฐ' ๋ฒ„ํŠผ์— onClick ์†์„ฑ์œผ๋กœ {()=>{history.goBack()}} ์ด๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.
    (์ด์™ธ์— ๊ถ๊ธˆํ•œ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฒ•์„ ๊ฒ€์ƒ‰ํ•ด๋ณด๋ฉด ๋œ๋‹ค.)

๐Ÿค ํŽ˜์ด์ง€ ์ด๋™ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ (์ปค์Šคํ…€ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ธฐ)

  • ์›ํ•˜๋Š” ํŽ˜์ด์ง€๋กœ ํŽ˜์ด์ง€ ์ด๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์œผ๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋ฒ•์„ ์ฐธ๊ณ ํ•˜์—ฌ push() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • ๋ฒ„ํŠผ์œผ๋กœ ์‚ฌ์šฉํ•  ํƒœ๊ทธ ์•ˆ์— onClick ์†์„ฑ์œผ๋กœ {()=> {history.push('/๊ฒฝ๋กœ๋ช…')}} ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๊ฒฝ๋กœ๋ช…์— ์›ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์–ด ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ’œ Switch Component ์•Œ์•„๋ณด๊ธฐ

  • <Switch></Switch> ํƒœ๊ทธ๋Š” ์ฃผ์†Œ์ฐฝ์— ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ, ๊ทธ ํƒœ๊ทธ ์•ˆ์— ์žˆ๋Š” <Route></Route> ํƒœ๊ทธ๋“ค ์ค‘ ๋งค์น˜๋˜๋Š” <Route></Route> ๋“ค์„ ๋ชจ๋‘ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ํ•œ๋ฒˆ์— ๋”ฑ ํ•˜๋‚˜๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
  • ๋ฌด์Šจ ๋ง์ด๋ƒ๋ฉด <Route> ์˜ path ์— ์ ํ˜€์žˆ๋Š” ๊ฒฝ๋กœ๊ฐ€ ํฌํ•จ๊ด€๊ณ„๋ผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ React Router ๋Š”  ํฌํ•จํ•˜๋Š” ๋ชจ๋“  <Route></Route> ํƒœ๊ทธ์˜ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค.
          <Route path='/'>
            <div>๋ฉ”์ธ ํŽ˜์ด์ง€</div>
          </Route>

          <Route path='/detail'>
            <div>์ƒ์„ธ ํŽ˜์ด์ง€</div>
          </Route>
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด /detail ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ '๋ฉ”์ธ ํŽ˜์ด์ง€', '์ƒ์„ธ ํŽ˜์ด์ง€' ๋ฌธ๊ตฌ๊ฐ€ ๋ชจ๋‘ ๋ณด์ธ๋‹ค.

 

  • ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค, ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ <Route></Route> ํƒœ๊ทธ ๋‚ด์šฉ๋งŒ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ๋‹ค ๊ทธ๋Ÿด ๋•Œ ๊ทธ ๋ฒ”์ฃผ์— ๋„ฃ์„ <Route></Route> ํƒœ๊ทธ๋“ค์„ <Switch></Switch> ํƒœ๊ทธ ์•ˆ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

  • ๋‹ค๋งŒ, <Switch></Switch> ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ๋ฉด ๋งค์นญ๋œ <Route></Route> ํƒœ๊ทธ ์ค‘ ๋งจ ์œ„์˜ ํ•˜๋‚˜๋งŒ ๋ณด์—ฌ์ฃผ๋ฏ€๋กœ ์ฝ”๋“œ์˜ ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค.

 

  • <Route></Route>ํƒœ๊ทธ๋“ค์˜ ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ•ด์ฃผ๋ฉด exact ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์œ„์™€ ๊ฐ™์ด ์›ํ•˜๋Š” ํŽ˜์ด์ง€ ํ•˜๋‚˜๋งŒ ๋‚˜์˜ค๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

728x90
๋ฐ˜์‘ํ˜•