TIL_39_with Wecode 029 React

JIEUNΒ·2021λ…„ 3μ›” 3일
0
post-thumbnail

πŸ™‚ index.html
public 폴더에 μžˆλ‹€. 메인 ν”„λ‘œκ·Έλž¨μΈ index.js에 λŒ€μ‘λ˜λŠ” κ²ƒμœΌλ‘œ, HTML ν…œν”Œλ¦Ώ νŒŒμΌμ΄λ‹€. 이 파일이 직접 ν‘œμ‹œλ˜λŠ” 것은 μ•„λ‹ˆκ³ , index.js에 μ˜ν•΄ 일어 μ™€μ„œ λ Œλ”λ§λœ κ²°κ³Όκ°€ ν‘œμ‹œλœλ‹€. μœ μΌν•œ html 이닀.
πŸ™‚ index.js
src 폴더에 ν¬ν•¨λ˜μ–΄ μžˆλ‹€. 메인 ν”„λ‘œκ·Έλž¨μ΄λΌκ³  ν•  수 μžˆλ‹€. μ—¬κΈ°μ—μ„œ HTML ν…œν”Œλ¦Ώ 및 JavaScript의 μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‘°ν•©ν•˜μ—¬ λ Œλ”λ§ν•˜κ³  μ‹€μ œ ν‘œμ‹œν•œλ‹€.
πŸ™‚ App.js
src 폴더에 μžˆλ‹€. 이것은 μ»΄ν¬λ„ŒνŠΈλ₯Ό μ •μ˜ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€. μ‹€μ œλ‘œ 화면에 ν‘œμ‹œλ˜λŠ” λ‚΄μš© 등은 μ—¬κΈ°μ—μ„œ μ •μ˜λœλ‹€.

SPA?
Single Page Application (μ‹±κΈ€ νŽ˜μ΄μ§€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜) 의 μ•½μž. μš°λ¦¬λŠ” μΈμŠ€νƒ€κ·Έλž¨μ„ ν΄λ‘ ν•˜λ©΄μ„œ 둜그인 νŽ˜μ΄μ§€μ—μ„œ ν•˜λ‚˜μ˜ νŽ˜μ΄μ§€, 그리고 메인 νŽ˜μ΄μ§€μ—μ„œ 또 ν•˜λ‚˜μ˜ νŽ˜μ΄μ§€κ°€ μ‘΄μž¬ν–ˆλ‹€. ν•˜μ§€λ§Œ λ¦¬μ•‘νŠΈμ—λŠ” html이 단 ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•˜κ³ , κ·Έ ν•˜λ‚˜μ˜ νŽ˜μ΄μ§€μ— 둜그인 κ³Ό 메인 두 νŽ˜μ΄μ§€λ₯Ό λ³΄μ—¬μ€˜μ•Ό ν•œλ‹€. μ‹€μ œλ‘œ μš°λ¦¬κ°€ ν”νžˆ λ³΄λŠ” μ›Ήμ‚¬μ΄νŠΈλ“€ λ˜ν•œ ν•˜λ‚˜μ˜ νŽ˜μ΄μ§€μ— μ—¬λŸ¬κ°€μ§€λ₯Ό 보여주고 μžˆλ‹€.

