TIL - 21.07.09 πŸ‘¨β€πŸ’» - React

μ„±ν›ˆΒ·2021λ…„ 7μ›” 9일
0

TIL

λͺ©λ‘ 보기
25/59
post-thumbnail

TIL - 21.07.09 πŸ‘¨β€πŸ’»

React SPA (Single Page Application)

μ‹±κΈ€ νŽ˜μ΄μ§€ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜.
ν•œ νŽ˜μ΄μ§€μ—μ„œ 지지고 λ³Άκ³  ν•˜λŠ” μ›ΉνŽ˜μ΄μ§€λ₯Ό λœ»ν•œλ‹€κ³  μƒκ°ν•˜λ©΄ 될 λ“― ν•˜λ‹€.
쑰금 ν’€μ–΄μ„œ λ§ν•˜λ©΄ μ€‘λ³΅λ˜λŠ” μš”μ†Œκ°€ λ‹€μ‹œ λ‘œλ”©λ¨μœΌλ‘œ μƒκΈ°λŠ” νŠΈλž˜ν”½κ³Ό 느린 νŽ˜μ΄μ§€ μ—…λ°μ΄νŠΈ 속도λ₯Ό 정보가 μ—…λ°μ΄νŠΈ 된 λΆ€λΆ„λ§Œ λ‹€μ‹œ λ‘œλ”©ν•˜λŠ” κ²ƒμœΌλ‘œ ν•΄κ²°ν•œ μ›Ήμ‚¬μ΄νŠΈλ‚˜ μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§ν•œλ‹€.

μž₯μ μœΌλ‘œλŠ”

  1. 전체 νŽ˜μ΄μ§€λ₯Ό μ—…λ°μ΄νŠΈ ν•˜λŠ” 것이 μ•„λ‹Œ 갱신이 ν•„μš”ν•œ λΆ€λΆ„λ§Œ μ—…λ°μ΄νŠΈ ν•˜λ©΄ λ˜κΈ°μ— 더 λΉ λ₯Έ λ°˜μ‘μ„±μ„ 가지고 있으며,

  2. μ„œλ²„ μž…μž₯μ—μ„œλ„ 전체 데이터가 μ•„λ‹Œ μΌλΆ€λ§Œ μ „μ†‘ν•˜λ―€λ‘œ νŠΈλž˜ν”½ λΆ€λΆ„μ—μ„œ 이점이 μžˆλ‹€.

  3. κ·Έλ‘œμΈν•΄ μ΅œμ’…μ μœΌλ‘œ μ›Ή νŽ˜μ΄μ§€, μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ΄μš©ν•˜λŠ” μœ μ €λ“€μ—κ²Œ 더 λ‚˜μ€ κ²½ν—˜μ„ μ œκ³΅ν•  수 μžˆλ‹€.

μž₯점이 있으면 단점도 μžˆλŠ” 법.

  1. λ¦¬μ•‘νŠΈλŠ” λͺ¨λ“  데이터가 JavaScript 파일 μ•ˆμ— μžˆμ–΄μ„œ λ‹Ήμ—°νžˆ js 파일의 크기가 컀지고 κ·Έλ‘œμΈν•΄ 졜초 μ—…λ°μ΄νŠΈμ‹œ μ‹œκ°„μ΄ 많이 μ†Œμš”λœλ‹€.

  2. 검색 엔진 μ΅œμ ν™”μ— 쒋지 μ•Šλ‹€.
    이것 μ—­μ‹œ 데이터가 μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ— μ €μž₯λ˜μ–΄μžˆμ–΄μ„œ μƒκΈ°λŠ” 단점인데, 검색 엔진은 보톡 HTML의 정보λ₯Ό 검색 ν•˜κ²Œ λ˜λŠ”λ° SPAλŠ” μƒμˆ ν•œ 것 처럼 HTMLμ—λŠ” 별 정보가 μ—†κ³  jsνŒŒμΌμ— 데이터가 λ‹΄κ²¨μžˆκΈ°μ— 정보λ₯Ό μ œλŒ€λ‘œ κ²€μƒ‰ν•˜μ§€ λͺ»ν•œλ‹€.
    λ‹€λ§Œ 졜근 검색엔진듀은 κ°œμ„ λ˜κ³ , 되고 μžˆμ–΄μ„œ ν•΄λ‹Ή 단점은 μ‚¬λΌμ§€λŠ” 좔세이닀.


