๐Ÿ’› ๋ฆฌ์•กํŠธ SPA 02 (React-router-dom)

leehyunjuยท2021๋…„ 5์›” 3์ผ
0

์ „์— ์‚ฌ์šฉํ•œ ๋ธŒ๋ผ์šฐ์ € ํžˆ์Šคํ† ๋ฆฌ api๋ฅผ ์ด์šฉํ•ด์„œ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์‹ ๊ฒฝ ์“ธ ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด ๋งŽ๊ธฐ์—, react-router-dom์„ ์ด์šฉํ•˜์—ฌ ๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณด์ž. ์ด ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘‰๐Ÿป ์„ค์น˜ ๋ช…๋ น์–ด

npm install react-router-dom

react-router๋Š” ์›น๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฆฌ์•กํŠธ ๋„ค์ดํ‹ฐ๋ธŒ๋„ ์ง€์›ํ•œ๋‹ค. ์œ„์— ์„ค์น˜ํ•œ ํŒจํ‚ค์ง€๋Š” ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์›น์„ ์œ„ํ•œ react-router ํŒจํ‚ค์ง€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ผ์šฐํŒ… ์•ˆ์—์„œ ๋˜ ๋ผ์šฐํŒ… ๊ฐ€๋Šฅํ•˜๋‹ค.

import React from "react";
import { BrowserRouter, Route, Link } from "react-router-dom";
import Rooms from "./Rooms";

export default function RRdom() {
  return (
    <BrowserRouter>
      <div style={{ padding: 20, border: "5px solid gray" }}>
        <Link to="/">ํ™ˆ</Link>
        <br />
        <Link to="/photo">์‚ฌ์ง„</Link>
        <br />
        <Link to="/rooms">๋ฐฉ์†Œ๊ฐœ</Link>
        <br />
        <Route exact path="/" component={Home} />
        <Route path="/photo" component={Photo} />
        <Route path="/rooms" component={Rooms} />
      </div>
    </BrowserRouter>
  );
}

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

function Photo({ match }) {
  return <h2>์ด๊ณณ์€ ํ™ˆํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.</h2>;
}

react-router-dom ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ•ด ๊ฐ์ข… ์ปดํฌ๋„ŒํŠธ๋“ค์„ import ์‹œ์ผฐ๋‹ค. react-router-dom์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ „์ฒด๋ฅผ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ธ์•ผํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฒ„ํŠผ์„ ํ†ตํ•ด ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•  ๋•Œ๋Š” react-router-dom์—์„œ ์ œ๊ณตํ•˜๋Š” Link ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉํ–ˆ๋‹ค. to ์†์„ฑ๊ฐ’์€ ์ด๋™ํ•  ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. react-router-dom์˜ Route ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ ํŽ˜์ด์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค. ํ˜„์žฌ ์ฃผ์†Œ๊ฐ€ path์†์„ฑ์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ ์†์„ฑ๊ฐ’์ด ๊ฐ€๋ฅดํ‚ค๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด, localhost:3000/photo/abc๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ์˜ ์ฃผ์†Œ๊ฐ€ /photo๋กœ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ photo์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง์ด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ localhost:3000/photo123์„ ์ž…๋ ฅํ•˜๋ฉด Photo ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ์Šฌ๋ž˜์‹œ(/) ๋‹จ์œ„๋กœ ๋น„๊ต๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. exact ์†์„ฑ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ๊ทธ ๊ฐ’์ด ์™„์ „ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋œ๋‹ค. ๋งŒ์•ฝ Home ์ปดํฌ๋„ŒํŠธ ๋ถ€๋ถ„์—์„œ exact ์†์„ฑ๊ฐ’์„ ์ž…๋ ฅํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด Home ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ญ์ƒ ๋ Œ๋”๋ง๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  path ์†์„ฑ๊ฐ’์„ ๊ฐ€์ง€๋Š” Route ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ž‘์„ฑํ•ด๋„ ๋œ๋‹ค.

<Route path="/photo" component={Photo} />
<Route path="/photo" component={Rooms} />

์ด์ฒ˜๋Ÿผ ํ˜„์žฌ ์ฃผ์†Œ๊ฐ€ photo๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด ์œ„์— ์„ ์ •๋œ ์ปดํฌ๋„ŒํŠธ photo, rooms ๋‘˜ ๋‹ค ๋ชจ๋‘ ๋ Œ๋”๋ง๋œ๋‹ค.