κ·Έλž˜μ„œ ν•„μš”ν•œ 것이 react-router 이닀.
λΌμš°νŒ…(Routing)μ΄λž€ λ‹€λ₯Έ 경둜(url μ£Όμ†Œ)에 따라 λ‹€λ₯Έ View(ν™”λ©΄)λ₯Ό λ³΄μ—¬μ£ΌλŠ” 것이닀. 즉, ν•œκ°œμ˜ μ›ΉνŽ˜μ΄μ§€ μ•ˆμ—μ„œ μ—¬λŸ¬ 개의 νŽ˜μ΄μ§€λ₯Ό λ³΄μ—¬μ£ΌλŠ” 것이닀. λ¦¬μ•‘νŠΈ μžμ²΄μ—λŠ” 이런 κΈ°λŠ₯이 λ‚΄μž₯λ˜μ–΄ μžˆμ§€ μ•Šλ‹€. κ·Έλž˜μ„œ λ¦¬μ•‘νŠΈκ°€ ν”„λ ˆμž„μ›Œν¬κ°€ μ•„λ‹ˆλΌ 라이브러리둜 λΆ„λ₯˜λ˜λŠ” 이유 쀑 ν•˜λ‚˜λ‹€. (ν”„λ ˆμž„μ›Œν¬λŠ” λ‚΄μž₯λ˜μ–΄μžˆλŠ” κΈ°λŠ₯이 λ§Žμ•„μ„œ ν”„λ ˆμž„μ›Œν¬κ°€ 개발자λ₯Ό μ œμ–΄ν•˜λ©°, κ°œλ°œμžλŠ” ν”„λ ˆμž„μ›Œν¬ λ‚΄μ—μ„œ 움직여야 ν•œλ‹€. κ·ΈλŸ¬λ‚˜ λΌμ΄λΈŒλŸ¬λ¦¬λŠ” ν”„λ ˆμž„μ›Œν¬ λ°–μ—μ„œ 움직일 수 있으며 μ œμ–΄μ˜ 주체가 κ°œλ°œμžλ‹€. )

μ—¬κΈ°μ„œ 잠깐, react-router λŠ” μ¨λ“œνŒŒν‹° λΌμ΄λΈŒλŸ¬λ¦¬μ΄λ‹€. μ¨λ“œνŒŒν‹° 라이브러리? 개인 κ°œλ°œμžλ‚˜ ν”„λ‘œμ νŠΈ νŒ€, ν˜Ήμ€ μ—…μ²΄λ“±μ—μ„œ κ°œλ°œν•˜λŠ” 라이브러리이며 즉 제 3자 라이브러리λ₯Ό λœ»ν•œλ‹€. μ œμž‘μ‚¬μ—μ„œ λ§Œλ“ κ²ƒμ΄ μ•„λ‹ˆλΌ λ‹€λ₯Έ μ—…μ²΄μ—μ„œ λ§Œλ“  ν•΄λ‹Ή 툴 지원 라이브러리λ₯Ό 가리킨닀. μ œμ‘°μ‚¬μ™€ μ‚¬μš©μž μ΄μ™Έμ˜ μ™ΈλΆ€μ˜ μƒμ‚°μžλ₯Ό λ§ν•œλ‹€.

react-router μ„€μΉ˜

npm install react-router-dom --save

Routes μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„ν•˜κΈ°
src 폴더에 Routes.js νŒŒμΌμ„ λ§Œλ“€μ–΄μ€€λ‹€.

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>
        <Switch>
          <Route exact path="/" component={Login} />
	  <Route exact path="/signup" component={Signup}/>
          <Route exact path="/main" component={Main} />
        </Switch>
      </Router>
    )
  }
}
export default Routes;


λ‚˜λŠ” 둜그인과 λ©”μΈνŽ˜μ΄μ§€μ— μ ‘κ·Όν–ˆλ‹€. μ—¬κΈ°μ„œ 16번째, 17번째 라인의 exact의 μ€‘μš”μ„±: ν•˜λ‚˜μ˜ νŽ˜μ΄μ§€ μ•ˆμ—μ„œ μš°λ¦¬λŠ” μ£Όμ†Œμ°½μ— 둜그인과 메인 κ²½λ‘œμ— 각각 μ ‘κ·Όν•΄μ•Όν•œλ‹€. 이 λ•Œ exact λ₯Ό 써주지 μ•ŠμœΌλ©΄ μ»΄ν“¨ν„°λŠ” 둜그인 νŽ˜μ΄μ§€ μ£Όμ†Œ "/" 와 메인 νŽ˜μ΄μ§€ μ£Όμ†Œ "/main"을 μ œλŒ€λ‘œ κ΅¬λΆ„ν•˜μ§€ λͺ»ν•˜κ³  νŽ˜μ΄μ§€κ°€ λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€. κ·Έ μ΄μœ λŠ” "/main" μ£Όμ†Œ μ•ˆμ— 같은 μŠ¬λž˜μ‹œκ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— μŠ¬λž˜μ‹œλ§Œ 보고 같은 μ£Όμ†ŒλΌκ³  μƒκ°ν•˜κΈ° λ•Œλ¬Έ. κΌ­ exactλ₯Ό 써주도둝 ν•˜μž.