React Router DOM

Routing(λΌμš°νŒ…)μ΄λž€, λ‹€λ₯Έ μ£Όμ†Œμ— 따라 λ‹€λ₯Έ λ·°λ₯Ό λ³΄μ—¬μ£ΌλŠ” 과정을 κ²½λ‘œμ— 따라 λ³€κ²½ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

λ¦¬μ•‘νŠΈμ—μ„œ 주둜 μ‚¬μš©ν•˜λŠ” React Router DOM의 μ£Όμš” μ»΄ν¬λ„ŒνŠΈλŠ” μ„Έκ°€μ§€λ‘œ λ‚˜λˆŒ 수 μžˆλŠ”λ°,

  1. λΌμš°ν„° 역할을 ν•˜λŠ” <BrowserRouter> μ»΄ν¬λ„ŒνŠΈ
  2. 경둜λ₯Ό λ§€μΉ­ν•΄μ£ΌλŠ” <Switch>와 <Route> μ»΄ν¬λ„ŒνŠΈ,
  3. 그리고 맀칭된 경둜둜 νŽ˜μ΄μ§€λ₯Ό μ—°κ²°ν•˜λŠ” <Link> μ»΄ν¬λ„ŒνŠΈ

μ΄λ ‡κ²Œ λ‚˜λ‰œλ‹€.

  • BrowserRouterλŠ” λΌμš°ν„°λ₯Ό μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ μƒμœ„μ—μ„œ κ°μ‹Έκ±°λ‚˜ ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈ μ΅œμƒμœ„μ—μ„œ <BrowserRouter></BrowserRouter> νƒœκ·Έλ‘œ λ‚˜λ¨Έμ§€ νƒœκ·Έλ“€μ„ κ°μ‹Έμ€˜μ•Όν•œλ‹€.

  • Switch μ»΄ν¬λ„ŒνŠΈλŠ” μ—¬λŸ¬ Route μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‹Έμ„œ κ·Έ 쀑 κ²½λ‘œκ°€ μΌμΉ˜ν•˜λŠ” 단 ν•˜λ‚˜μ˜ λΌμš°ν„°λ§Œ λ Œλ”λ§ μ‹œμΌœμ€€λ‹€.
    Switchλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ„ μˆ˜λŠ” μžˆμ§€λ§Œ κ·Έ 경우 λ§€μΉ­λ˜λŠ” λͺ¨λ“  μš”μ†Œλ₯Ό λ Œλ”λ§ν•œλ‹€.

  • Route μ»΄ν¬λ„ŒνŠΈλŠ” path 속성을 μ§€μ •ν•΄μ„œ ν•΄λ‹Ή path에 μ–΄λ–€ μ»΄ν¬λ„ŒνŠΈλ₯Ό 좜λ ₯할지 μ •ν•΄μ£Όκ³  ν›„μˆ ν•  Link μ»΄ν¬λ„ŒνŠΈκ°€ μ •ν•΄μ£ΌλŠ” URL κ²½λ‘œκ°€ μΌμΉ˜ν•  경우 Route μ»΄ν¬λ„ŒνŠΈλ‘œ μ§€μ •ν•œ μ»΄ν¬λ„ŒνŠΈκ°€ ν˜ΈμΆœλœλ‹€.

  • Link μ»΄ν¬λ„ŒνŠΈλŠ” 경둜λ₯Ό μ—°κ²°ν•΄μ£ΌλŠ” 역할을 ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈμ΄λ‹€.
    νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œ λΆˆλŸ¬μ˜€μ§€ μ•Šκ³  앱을 μœ μ§€ν•˜λ©° HTML5 History APIλ₯Ό μ΄μš©ν•΄ νŽ˜μ΄μ§€ μ£Όμ†Œλ§Œ λ°”κΎΈμ–΄ μ€€λ‹€.
    React DOM으둜 λ Œλ”ν•˜λ©΄ Linkμ»΄ν¬λ„ŒνŠΈλŠ” DOMμ—μ„œ aνƒœκ·Έκ°€ λœλ‹€.