๐Ÿ‘‰๐Ÿป [Rooms.js]

import React from "react";
import { Route, Link } from "react-router-dom";

const Rooms = ({ match }) => {
return (
  <div>
    <h2>์—ฌ๊ธฐ๋Š” ๋ฐฉ์„ ์†Œ๊ฐœํ•˜๋Š” ํŽ˜์ด์ง€์ž…๋‹ˆ๋‹ค.</h2>
    <Link to={`${match.url}/blueRoom`}>ํŒŒ๋ž€๋ฐฉ</Link>
    <br />
    <Link to={`${match.url}/greenRoom`}>์ดˆ๋ก๋ฐฉ</Link>
    <br />
    <Route path={`${match.url}/:roomId`} component={Room} />
    <Route
      exact
      path={match.url}
      render={() => <h3>๋ฐฉ์„ ์„ ํƒํ•ด ์ฃผ์„ธ์š”.</h3>}
    />
  </div>
);
};

export default Rooms;

function Room({ match }) {
return <h2>{`${match.params.roomId}๋ฐฉ์„ ์„ ํƒํ•˜์…จ์Šต๋‹ˆ๋‹ค.`}</h2>;
}

Rooms ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—๋Š” ๋˜๋‹ค์‹œ ๋ผ์šฐํŒ…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด ์žˆ๋‹ค. Route๋ฅผ ํ†ตํ•ด์„œ ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” match๋ผ๋Š” ์†์„ฑ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. match.url์€ Route ์ปดํฌ๋„ŒํŠธ์˜ path ์†์„ฑ๊ฐ’๊ณผ ๊ฐ™๋‹ค. ๋”ฐ๋ผ์„œ Rooms ์ปดํฌ๋„ŒํŠธ์˜ match.url์€ /rooms์™€ ๊ฐ™๋‹ค. Route์ปดํฌ๋„ŒํŠธ์˜ path ์†์„ฑ๊ฐ’์—์„œ ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ถ”์ถœ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” match.params.{ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„}ํ˜•์‹์œผ๋กœ

match ๊ฐ์ฒด์—๋Š” ์™€ URL์ด ๋งค์นญ๋œ ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์ ธ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ match.params๋กœ path์— ์„ค์ •ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

Match

path : [string] ๋ผ์šฐํ„ฐ์— ์ •์˜๋œ path
url : [string] ์‹ค์ œ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ๋œ url path
isExact : [boolean] true์ผ ๊ฒฝ์šฐ ์ „์ฒด ๊ฒฝ๋กœ๊ฐ€ ์™„์ „ํžˆ ๋งค์นญ๋  ๊ฒฝ์šฐ์—๋งŒ ์š”์ฒญ์„ ์ˆ˜ํ–‰
params : [JSON object] url path๋กœ ์ „๋‹ฌ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ์ฒด



History

length [number] ์ „์ฒด history ์Šคํƒ์˜ ๊ธธ์ด
action [string] ์ตœ๊ทผ์— ์ˆ˜ํ–‰๋œ action (PUSH, REPLACE or POP)
location [JSON object] ์ตœ๊ทผ ๊ฒฝ๋กœ ์ •๋ณด
push(path, [state]) [function] ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋ฅผ history ์Šคํƒ์œผ๋กœ ํ‘ธ์‹œํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์ด๋™
replace(path, [state]) [function] ์ตœ๊ทผ ๊ฒฝ๋กœ๋ฅผ history ์Šคํƒ์—์„œ ๊ต์ฒดํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์ด๋™
go(n) [function] history ์Šคํƒ์˜ ํฌ์ธํ„ฐ๋ฅผ n๋ฒˆ์งธ๋กœ ์ด๋™
goBack() [function] ์ด์ „ ํŽ˜์ด์ง€๋กœ ์ด๋™
goForward() [function] ์•ž ํŽ˜์ด์ง€๋กœ ์ด๋™
block(prompt) [function] history ์Šคํƒ์˜ PUSH/POP ๋™์ž‘์„ ์ œ์–ด

profile
์•„๋Š‘ํ•œ ๋‡Œ๊ณต๊ฐ„ ๐Ÿง 

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