그리고 또 ν•˜λ‚˜, 상단에 import에 μ“°μ—¬μ§„ μˆœμ„œλŒ€λ‘œ return μ•ˆμ—μ„œ 같은 μˆœμ„œλŒ€λ‘œ μ“°μ˜€μŒμ„ 확인할 수 μžˆλ‹€. 가독성을 μœ„ν•΄μ„œ μ“°μ—¬μ§„ μˆœμ„œλŒ€λ‘œ μ‚¬μš©λ˜μ–΄μ§€λŠ” μˆœμ„œλŒ€λ‘œ 쓰도둝 ν•˜μž.

import? : κ°€μ Έμ˜€κΈ°
"κ°€μ Έμ˜€κΈ°"λŠ” λ‹€λ₯Έ μ‘μš©ν”„λ‘œκ·Έλž¨μ— μ˜ν•΄ μƒμ‚°λœ 데이터λ₯Ό μ‚¬μš©ν•˜λŠ” 것. μ™ΈλΆ€ 데이터λ₯Ό κ°€μ Έμ™€μ„œ μ‚¬μš©ν•˜λŠ” 것이닀.
export? : 내보내기
ν•œ μ‘μš©ν”„λ‘œκ·Έλž¨μš©μœΌλ‘œ μž‘μ„±λœ 데이터λ₯Ό λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ 파일 ν˜•μ‹μ„ λ°”κΎΈμ–΄ μ €μž₯ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. export 문은 JavaScript λͺ¨λ“ˆμ—μ„œ ν•¨μˆ˜, 객체, μ›μ‹œ 값을 내보낼 λ•Œ μ‚¬μš©ν•œλ‹€. 내보낸 값은 λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œ import 문으둜 κ°€μ Έκ°€ μ‚¬μš©ν•  수 μžˆλ‹€.

index.js

ReactDOM.render(<Routes />, 
document.getElementById('root'));
  • ν˜„μž¬ ν™”λ©΄μ—λŠ” <App /> μ»΄ν¬λ„ŒνŠΈκ°€ 보여지고 μžˆμŠ΅λ‹ˆλ‹€. (λ˜λŠ” Login μ»΄ν¬λ„ŒνŠΈ, Main μ»΄ν¬λ„ŒνŠΈ)
  • CRA둜 λ§Œλ“  앱에 routing κΈ°λŠ₯을 μ μš©ν•˜λ €λ©΄ index.js λ₯Ό μˆ˜μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • <App /> μ»΄ν¬λ„ŒνŠΈ λŒ€μ‹ μ— routing을 μ„€μ •ν•œ μ»΄ν¬λ„ŒνŠΈ(<Routes />)둜 λ³€κ²½ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    Route μ΄λ™ν•˜κΈ°
    Route μ΄λ™ν•˜λŠ” 방법은 두 κ°€μ§€
  1. μ»΄ν¬λ„ŒνŠΈ μ‚¬μš©ν•˜λŠ” 방법
  2. withRouterHOC 둜 κ΅¬ν˜„ν•˜λŠ” 방법 μ»΄ν¬λ„ŒνŠΈ μ‚¬μš©ν•˜λŠ” 방법
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;

예λ₯Ό λ“€μ–΄, μš°λ¦¬λŠ” Login.js의 html μ½”λ“œ μ•ˆμ— 둜그인 λ²„νŠΌμ— 링크λ₯Ό κ±Έμ–΄λ†“μœΌλ©΄ λœλ‹€. 둜그인 λ²„νŠΌμ„ ν†΅ν•΄μ„œ 메인 νŽ˜μ΄μ§€λ‘œ μ „ν™˜λ  수 μžˆλ„λ‘.

  • Routes.js μ—μ„œ μ„€μ •ν•œ path둜 μ΄λ™ν•˜λŠ” 첫 번째 방법은 <Link> μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
  • react-router-dom μ—μ„œ μ œκ³΅ν•˜λŠ” <Link> μ»΄ν¬λ„ŒνŠΈλŠ” DOMμ—μ„œ <a> 둜 λ³€ν™˜(Compile) λ©λ‹ˆλ‹€.
  • cf) JSX - Babel - JavaScript
  • <a> νƒœκ·Έμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ <Link> νƒœκ·Έλ„ μ§€μ •ν•œ 경둜둜 λ°”λ‘œ μ΄λ™μ‹œμΌœμ£ΌλŠ” κΈ°λŠ₯을 ν•©λ‹ˆλ‹€.
  • cf) <a> vs. <Link>
    • <a> - μ™ΈλΆ€ μ‚¬μ΄νŠΈλ‘œ μ΄λ™ν•˜λŠ” 경우
    • <Link> - ν”„λ‘œμ νŠΈ λ‚΄μ—μ„œ νŽ˜μ΄μ§€ μ „ν™˜ν•˜λŠ” 경우