μ–΄μ°¨ν”Ό λ°”λ€Œλ©΄ λ­ν•˜λ € Linkλ₯Ό μ“°λ‚˜μš”?

aνƒœκ·ΈλŠ” νŽ˜μ΄μ§€ μ „ν™˜μ‹œ νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œκ³ μΉ¨ν•˜μ§€λ§Œ Link μ»΄ν¬λ„ŒνŠΈλŠ” μƒˆλ‘œκ³ μΉ¨ 방지 κΈ°λŠ₯이 λ‚΄μž₯λ˜μ–΄ μžˆμ–΄ SPA κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.


React Router DOM ν”„λ‘œμ„ΈμŠ€ κ°œκ΄„

import { BrowserRouter, Switch, Route, Link } from 'react-router-dom';


// Home, Page1, Page2 λŠ” μ»΄ν¬λ„ŒνŠΈλ‘œ λ‹€λ₯Έ jsνŒŒμΌμ— μž‘μ„±ν•˜κ³  μž„ν¬νŠΈ λ°›μ•„μ™€μ„œ 써도 λœλ‹€.
// μ‹€μ œλ‘œ κ·Έλ ‡κ²Œ λ§Žμ΄μ“°κ³ 
// Home, Page1, Page2 이 μ„Έ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈμ—μ„œ 뢈러였고 μ‹ΆμœΌλ©΄ 
// μ–˜λ“€λ„ export μ‹œμΌœμ£Όκ³  μ‚¬μš©ν•  μ»΄ν¬λ„ŒνŠΈμ—μ„œ import ν•΄μ£Όλ©΄ λœλ‹€.
const Home = () => {
  return <h1>Home here!</h1>
}

const Page1 = () => {
  return <h1>Page 1 here!</h1>
}

const Page2 = () => {
  return <h1>Page 2 here!</h1>
}

