๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ“บ Front End/- React, Next.js

[๋ฆฌ์•กํŠธ ๋ถ„์„ํ•˜๊ธฐ] ๋ฆฌ์•กํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ… ํ•˜๋Š” ๋ฐฉ๋ฒ• (3) ๋ถ€์ œ :: react-router-dom์„ ์ด์šฉํ•ด์„œ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ํ•˜๊ธฐ

by Wonit 2020. 7. 20.
์ด ๊ธ€์€ ๋ฆฌ์•กํŠธ์˜ ์ดˆ์‹ฌ์ž๋“ค์„ ์œ„ํ•œ ๊ธ€๋กœ ๊นŠ์€ ๋‚ด์šฉ์€ ์ตœ๋Œ€ํ•œ ๋ฐฐ์ œํ•˜๊ณ  ์‰ฌ์šด ๊ฐœ๋…์— ๋Œ€ํ•ด ์ž‘์„ฑํ•˜์˜€๊ณ , ๋ฆฌ์•กํŠธ์˜ ์ง„์ž… ์žฅ๋ฒ…์„ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•œ ์š”์†Œ๋กœ ์–ด๋ ค์šด ๋‚ด์šฉ์ด ์ƒ๋žต๋˜์–ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ถ€๋ถ„์€ ๊ฝค๋‚˜ ํ•ต์‹ฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— 3๋ถ€์ž‘์œผ๋กœ ๋‚˜๋ˆ ์„œ ์„ค๋ช…ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค. ํ•ด๋‹น ๊ธ€์— ๋Œ€ํ•ด์„œ ๋ณธ์ธ์ด ์ด ๋ถ€๋ถ„์€ ๋„˜์–ด๊ฐ€๋„ ๋˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ถ€๋ถ„์€ ๋„˜์–ด๊ฐ€์„œ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๊ธธ์ง€ ์•Š์€ ๊ธ€์ด๋ฏ€๋กœ ๊ฐ€๋ณ๊ฒŒ ์ฝ๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

  1. 1๋ถ€ ๋ฆฌ์•กํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ… ํ•˜๋Š” ๋ฐฉ๋ฒ•
  2. 2๋ถ€ Browser History API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ํ•˜๊ธฐ
  3. 3๋ถ€ react-router-dom์„ ์ด์šฉํ•ด์„œ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ํ•˜๊ธฐ

์šฐ๋ฆฐ ์ง€๋‚œ ์‹œ๊ฐ„์— Brower Histroty API๋ฅผ ํ†ตํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ์„œ๋ฒ„์˜ ์š”์ฒญ ์—†์ด ๋ผ์šฐํŒ… ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค.

 

์˜ค๋Š˜์€ react-router-dom์„ ์ด์šฉํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ… ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

์ง€๋‚œ ์‹œ๊ฐ„์—๋Š” Browser History API์™€ react-router-dom์„ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋Š๋‚Œ์œผ๋กœ ์„ค๋ช…ํ–ˆ์—ˆ์ง€๋งŒ ์‚ฌ์‹ค ์ •ํ™•ํžˆ ๋ง ํ•˜์ž๋ฉด react-router-dom์€ Browser History API๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ํ‘œํ˜„์ด๋‹ค.

 

๋ณธ๊ฒฉ์ ์ธ ์‹œ์ž‘์— ์•ž์„œ ๋จผ์ € ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ํŽ˜์ด์ง€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

https://reactrouter.com/web/example/basic

์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.


react-router-dom

react-router-dom์€ Hook-Based API ๋ผ๊ณ  ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค.

Hook์ด๋ž€?

hook์€ ๋‹ค์Œ์— ๋” ์ž์„ธํžˆ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ด์ง€๋งŒ

react ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€

class ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ์ƒํƒœ๊ฐ’๊ณผ react ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค๋Š” ๊ฒƒ๋งŒ ์•Œ์•„๋‘๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ด์ œ React-Router์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ ๋“ค์— ๋Œ€ํ•ด์„œ ์ž ์‹œ ์•Œ์•„๋ณด์ž.

react-router-dom์˜ ํ•ต์‹ฌ Component

react-router-dom์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

  • Route
  • BrowserRouter
  • Link
  • Switch

Route

<Route> ์ปดํฌ๋„ŒํŠธ๋Š” ๊ณต์‹ ๋ฌธ์„œ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ Lowe Level ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ํ‘œํ˜„ํ•  ๋งŒํผ ์ค‘์š”ํ•˜๋‹ค.


ํ•ด๋‹น ๊ฒฝ๋กœ๊ฐ€ ํ˜„์žฌ ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•  ๋•Œ UI์˜ ์ผ๋ถ€๋ฅผ renderํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€๋งŒ 4.0 version ๋ถ€ํ„ฐ BrowserRouter๋‚˜ HashRouter, MemoryRouter, NativeRouter์™€ ๊ฐ™ HighLevel Router๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค.


์šฐ๋ฆฌ๊ฐ€ <Route> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ ํŽ˜์ด์ง€๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


