TIL - 21.07.09 ๐Ÿ‘จโ€๐Ÿ’ป - React

21519 ๋‹จ์–ด ReactTILReact

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/

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