React 7. Router

rachel's blogยท2021๋…„ 10์›” 27์ผ
1

React

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

๐Ÿ“ŒSPA(Single Page Application) : ๋‹จ์ผ ํŽ˜์ด์ง€๋กœ ์ด๋ฃจ์–ด์ง„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

ํ•œ ํŽ˜์ด์ง€๋กœ ์—ฌ๋ ค UI๋“ค์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜.

๐Ÿ“ŒRouter?

  • Routing์„ ํ•ด์ฃผ๋Š” ๋„๊ตฌ
  • route(๋ผ์šฐํŠธ): ๊ฒฝ๋กœ , url ์ฃผ์†Œ
  • CRA๋ฅผ ํ†ตํ•ด์„œ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ SPA๋ฅผ ์ค€์ˆ˜ํ•œ๋‹ค.
    ์ฆ‰, react์—๋Š” ๋‹จ ํ•œ ๊ฐœ์˜ html์ด ์กด์žฌํ•œ๋‹ค.

cf ) ๊ธฐ์กด ์‚ฌ์šฉ ๋ฐฉ์‹(MPA: Multiple Page Application) : ๊ธฐ๋ณธ์ ์œผ๋กœ ์›นํŽ˜์ด์ง€ ๋กœ๋”ฉํ•  ๋•Œ๋Š” index.html์„ ๊ฐ€๋ฅดํ‚ค๊ฒŒ ๋˜์–ด์žˆ๋‹ค.

๐Ÿ“Œ Router ์„ค์น˜

  • Third Party Library : React Router, Sass ๋ฆฌ์•กํŠธ๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ์„ค์น˜๋ฅผ ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    react-router ์„ค์น˜ : npm -install react-router-dom --save

๐Ÿ‘‰ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ• : package.json์˜ dependencies์— react-router-dom์ด ์ƒˆ๋กœ ์ƒ๊ธด๊ฒƒ์„ ํ™•์ธํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

	import React from 'react';
	import {
      BroweserRouter as Router,
      Switch,
      Route
    } from 'react-router-dom';

	import Login from './pages/Login/Login';
	import Signup from './pages/Signup/Signup';
	import Main from './pages/Main/Main';

	class Routes extends React.Component {
      render(){
        	return (
              	<Router>
              			<Nav />
              			<Switch>
              					<Route exact path="/" component={Login} />
									<Route exact path="/signup" component={Signup} />
                             <Route exact path="/main" component={Main] />
                      </Switch>
                           <Footer />
                </Router>
                )
			}
		}

โœ” React-router-dom์—์„œ import ํ•œ ๊ฒƒ : BrowserRouter as Router, Switch, Route

โœ” : ๋ผ์šฐํ„ฐ๋กœ ๊ฐ์‹ธ์ฃผ๊ณ  ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์ง€ ๋ง์ž!

โœ” Reat์—์„œ๋Š” Router๋ฅผ ์จ์•ผ ๋‹ค๋ฅธ UI๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ”exact : ์ •ํ™•ํ•œ ๊ฒฝ๋กœ ์„ค์ •์„ ํ•˜๊ธฐ ์œ„ํ•œ ์žฅ์น˜์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "/signup" ์ด๋ ‡๊ฒŒ ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ, ๊ฒฝ๋กœ๊ฐ€ signup์ผ ๋•Œ๋งŒ ๊ฒฝ๋กœ ์ด๋™์„ ํ•ด์ค˜ ๋ผ๋Š” ๋œป!

๐Ÿ’ก ํ•ญ์ƒ ๊ณ ์ •๋˜์–ด์•ผ ํ•˜๋Š” View๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ??
์Šค์œ„์น˜ ์•ˆ์— ๋“ค์–ด๊ฐ€๋ฉด ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋งŒ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋ฏ€๋กœ Switch ๋ฐ–์— ์œ„์น˜ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ nav, footer๊ฐ€ ์žˆ๋‹ค.