withRouterHOC 둜 κ΅¬ν˜„ν•˜λŠ” 방법

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) 에 μ ‘κ·Όν•΄μ„œ 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • console.log둜 this.props.history에 μ–΄λ–€ 정보듀이 담겨 μžˆλŠ”μ§€ ν•œ 번 확인 ν•΄λ³΄μ„Έμš” :)
  • 받은 history의 push λ©”μ„œλ“œμ˜ 인자둜 Routes.js μ—μ„œ μ„€μ •ν•œ pathλ₯Ό λ„˜κ²¨μ£Όλ©΄, ν•΄λ‹Ή 라우트둜 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 이 μ»΄ν¬λ„ŒνŠΈ(Login μ»΄ν¬λ„ŒνŠΈ)μ—μ„œ props에 route 정보(history)λ₯Ό λ°›μœΌλ €λ©΄ exportν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμ—Β withRouter둜 감싸주어야 ν•©λ‹ˆλ‹€.
  • μ΄λ ‡κ²Œ withRouter 와 같이 ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°μ‹Έμ£ΌλŠ” 것을 Higher Order Component (μ΄ν•˜ HOC) 라고 ν•©λ‹ˆλ‹€.

    goToMain ν•¨μˆ˜μ•ˆμ„ λ΄μ£Όμ„Έμš©
    μ•„λž˜ html μ½”λ“œμ—μ„œ λ²„νŠΌ 뢀뢄을 보면 onClick λ©”μ†Œλ“œμ— μœ„μ—μ„œ μ •μ˜ν•œ ν•¨μˆ˜λ₯Ό μ§€μ •ν•΄μ€€ 것을 확인할 수 μžˆλ‹€.


    export default withRouter(Login);

두 κ°€μ§€ λ°©λ²•μ˜ ν™œμš©λ²•
1.
- 클릭 μ‹œ λ°”λ‘œ μ΄λ™ν•˜λŠ” 둜직 κ΅¬ν˜„ μ‹œμ— μ‚¬μš©ν•©λ‹ˆλ‹€.
- ex. Nav Bar, Aside Menu, μ•„μ΄ν…œ 리슀트 νŽ˜μ΄μ§€μ—μ„œ μ•„μ΄ν…œ 클릭 μ‹œ > 상세 νŽ˜μ΄μ§€λ‘œ 이동
2. withRouterHOC
- νŽ˜μ΄μ§€ μ „ν™˜ μ‹œ μΆ”κ°€λ‘œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” 둜직이 μžˆλŠ” 경우 withRouterHOC λ°©λ²•μœΌλ‘œ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
- ex. 둜그인 λ²„νŠΌ 클릭 μ‹œ
- Backend API둜 데이터(User Info) 전솑
- User Data 인증 / 인가
- response message
- Case 1 : νšŒμ› κ°€μž…λ˜μ–΄ μžˆλŠ” μ‚¬μš©μž > Main νŽ˜μ΄μ§€λ‘œ 이동
- Case 2 : νšŒμ› κ°€μž…μ΄ λ˜μ–΄ μžˆμ§€ μ•Šμ€ μ‚¬μš©μž > Signup νŽ˜μ΄μ§€λ‘œ 이동



쑰건문을 아직 μ£Όμ§€ μ•Šμ•„μ„œ λ²„νŠΌλ§Œ λˆŒλŸ¬λ„ λ©”μΈνŽ˜μ΄μ§€λ‘œ λ„˜μ–΄κ°„λ‹€.

0개의 λŒ“κΈ€