const App = () => {
  return (
    <BrowserRouter>
      <div>
        <ul> 
          // ν•˜κΈ° Link μ»΄ν¬λ„ŒνŠΈμ˜ to 속성 κ°’κ³Ό μΌμΉ˜ν•˜λŠ” path 속성값을 가진 Route μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λœλ‹€.
          <li>
            <Link exact to='/'>Home</Link> 
          </li>
          <li>
            <Link to='/1'>Page 1</Link>
          </li>
          <li>
            <Link to='/2'>Page 2</Link>
          </li>
        </ul>

        <h1>Hello!</h1>
           // Route 듀을 λ¬ΆλŠ”λ‹€. 
        <Switch> 
          // exact 속성을 μ‚¬μš©ν•˜λ©΄ path κ°’κ³Ό μ •ν™•νžˆ μΌμΉ˜ν•˜λŠ” to 속성 값을 가진 Link μ»΄ν¬λ„ŒνŠΈμ™€ λ§€μΉ­λœλ‹€.
          // μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ '/' λ“€μ–΄κ°„κ±° λ‹€ 이 λ…€μ„μ΄λž‘ λ§€μΉ­λœλ‹€.
          // path 값이 '/'인 Route μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°€μž₯ ν•˜λ‹¨μœΌλ‘œ 내리면 없어도 λ˜κΈ΄ν•œλ‹€.
          // 근데 이거 μ“°κ³  μž‘μ„±ν•˜λŠ”κ²Œ 더 보기 νŽΈν•˜λ‹ˆ κ·Έλƒ₯ μ“°μž.
          <Route exact path='/'>
            // Route μ»΄ν¬λ„ŒνŠΈμ— path 속성을 μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ λͺ¨λ“  / 이후에 무슨 λ¬Έμžκ°€ 와도
            // ν•΄λ‹Ή νŽ˜μ΄μ§€λ‘œ λ¦¬λ‹€μ΄λ ‰νŠΈλœλ‹€.
            <Home />
          </Route>
          <Route path='/1'>
            <Page1 />
          </Route>
          <Route path='/2'>
            <Page2 />
          </Route>
        </Switch>
      </div>
    </BrowserRouter>
  )
}
export default App
// default λΆ™μœΌλ©΄ default λ’€μ—μ˜€λŠ” μ»΄ν¬λ„ŒνŠΈ ν•˜λ‚˜λ§Œ export ν•˜λŠ”κ±°κ³ 
// λ‘κ°œ 이상 μ»΄ν¬λ„ŒνŠΈλ₯Ό ν•œ js νŒŒμΌμ—μ„œ export ν•˜λ €λ©΄
export { Home, App }
// μ΄λ ‡κ²Œ μ€‘κ΄„ν˜Έμ¨μ„œ export ν•΄μ£Όλ©΄ λœλ‹€.
export default function ComponetName() {
  return
}
// 이런 μ‹μœΌλ‘œ ν•œλ²ˆμ— 쳐내기도 ν•˜λŠ”λ°
// ν™”μ‚΄ν‘œ ν•¨μˆ˜μ‹ μ“°λ©΄ defalut μ“°λ©΄μ„œ export λͺ¬ν•œλ‹€.
// defalut λΉΌκ³  μ„ μ–Έν•˜κ³  export 해야함.

이벀트 처리

κ°μ§€ν•˜λŠ” μ΄λ²€νŠΈλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ κ°™μœΌλ©°, μ‚¬μš©λ²•μ€ 두가지가 μžˆλ‹€.

  1. exportν•  ν•¨μˆ˜ λ‚΄λΆ€ returnλ¬Έ 밖에 ν•¨μˆ˜ λ§Œλ“€κ³  onClick={function}으둜 μ—°κ²°ν•˜κΈ°.
  2. onClick={() => console.log('some action')} 와 같이 속성 값에 이벀트둜 μ‹€ν–‰ν•  ν•¨μˆ˜ μž…λ ₯ν•˜κΈ°.
  3. 1번과 2번의 ν•˜μ΄λΈŒλ¦¬λ“œλ‘œ ν•¨μˆ˜λ”°λ‘œ λ§Œλ“€κ³  속성 값에 μ—°κ²°ν•œ λ’€ 인자만 λ„˜κ²¨μ£ΌκΈ°.
// 1번
export default function App() {
  const func = () => {
    console.log('It\'s Working!')
  }
  return <button onClick={func}> Hello! </button>
}

// 2번
export default function App() {
  return <button onClick={() => console.log('It\'s Working!')}> Hello! </button>
}

// 3번 
export default function App() {
  const func = () => {
    console.log('It\'s Working!')
  }
  return <button onClick={() => func()}> Hello! </button>
}

// 3λ²ˆμ€ onClick 보단 onKeyupμ΄λ‚˜ onChange κ°™μ€κ±Έλ‘œ ν…μŠ€νŠΈ λ°•μŠ€ κ°’ κ°€μ Έμ˜¬λ•Œ μœ μš©ν•˜λ‹€.