๐Ÿ“Œ Router ์ด๋™

  • ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ view๊ฐ€ ๋˜๊ฒŒ๋” ๋™์ ์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค. (url๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค!)

๋ฐฉ๋ฒ• 1. <Link>์ปดํฌ๋„ŒํŠธ

< Link to ="/main"> main์œผ๋กœ ์ด๋™

๊ฐœ๋ฐœ์ž๋„๊ตฌ์—์„œ ํ™•์ธํ•ด๋ณด๋ฉด aํƒœ๊ทธ๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก ์™œ ๊ทธ๋Ÿผ aํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„๊นŒ?
<a> : ์™ธ๋ถ€ ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
์„œ๋ฒ„์— ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋ฐ›์•„์™€์„œ ์ด๋™ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์„œ๋ฒ„์˜ ์š”์ฒญ์ด ๋งŽ์•„์งˆ ์ˆ˜๋ก ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๊ฒŒ ๋œ๋‹ค. ์ฆ‰ ๋งค๋ฒˆ ์ƒˆ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€์„œ ๊ทธ๋ ค์ง€๊ฒŒ ๋˜๋ฏ€๋กœ ๋น„ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก <Link>๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์—์„œ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
์„œ๋ฒ„์— ๋ณ„๋„์˜ ์š”์ฒญ์„ ํ•  ํ•„์š”๊ฐ€ ์—†๊ณ , ๋‹จ์ˆœํžˆ url๋งŒ ๋ณ€๊ฒฝํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆด ์ผ์ด ์—†๋‹ค.
react-router-dom์ด ์‹ค์ œ ํ™”๋ฉด์—์„œ ๋ณ€ํ™”๋˜์–ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝํ•ด์„œ ๋ณด์—ฌ์ค€๋‹ค.

๐Ÿ’ก SPA์—์„œ๋Š” <Link>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.

this.props.history.push()
์–ด๋–ค ๊ฒฝ์šฐ์— history.push()๋ฅผ ์‚ฌ์šฉํ•  ๊นŒ?
โ†’ js ๋กœ์ง ์†์— ํŽ˜์ด์ง€ ์ด๋™์ด ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ์— ๋งํฌ tag๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋„ฃ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ history.push()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

goMain ํ•จ์ˆ˜ ๋‚ด์— this.props.history.push("/main");์„ ํ†ตํ•ด main ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’ก withRouter๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š”?

export default withRouter(Footer); ๋ฅผ ํ•ด์ค˜์•ผ ์ด๋™์ด ๊ฐ€๋Šฅํ•จ!
โ—error๊ฐ€ ๋‚˜๋ฉด ๋ฌด์กฐ๊ฑด ์ฝ˜์†” ์ฐ์–ด๋ณด๊ธฐ!
โ—โ— ๋ณดํ†ต์€ ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์€ Component์˜ ๊ฒฝ์šฐ withRouter๋ฅผ ์‚ฌ์šฉํ•ด์ค˜์•ผ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ CSS ์ „์ฒ˜๋ฆฌ๊ธฐ์˜ ์—ญํ• 

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ๊ณผ stylesheet๋Š” HTML๊ณผ CSS๋ฟ์ด๋‹ค.
  • sass์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด์„œ cssํŒŒ์ผ์„ scss ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค!
  • ์ „์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ scss๋ฌธ๋ฒ•๊ณผ .scssํ™•์žฅ์ž๋ช…์„ .css๋กœ ๋ฐ”๊พธ๋ฉด์„œ css๋ฌธ๋ฒ•์— ๋งž๊ฒŒ๋” ์ „ํ™˜ํ•ด์ฃผ๋Š” ์ž‘์—…