๋งŒ์•ฝ ์ฃผ์†Œ๊ฐ€ path ์†์„ฑ๊ฐ’์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ ์†์„ฑ ๊ฐ’์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

 

<Route> ํƒœ๊ทธ์˜ exact ์†์„ฑ๊ณผ path ์†์„ฑ์ด ์žˆ๋Š”๋ฐ exact ์†์„ฑ์€ ๋‹ค์Œ์— ๋ฐฐ์šธ ๋ผ์šฐํŒ… ์‹ฌํ™”์—์„œ ๋‹ค๋ฃจ๊ฒ ๋‹ค. ๊ถ๊ธˆํ•œ ์‚ฌ๋žŒ์€ ์–ด๋ ค์šด ๋‚ด์šฉ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋จผ์ € ์ฐพ์•„๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

BrowserRouter

<BrowserRouter> ๋Š” ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ผ์šฐํŒ…์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

Link

<Link> ์†์„ฑ์€ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ to ์†์„ฑ ๊ฐ’์œผ๋กœ ์ด๋™ํ•  ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.


์šฐ๋ฆฌ๊ฐ€ ๋งํฌ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ž๋™์œผ๋กœ a ํƒœ๊ทธ๋กœ ์ปดํŒŒ์ผ ๋˜๋ฉฐ a ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹ซ๋‹ค๋ฉด ๋‹ค๋ฅธ ํƒœ๊ทธ๋ฅผ ์จ์•ผํ•˜๋Š”๋ฐ, ๋’ค์—์„œ ์ด์•ผ๊ธฐ ํ•ด๋ณด์ž.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€

<Link path="/url">์ด๋ฆ„</Link>

Switch

<Switch> ๋Š” ์—ฌ๋Ÿฌ ๋ผ์šฐํŒ… ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•  ๋•Œ, ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ๋กœ๋งŒ ํ‘œ์‹œํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ฃผ๋กœ ์—ฌ๋Ÿฌ Route๋ฅผ ํ•ฉ์„ฑ์‹œํ‚ฌ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์‚ฌ์šฉ ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

<Router>
  <Switch>
    <Route path="/url1">url1</Route>
    <Route path="/url2">url2</Route>
  </Switch>
</Router>

๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ Switch ํƒœ๊ทธ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํŽ˜์ด์ง€ ์ „ํ™˜ ํ•˜๋Š” ์ง„์ž…์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต์€ Link ํƒœ๊ทธ๋‚˜ ๋‹ค๋ฅธ ํ˜•ํƒœ๋กœ ์ง„์ž…์  UI๋ฅผ ๊ตฌ์„ฑํ•ด์ฃผ๊ณ  Switch๋กœ Route ํƒœ๊ทธ๋ฅผ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

๊ตฌ์กฐ ๊ทธ๋ฆผ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ

์ด๋Ÿฐ ๊ตฌ์กฐ๊ฐ€ ์ƒ๋‹นํžˆ ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์•„๋ž˜์˜ ๊ทธ๋ฆผ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž.

React๋กœ ๋งŒ๋“ค์–ด๋ณด๊ธฐ

์ด์ œ ๋Œ€์ถฉ react-router-dom ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ–ˆ์œผ๋‹ˆ ์•„๊นŒ ์ฒ˜์Œ ๋ดค๋˜ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

์ˆœ์„œ๋Š”

  1. BrowserRouter๋กœ ํžˆ์Šคํ† ๋ฆฌ API ์ฃผ์ž…ํ•˜๊ธฐ
  2. UI๋ฅผ ์œ„ํ•ด Link ํƒœ๊ทธ๋กœ ๋ผ์šฐํŒ… ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ ๋งŒ๋“ค๊ธฐ
  3. Switch ํƒœ๊ทธ๋กœ ์—ฌ๋Ÿฌ URL ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ
  4. ๊ฐ๊ฐ์˜ URL์„ Route ํƒœ๊ทธ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ

Link ํƒœ๊ทธ๋กœ ๋ผ์šฐํŒ… ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ ๋งŒ๋“ค๊ธฐ

์ด์ œ UI์—์„œ ๋ฒ„ํŠผ์ด ํฌํ•จ๋œ li ํƒœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Switch ํƒœ๊ทธ๋กœ ๊ฐ๊ฐ์˜ ๋ผ์šฐํŒ… ์„ค์ •ํ•˜๊ธฐ

์›๋ž˜๋ผ๋ฉด ํ•˜๋‚˜์˜ root ํƒœ๊ทธ ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ฐ์‹ธ์ค˜์•ผ ํ•˜์ง€๋งŒ ๋น ๋ฅธ ์ดํ•ด๋ฅผ ์œ„ํ•ด์„œ ๋‹ค๋ฅธ BrowserRouter ํƒœ๊ทธ๋ฅผ ์ด์šฉํ–ˆ๋‹ค. ๋ฐ‘์— ์†Œ์Šค ์ฝ”๋“œ์—์„œ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•  ๊ฒƒ์ด๋‹ˆ ์—ผ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