state, useState κ°œκ΄„

  • useStateλŠ” ꡬ쑰 λΆ„ν•΄ 할당을 μ‘μš©ν•œλ‹€.
  • μ‚¬μš©μ „ import { useState } from 'react'둜 useState ν™œμ„±ν™”μ‹œμΌœμ€€λ‹€.
  • λŒ€λž΅μ μΈ 문법은 const [state, setState] = useState(default) 이닀.
  • 0번 μΈλ±μŠ€λŠ” state, λ³€μˆ˜ 자리이고 1번 μΈλ±μŠ€λŠ” stateλ₯Ό λ³€κ²½ν•˜λŠ” ν•¨μˆ˜, setState이닀.
  • setStateλŠ” λ°˜ν™˜ 값을 state에 ν• λ‹Ήν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.
  • stateλŠ” 같은 μ»΄ν¬λ„ŒνŠΈλ₯Ό μ—¬λŸ¬κ°œ 쓰더라도 값이 각각 μ €μž₯λœλ‹€. κ·ΈλŠ” 신인가

props (property) κ°œκ΄„

  • propsλŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό ν˜ΈμΆœν• λ•Œ ν˜ΈμΆœν•˜λŠ” νƒœκ·Έ μ•ˆμ— ν”„λ‘œνΌν‹°ν‚€μ™€ 값을 μž…λ ₯ν•¨μœΌλ‘œμ¨ ν˜ΈμΆœν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ μ•ˆμœΌλ‘œ ν•΄λ‹Ή ν”„λ‘œνΌν‹° 킀와 값을 μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.

  • <App key={value} /> 와 같은 λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•˜λ©° 값을 받은 ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ˜ λ§€κ°œλ³€μˆ˜ μžλ¦¬μ— ν• λ‹Ή 받을 문자λ₯Ό 적으면 ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ‚¬μš©κ°€λŠ₯ν•œ 객체 ν˜•νƒœλ‘œ λ°›λŠ”λ‹€.

  • λ§€κ°œλ³€μˆ˜λŠ” 주둜 propsλ₯Ό μ΄μš©ν•œλ‹€.

  • props의 값은 받은 μ»΄ν¬λ„ŒνŠΈμ—μ„œ μˆ˜μ •ν•  수 μ—†λ‹€.


GOOD πŸ˜‰

λ¦¬μ•‘νŠΈ λΌμš°ν„°, μŠ€ν…Œμ΄νŠΈ, ν”„λ‘­μŠ€, 이벀트 μ“°λŠ” 법을 λŒ€λž΅ μ΅ν˜”λ‹€.
λ¦¬μ•‘νŠΈλž‘ 쑰금 μΉœν•΄μ§„ λŠλ‚Œμ΄λ‹€.

BAD πŸ˜₯

μ–΄λ €μ›Œ

TO DO πŸ”₯

주말에 ν•  것!

  • React
    • λ…Έλ§ˆλ“œμ½”λ“œ λ¦¬μ•‘νŠΈ 클둠코딩
    • μƒν™œμ½”λ”© λ¦¬μ•‘νŠΈ λΆ€λΆ„
    • μ½”λ”©μ•™λ§ˆλ‹˜ κ°•μ’Œ λͺ¨λ‘ 보기
  • μ•Œκ³ λ¦¬μ¦˜ 15 ~ 20

Retrospect 🧐

코린이 μž…μž₯μ—μ„œ 봐도 뭐가 λ­”μ§€λŠ” 잘 λͺ¨λ₯΄κ² μ§€λ§Œ λŒ€μΆ© νŒŒμ•…ν•  수 있게 ν•΄μ£Όκ³ 
데이터도 파일 μ•ˆμ—μ„œ 관리해주고
λͺ¨λ“ˆλ§ˆλƒ₯ μ—¬κΈ° μ €κΈ° μ“Έ 수 있고
.
.
.
λ¦¬μ•‘νŠΈλŠ” 신인가?

Reference πŸ™‡

μ½”λ”©μ•™λ§ˆλ‹˜ 유튜브 - https://www.youtube.com/channel/UCxft4RZ8lrK_BdPNz8NOP7Q
https://developer.mozilla.org/

profile
μ–΄λ–»κ²Œ 이걸 ν’€μ–΄λ‚Ό 수 μžˆμ„κΉŒ

0개의 λŒ“κΈ€