๐Ÿ’ก ๋‚ด ์ž‘์—… ํŒŒ์ผ์—์„œ .css โ†’ .scss๋กœ ํ™•์žฅ์ž๋ช…์„ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ, position์˜ layout์ด ๊นจ์ง€๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ญ˜๊นŒ??

  • ๋‹จ ํ•˜๋‚˜์˜ css ํด๋”์— ๋ชฐ๋ฆฌ๊ฒŒ ๋˜๋ฉด์„œ position์ด ์ „๋ถ€ ๊ผฌ์ด๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. tagName์œผ๋กœ style์„ ์ฃผ์—ˆ๊ฑฐ๋‚˜, ๋™์ผํ•œ ํด๋ž˜์Šค๋ช…์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์„ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฉด, ๊ฒน์น˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด
    nesting์„ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ“Œ ๋ผ์šฐํ„ฐ ์„ค์น˜ ์‹œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋“ค

โœ… ์ฒดํฌํ•  ์‚ฌํ•ญ ํ™•์ธํ•˜๊ธฐ

  • import { withRouter } from 'react-router-dom;' ์ด ๋ˆ„๋ฝ๋˜์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•˜์ž!
    import๋ถ€ํ„ฐ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฒŒ ๋˜๋ฉด ํ™”๋ฉด ๊ตฌํ˜„์ด ์•„์˜ˆ ๋˜์ง€ ์•Š๋Š”๋‹ค!

  • import { TRUE } from 'node-sass' : ์ž๋™์ƒ์„ฑ๋˜๋Š” ์ฝ”๋“œ์ด๋ฏ€๋กœ ํ™•์ธํ•ด์„œ ์‚ญ์ œํ•˜๋„๋ก ํ•˜์ž!

  • Nav ๊ฒฝ๋กœ ๋ฌธ์ œ : Nav ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋“ค์˜ ๊ฒฝ๋กœ ์„ค์ •์„ ์ฒดํฌํ•ด๋ณด์ž!

  • <Link>๋ฅผ ์จ์„œ ๋กœ๊ทธ์ธ์ฐฝ์—์„œ ๋ฉ”์ธ์œผ๋กœ ์ด๋™ํ•˜๋ ค๊ณ  ํ•  ๊ฒฝ์šฐ, ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋–„ ๊ตฌํ˜„๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ƒฅ ๋ฒ„ํŠผ๋งŒ ๋ˆ„๋ฅด๋ฉด ๊ตฌํ˜„์€ ๋จ โ†’ this.props.historyl.push('/main')์ด ๋ฐฉ๋ฒ•์œผ๋กœ button์— onClick์„ ์ฃผ๋ฉด ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ชจ๋‘ ์ž…๋ ฅํ•˜๊ณ  ๋ฒ„ํŠผ์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋ฉ”์ธ์œผ๋กœ ๋„˜์–ด๊ฐ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

[์ฐธ๊ณ ์‚ฌํ•ญ]
โœ” history : history ๊ฐ์ฒด๋Š” ๋ผ์šฐํŠธ๋กœ ์‚ฌ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ์— match, location๊ณผ ํ•จ๊ป˜ ์ „๋‹ฌ๋˜๋Š” props ์ค‘์— ํ•˜๋‚˜๋‹ค. ์ด ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ๊ตฌํ˜„ํ•˜๋Š” ๋ฉ”์„œ๋“œ์—์„œ ๋ผ์šฐํ„ฐ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
ํŠน์ • ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋’ค๋กœ ๊ฐ€๊ฑฐ๋‚˜, ๋กœ๊ทธ์ธ ํ›„ ํ™”๋ฉด์„ ์ „ํ™˜ํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ดํƒˆํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•  ๋•Œ history ํ™œ์šฉ
โœ” withRouter : HoC(Higer-order Component)
๋ผ์šฐํŠธ๋กœ ์‚ฌ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹ˆ์–ด๋„ match, location, history ๊ฐ์ฒด๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

profile
๋ธ”๋กœ๊ทธ ์ด์ „ : https://rachelslab.tistory.com/

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