๊ฐ๊ฐ์˜ URL์— ๋ณด์—ฌ์งˆ ๋ Œ๋” ๊ตฌํ˜„ํ•˜๊ธฐ

์ด์ œ ๋ชจ๋“  ๊ตฌ์„ฑ์ด ๋๋‚ฌ๋‹ค.

 

๊ฒฐ๊ณผ ํ™”๋ฉด์„ ๋ด๋ณด์ž.

์ „์ฒด ์†Œ์Šค ์ฝ”๋“œ

import React, { Component } from 'react';
import './App.css';
import { BrowserRouter, Switch, Route, Link } from 'react-router-dom';

class App extends Component {
  render(){
    return (
      <BrowserRouter>
        <ul>
          <li>
            <Link to="Home"><button>home</button></Link>
          </li>

          <li>
            <Link to="About"><button>About</button></Link>
          </li>

          <li>
            <Link to="Dashboard"><button>Dashboard</button></Link>
          </li>
        </ul>
        <Switch>
          <Route path="/Home">
            <Home />
          </Route>

          <Route path="/About">
            <About />
          </Route>

          <Route path="/Dashboard">
            <Dashboard />
          </Route>
        </Switch>
      </BrowserRouter>
    );
  }
}

function Home(){
  return (
    <div>
      ์ด ๊ณณ์€ ํ™ˆ ํŽ˜์ด์ง€ ์ž…๋‹ˆ๋‹น.
    </div>
  );
}

function About() {
  return (
    <div>
      ์šฐ๋ฆฌ ์‚ฌ์ดํŠธ๋Š” React๋ฅผ ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ง„์ž… ์žฅ๋ฒฝ์„ ๋‚ฎ์ถฐ์ฃผ๋Š” ์‚ฌ์ดํŠธ ์ž…๋‹ˆ๋‹ค.
    </div>
  );
}

function Dashboard() {
  return (
    <div>
      ์ด ๊ณณ์€ ์งˆ๋ฌธ์„ ํ•˜๋Š” ๊ฒŒ์‹œํŒ ์ž…๋‹ˆ๋‹น.
    </div>
  );
}
export default App;

์ด๋ ‡๊ฒŒ Single Page Application์„ ๊ตฌ์„ฑํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ชจ๋‘ ์•Œ์•„๋ณด์•˜๋‹ค. ์„ ํƒ์€ ์ž์œ ์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ๋Š”
react-router-dom์„ ๋” ์ถ”์ฒœํ•œ๋‹ค. ์ด์œ ๋Š” ๋”์šฑ ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ๋“ค์–ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ์— ์‰ฝ๊ณ  ํŽธํ•˜๋ฉฐ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ํ’๋ถ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์งง์€ ์‹œ๋ฆฌ์ฆˆ์˜€์ง€๋งŒ ๋‚˜์—๊ฒŒ๋„ ์ƒ๋‹นํžˆ ์œ ์ตํ–ˆ์—ˆ๊ณ  ๋ณด๋Š” ๋ชจ๋“  ์ด๋“ค์—๊ฒŒ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค :)

'๐Ÿ“บ Front End > - React, Next.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฆฌ์•กํŠธ Hook ์‚ฌ์šฉํ•˜๊ธฐ] useState๋ฅผ ์ด์šฉํ•ด์„œ Functional Component์— state๋ฅผ ๊ด€๋ฆฌํ•˜์ž  (2) 2020.08.23
[๋ฆฌ์•กํŠธ ๋ถ„์„ํ•˜๊ธฐ] ๋ฆฌ์•กํŠธ์˜ ๊ฐ€์ƒ Dom์€ Native Dom๊ณผ ๋น„๊ตํ•ด์„œ ์™œ ๋น ๋ฅธ์ง€์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.  (0) 2020.07.30
[๋ฆฌ์•กํŠธ ๋ถ„์„ํ•˜๊ธฐ] ๋ฆฌ์•กํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ… ํ•˜๋Š” ๋ฐฉ๋ฒ• (2) ๋ถ€์ œ :: Broswer History API๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ํ•˜๊ธฐ  (0) 2020.07.20
[๋ฆฌ์•กํŠธ ๋ถ„์„ํ•˜๊ธฐ] ๋ฆฌ์•กํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ผ์šฐํŒ… ํ•˜๋Š” ๋ฐฉ๋ฒ• (1) ๋ถ€์ œ :: Single Page Application์ด ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ๋ฆฌ์•กํŠธ์—์„œ ์‚ฌ์šฉํ• ๊นŒ?  (2) 2020.07.20
[๋ฆฌ์•กํŠธ ๋ถ„์„ํ•˜๊ธฐ] ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ JSX์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. (๋ถ€์ œ :: ๋ฆฌ์•กํŠธ์—์„œ๋Š” JSX๋ฅผ ์–ด๋–ป๊ฒŒ ์ด์šฉํ• ๊นŒ?)  (0) 2020.07.20

๋Œ“๊ธ€