๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
JavaScript/React

[React] ๋ผ์šฐํŒ…(Routing)์ด๋ž€?

by ์ฝ”๋”ฉํ•˜๋Š” ๋ถ•์–ด 2021. 11. 24.
๋ฐ˜์‘ํ˜•

๐Ÿฟ ๋ผ์šฐํŒ…(Routing)์ด๋ž€?

๋‹ค๋ฅธ ๊ฒฝ๋กœ(url ์ฃผ์†Œ)์— ๋”ฐ๋ผ ๋‹ค๋ฅธ View(ํ™”๋ฉด)๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ

  • React ์ž์ฒด์—๋Š” ์ด๋Ÿฐ ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. (์ด๊ฒƒ์ด React๊ฐ€ Framework ๊ฐ€ ์•„๋‹Œ Library ๋กœ ๋ถ„๋ฅ˜๋˜๋Š” ์ด์œ )
  • ๊ทธ๋ž˜์„œ React์˜ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” React-router๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.



 

๐Ÿฟ ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ(React Router)๋ž€?

angular์ด๋‚˜ angular2, backbone ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋“ค์–ด์žˆ๋‹ค. ํ•˜์ง€๋งŒ React๋Š” View๋งŒ ๋‹ด๋‹นํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ๊ทธ๋ž˜์„œ ๋ผ์šฐํŒ…์„ ๋‹ด๋‹นํ•˜๋Š” react-router์„ ๋”ฐ๋กœ ์„ค์น˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ ๋‚˜์ค‘์— Model๊ณผ Controller๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์›๋ž˜๋Š” ํŽ˜์ด์ง€์— ๋”ฐ๋ผ์„œ url link๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ SPA๋Š” ๊ตฌ์กฐ์ƒ ๋‹จ์ผ ํŽ˜์ด์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์—ฌ์ง€๋Š” ํŽ˜์ด์ง€ ๋ชจ์Šต์€ ๋‹ฌ๋ผ์ ธ๋„ ์ฃผ์†Œ๋Š” ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ ๋“ฑ์žฅํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ React Router์ด๋‹ค.



 

๐ŸฟReact Router ์ ์šฉํ•˜๋Š” ๋ฒ•

 

๐Ÿ”ฅ ์„ค์น˜ ํ•˜๋Š” ๋ฒ•

1. ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ๋Š”๋‹ค๐Ÿ‘‡๐Ÿ‘‡

npm install react-router-dom --save

 

์„ค์น˜ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด package.json ํŒŒ์ผ์— 'react-router-dom'์ด๋ผ๋Š” ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค.

 

2. Routes ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ

import React from 'react';
import {
  BrowserRouter 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>
    );
  }
}

export default Routes;

 

3. index.js ๋ณ€๊ฒฝ

ReactDOM.render(<Routes />, document.getElementById('root'));

์›๋ž˜๋Š” ์ €๊ธฐ <Routes /> ๋ถ€๋ถ„์ด <App />๋กœ ๋˜์–ด์žˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค. ๋ณ€๊ฒฝํ•ด์ค์‹œ๋‹ค!


4. Route ์ด๋™ํ•˜๊ธฐ

Route๋ฅผ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • ํด๋ฆญ ์‹œ ๋ฐ”๋กœ ์ด๋™ํ•˜๋Š” ๋กœ์ง ๊ตฌํ˜„ ์‹œ์— ์‚ฌ์šฉํ•œ๋‹ค.
    ex) Nav Bar, Aside Menu, ์•„์ดํ…œ ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€์—์„œ ์•„์ดํ…œ ํด๋ฆญ ์‹œ > ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™.
  • react-router-dom์—์„œ ์ œ๊ณตํ•˜๋Š” <Link> ์ปดํฌ๋„ŒํŠธ๋Š” DOM์—์„œ <a> ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
    cf) <a> vs <Link>
    • <a> : ์™ธ๋ถ€ ์‚ฌ์ดํŠธ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ
    • <Link> : ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ํŽ˜์ด์ง€ ์ „ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ
import React from 'react';
import { Link } from 'react-router-dom';

class Login extends React.Component {
  render() {
    return (
      <div>
        <Link to="/signup">ํšŒ์›๊ฐ€์ž…</Link>
      </div>
    )
  }
}

export default Login;

 

๐Ÿฅ– withRouterHOC๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

  • ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ์ถ”๊ฐ€๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋กœ์ง์ด ์žˆ๋Š” ๊ฒฝ์šฐ withRouterHOC ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
    ex) ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ
    • Backend API๋กœ ๋ฐ์ดํ„ฐ ์ „์†ก
    • User Data ์ธ์ฆ/์ธ๊ฐ€
    • response message
    • Case 1 : ํšŒ์› ๊ฐ€์ž…๋˜์–ด ์žˆ๋Š” ์‚ฌ์šฉ์ž > Main ํŽ˜์ด์ง€๋กœ ์ด๋™
    • Case 2 : ํšŒ์› ๊ฐ€์ž…์ด ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์‚ฌ์šฉ์ž > Signup ํŽ˜์ด์ง€๋กœ ์ด๋™
import React from 'react';
import { withRouter } from 'react-router-dom';

class Login extends React.Component {

  goToMain = () => {
    this.props.history.push('/main');
  }

  // ์‹ค์ œ ํ™œ์šฉ ์˜ˆ์‹œ
  // goToMain = () => {
  //   if(response.message === "valid user"){
  //     this.props.history.push('/main');
  //   } else {
  //     alert("๋„ˆ ์šฐ๋ฆฌ ํšŒ์› ์•„๋‹˜. ๊ฐ€์ž… ๋จผ์ € ํ•ด์ฃผ์„ธ์š”")
  //     this.props.history.push('/signup');
  //   }
  // }

  render() {
    return (
      <div>
        <button
          className="loginBtn"
          onClick={this.goToMain}
        >
          ๋กœ๊ทธ์ธ
        </button>
      </div>
    )
  }
}

export default withRouter(Login);
  • <Link /> ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์š”์†Œ์— onClick ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.
  • goToMain ๋ผ๋Š” event handler์—์„œ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ props ๊ฐ์ฒด์˜ history (this.props.history)์— ์ ‘๊ทผํ•ด์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ›์€ history์˜ push ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ Routes.js ์—์„œ ์„ค์ •ํ•œ path๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด, ํ•ด๋‹น ๋ผ์šฐํŠธ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ์ปดํฌ๋„ŒํŠธ(Login ์ปดํฌ๋„ŒํŠธ)์—์„œ props์— route ์ •๋ณด(history)๋ฅผ ๋ฐ›์œผ๋ ค๋ฉด exportํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ withRouter๋กœ ๊ฐ์‹ธ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    ์ด๋ ‡๊ฒŒ withRouter ์™€ ๊ฐ™์ด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ์‹ธ์ฃผ๋Š” ๊ฒƒ์„ HOC(Higher Order Component) ๋ผ๊ณ  ํ•œ๋‹ค.
๋ฐ˜์‘ํ˜•

'JavaScript > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] 10๊ฐ€์ง€ Hooks  (0) 2021.11.24
[React] React๋ž€?  (0) 2021.11.18
[React] State & Event  (0) 2021.11.18
[React] Props & Event  (0) 2021.11.18
[React] map ํ•จ์ˆ˜ ์ ์šฉ์‹œ key props๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ์ด์œ   (0) 2021.11.18

๋Œ“๊ธ€