๐Ÿ“˜React ๊ธฐ์ดˆ ์ •๋ฆฌ

@leekh8 ยท May 01, 2023 ยท 8 min read

React ๊ธฐ์ดˆ ์ •๋ฆฌ ๐Ÿ“˜

React๋Š” ์›น ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์— ํ˜์‹ ์„ ๊ฐ€์ ธ์˜จ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

React์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ์™œ React๋ฅผ ๋ฐฐ์›Œ์•ผ ํ•˜๋Š”์ง€, React์˜ ํŠน์ง•, JSX์˜ ํ™œ์šฉ, SPA์˜ ๊ฐœ๋…, JSX์™€ ์ผ๋ฐ˜ JavaScript์˜ ์ฐจ์ด์ , Component์˜ ๊ฐœ๋…๊ณผ ํ™œ์šฉ, Component์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•๋“ฑ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

React๋ž€? ๐Ÿค”

  • ์ •์˜: React๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. Facebook์—์„œ ๊ฐœ๋ฐœํ•˜์˜€๊ณ , ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ๊ฐœ๋ฐœ์„ ์ง€ํ–ฅํ•œ๋‹ค.1
  • ํŠน์ง•:
    • Component: ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์–ด ๊ตฌํ˜„๋˜๋ฉฐ, ๋ ˆ๊ณ  ๋ธ”๋Ÿญ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์กฐ๋ฆฝํ•˜์—ฌ ํ•œ ํŽ˜์ด์ง€๋ฅผ ์™„์„ฑํ•œ๋‹ค.
    • Virtual DOM: ๊ฐ€์ƒ์˜ DOM์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ , ์‹ค์ œ DOM๊ณผ ๋™๊ธฐํ™”ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…. ์ด๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
    • JSX: JavaScript ๋‚ด์—์„œ HTML๊ณผ ์œ ์‚ฌํ•œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ UI๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ๊ฐœ๋ฐœ์ž๋Š” ๋ณด๋‹ค ์ง๊ด€์ ์œผ๋กœ UI๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

SPA (Single Page Application)์™€ ์ „ํ†ต์ ์ธ ์‚ฌ์ดํŠธ ๋น„๊ต ๐Ÿ”„

  • ์ „ํ†ต์ ์ธ ์‚ฌ์ดํŠธ: ํŽ˜์ด์ง€ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์— ์š”์ฒญํ•˜์—ฌ ์ƒˆ๋กœ์šด HTML์„ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹. ์ด ๊ณผ์ •์—์„œ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

    ServerClientServerClient์ตœ์ดˆ ์ ‘์† ์š”์ฒญHTML ์ „๋‹ฌ๋ฐ์ดํ„ฐ ์ „๋‹ฌ (Form Post)HTML ์ „๋‹ฌ

  • SPA: ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML์„ ๋ฐ›์•„์˜จ ํ›„, ์ดํ›„์˜ ํŽ˜์ด์ง€ ๋ณ€๊ฒฝ์€ AJAX ํ†ต์‹ ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ JSON ํ˜•ํƒœ๋กœ ๋ฐ›์•„์™€์„œ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ Œ๋”๋งํ•œ๋‹ค. ์ด ๋ฐฉ์‹์€ React๋ฅผ ํฌํ•จํ•œ ํ˜„๋Œ€์ ์ธ JavaScript ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋œ๋‹ค.

    ServerClientServerClient์ตœ์ดˆ ์ ‘์† ์š”์ฒญHTML ์ „๋‹ฌ๋ฐ์ดํ„ฐ ์ „๋‹ฌ (AJAX ํ†ต์‹ )JSON ์ „๋‹ฌ

React๋ฅผ ๊ณต๋ถ€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ  ๐Ÿš€

  • ์ƒ์‚ฐ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ: ์ปดํฌ๋„ŒํŠธ์™€ Hook์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ณ , ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  • ํ’๋ถ€ํ•œ ์ž๋ฃŒ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: React๋Š” ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ์ž๋ฃŒ์™€ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ฒ˜: React๋ฅผ ๋ฐฐ์šฐ๋ฉด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ React Native๋ฅผ ํ†ตํ•ด ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—๋„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

React๋ฅผ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์€ ํ˜„๋Œ€ ์›น ๊ฐœ๋ฐœ์˜ ํŠธ๋ Œ๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋Š” ๋ฐ ์žˆ์–ด ํ•„์ˆ˜์ ์ธ ์š”์†Œ๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—, ๊ธฐ๋ณธ์ ์ธ JavaScript ์ง€์‹์„ ๊ฐ–์ถ”๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. React์˜ ์„ธ๊ณ„๋กœ! ๐ŸŒŸ

React์˜ ํ•ต์‹ฌ ํŠน์ง• ์ •๋ฆฌ ๐ŸŒŸ

React๋Š” ํ˜„๋Œ€ ์›น ๊ฐœ๋ฐœ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. React์˜ ์ฃผ์š” ํŠน์ง•๋“ค์„ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.2

HTML๊ณผ JS ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ๐Ÿ“

  • ์ „ํ†ต์ ์ธ ๋ฐฉ์‹ (jQuery ์‚ฌ์šฉ ์˜ˆ): HTML ์š”์†Œ๋ฅผ JavaScript๋กœ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹. ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

    $("#todo-list").append(
      "<li><span>" +
        value +
        "</span><button type='button' class='complete'>complete</button> <button type='button' class='delete'>delete</button></li>"
    )
  • React ๋ฐฉ์‹ (JSX ์‚ฌ์šฉ ์˜ˆ): HTML๊ณผ JavaScript๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ UI๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.

    <ol id="todo-list">
      {todoList.map((item, index) => (
        <li className={item.isCompleted ? "completed" : ""}>
          <span>{item.value}</span>
          <button onClick={() => handleCompleteClick(index)}>complete</button>
          <button onClick={() => handleDeleteClick(index)}>delete</button>
        </li>
      ))}
    </ol>

Component ๊ธฐ๋ฐ˜ ๊ฐœ๋ฐœ ๐Ÿ› ๏ธ

  • React๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋œ๋‹ค. ๊ฐ ์ปดํฌ๋„ŒํŠธ๋Š” ๋…๋ฆฝ์ ์ธ ๋‹จ์œ„๋กœ, ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ณต์žกํ•œ UI๋„ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

    const App = () => {
      const text = "hello world"
      return <span>{text}</span>
    }

State๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๐Ÿ”„

  • React์—์„œ๋Š” state๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๋Š” ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง๋œ๋‹ค.
    const [todoList, setTodoList] = useState([])
    const [inputValue, setInputValue] = useState("")

React์˜ ์ด๋Ÿฌํ•œ ํŠน์ง•๋“ค์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ํšจ์œจ์ ์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค. JSX, ์ปดํฌ๋„ŒํŠธ, ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ ๊ด€๋ฆฌ๋Š” React ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ์„ ์ด๋ฃจ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋” ๋‚˜์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. React๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด๋Ÿฌํ•œ ๊ฐœ๋…๋“ค์„ ๊นŠ์ด ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”! ๐Ÿš€

Create React App(CRA) ๋ฐ Node.js, NPM์— ๋Œ€ํ•œ ์ •๋ฆฌ ๐Ÿš€

Create React App(CRA)์€ React ํ”„๋กœ์ ํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ.3 Facebook์— ์˜ํ•ด ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๋ถ€ํ„ฐ ๋‹ค์–‘ํ•œ ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Node.js์™€ NPM์€ CRA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ React ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ํ•„์ˆ˜์ ์ธ ํ™˜๊ฒฝ์ด๋‹ค.

Create React App(CRA) ๐Ÿ› ๏ธ

  • ๊ฐœ์š”: React ํ”„๋กœ์ ํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” Boilerplate. ์ง์ ‘ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, CRA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ํŽธ๋ฆฌํ•˜๋‹ค.
  • ์žฅ์ :
    • ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ด์ค€๋‹ค.
    • ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก transcompile์„ ์ง€์›ํ•œ๋‹ค. (์˜ˆ: babel, webpack)
  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•:4
    npx create-react-app <directory name>
    cd <directory name>
    npm start
  • ๊ณต์‹ ๋ฌธ์„œ ๋ฐ ์ž์„ธํ•œ ์ •๋ณด

Node.js์™€ NPM ๐ŸŒ

  • Node.js:
    • ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” JavaScript ๊ธฐ๋ฐ˜์˜ ์†Œํ”„ํŠธ์›จ์–ด ํ”Œ๋žซํผ.
    • ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.
    • CRA๋ฅผ ์‚ฌ์šฉํ•œ React ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ฐ ํ…Œ์ŠคํŠธ ์„œ๋ฒ„๋กœ ํ™œ์šฉ๋œ๋‹ค.
  • NPM (Node Package Manager):
    • Node.js ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง€์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ €์žฅ์†Œ.
    • ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์™€ ์„œ๋ฒ„ ์‹คํ–‰, ๊ด€๋ฆฌ์— ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ๋ช…๋ น์–ด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ:
    • Node.js ์„ค์น˜:
    • ๋ฒ„์ „ ํ™•์ธ: node -v ๋ช…๋ น์–ด๋กœ ์„ค์น˜๋œ Node.js ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

React ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๊ณผ์ • ๐Ÿ“ฆ

  1. Node.js ์„ค์น˜: ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ LTS ๋ฒ„์ „์„ ์„ค์น˜.
  2. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ: npx create-react-app <directory name> ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉ.
  3. ํ”„๋กœ์ ํŠธ ์‹คํ–‰: ์ƒ์„ฑ๋œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•œ ํ›„ npm start ๋ช…๋ น์–ด๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰.

npm ๋ช…๋ น์–ด ๐Ÿ“š

  • npm install: package.json์— ์ •์˜๋œ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜.
  • npm install <package name>: ์›ํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜.
  • npm install <package name>@<version>: ํŠน์ • ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜.
  • npm install <git repository ์ฃผ์†Œ>: git repository๋กœ๋ถ€ํ„ฐ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜.
  • npm start: Node.js๋ฅผ ์ด์šฉํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰.
  • npm build: ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œ.
  • ๋” ๋งŽ์€ ๋ช…๋ น์–ด ์ฐธ๊ณ 

CRA, Node.js, NPM์„ ํ™œ์šฉํ•˜๋ฉด React ํ”„๋กœ์ ํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋„๊ตฌ๋“ค์€ ํ˜„๋Œ€ ์›น ๊ฐœ๋ฐœ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ๋‚˜์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค. ๐ŸŒŸ

React ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ ๋ฐ JSX ์†Œ๊ฐœ ๐Ÿ“

React ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๋””๋ ‰ํ† ๋ฆฌ์™€ ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด๋“ค์€ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ๋˜ํ•œ, JSX๋Š” React ๊ฐœ๋ฐœ์—์„œ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•˜๋Š” ๋ฌธ๋ฒ•์œผ๋กœ, HTML๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ JavaScript๋ฅผ ํ™•์žฅํ•œ ๋ฌธ๋ฒ•์ด๋‹ค.5

Directory ๊ตฌ์กฐ ๐Ÿ“‚

  • ./node_modules/: npm์„ ์ด์šฉํ•ด ์„ค์น˜ํ•œ ํŒจํ‚ค์ง€ ๋ชจ์Œ.
  • ./public/: ์ •์ ์ธ ํŒŒ์ผ๋“ค(HTML, ์ด๋ฏธ์ง€ ๋“ฑ)์˜ ๋ชจ์Œ.
  • ./src/: ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ฃผ์š” ์†Œ์Šค ํŒŒ์ผ๋“ค์ด ์œ„์น˜ํ•œ๋‹ค.
  • ./.gitignore: git์— ์˜ฌ๋ฆฌ์ง€ ์•Š์„ ํŒŒ์ผ ์„ค์ •์„ ํฌํ•จํ•œ๋‹ค.
  • ./package.json: ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ์ •๋ณด์™€ ์‚ฌ์šฉ ํŒจํ‚ค์ง€ ๋ช…์„ธ ํŒŒ์ผ. ํŒจํ‚ค์ง€ ๋ฒ„์ „์€ ^, <=, >= ๋“ฑ์˜ ๊ธฐํ˜ธ๋กœ ๋ฒ”์œ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ./README.md: ํ”„๋กœ์ ํŠธ์— ๊ด€ํ•œ ์„ค๋ช…์„ ์ž‘์„ฑํ•˜๋Š” ํŒŒ์ผ.

์„ค์น˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๐Ÿ“š

import "package name" // CSS๋‚˜ import๋งŒ์œผ๋กœ ์—ญํ• ์„ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
import something from "package name" // ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์™€ ํ™œ์šฉํ•  ๋•Œ
import { a, b } from "package name" // ํŒจํ‚ค์ง€ ๋‚ด ์ผ๋ถ€๋งŒ ๊ฐ€์ ธ์˜ฌ ๋•Œ
import * as something from "package name" // default๋กœ export๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

JSX ์†Œ๊ฐœ โœจ

JSX๋Š” JavaScript๋ฅผ ํ™•์žฅํ•œ ๋ฌธ๋ฒ•์œผ๋กœ, UI๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒจ์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด React์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค. JSX๋Š” React "์—˜๋ฆฌ๋จผํŠธ"๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, HTML๊ณผ ์œ ์‚ฌํ•œ ์ƒ๊น€์ƒˆ๋ฅผ ๊ฐ€์ง€์ง€๋งŒ JavaScript์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ๋‹ค6.

JSX์˜ ์žฅ์ 

  • ๊ฐœ๋ฐœ์ž ํŽธ์˜์„ฑ์˜ ํ–ฅ์ƒ
  • ํ˜‘์—… ์šฉ์ด ๋ฐ ์ƒ์‚ฐ์„ฑ์˜ ํ–ฅ์ƒ
  • ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ๋ฐ ์ฝ”๋“œ๋Ÿ‰ ๊ฐ์†Œ

JSX์˜ ํŠน์ง•

  • HTML ํƒœ๊ทธ ๋‚ด์—์„œ JavaScript ์—ฐ์‚ฐ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • HTML๊ณผ์˜ ์ฐจ์ด์ ์œผ๋กœ๋Š” class ๋Œ€์‹  className์„ ์‚ฌ์šฉํ•˜๊ณ , ์Šคํƒ€์ผ์€ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ๋‹ค.
  • ๋‹ซ๋Š” ํƒœ๊ทธ๊ฐ€ ํ•„์ˆ˜์ด๋ฉฐ, ์ตœ์ƒ๋‹จ element๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.

JSX์™€ JavaScript์˜ ์ฐจ์ด์ 

  • JSX๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, HTML์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” JavaScript์ž„.
  • React์—์„œ๋Š” JSX๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด UI๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค. ์ด๋Š” ๊ธฐ์กด JavaScript์™€ HTML์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๊ณผ๋Š” ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค7.

JSX๋Š” React ๊ฐœ๋ฐœ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ UI๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค. React ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์กฐ์™€ JSX์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๋ฉด, React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์žˆ์–ด ํ›จ์”ฌ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๐Ÿš€

๋ธŒ๋ผ์šฐ์ €์— ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ UI ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ• ๐Ÿ’พ๐Ÿ”„

๋ธŒ๋ผ์šฐ์ €์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ์ˆ  ์Šคํƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. JavaScript์™€ React๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์–ด ์„œ๋กœ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์— ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐฉ๋ฒ•

JavaScript
  • ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋Š” ์ฃผ๋กœ DOM์— ์ €์žฅ๋œ๋‹ค. DOM์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋งŒ๋“ค๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ „์ฒด HTML์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ๊ฐœ๋ฐœ์ž๋Š” DOM์—์„œ ํ•ด๋‹น ๊ฐ’์„ ์ฐพ์•„ ์ถ”์ถœํ•ด์•ผ ํ•œ๋‹ค. ์ด ๊ณผ์ •์€ ๊ด€๋ฆฌ๊ฐ€ ๋ฒˆ๊ฑฐ๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค8.
React
  • React์—์„œ๋Š” ์ œ์–ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์ด๋Š” DOM์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  JS ๋ณ€์ˆ˜์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•จ์œผ๋กœ์จ ์ด๋ฃจ์–ด์ง„๋‹ค.
  • ์ด ๋ฐฉ์‹์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ฑ์žฅํ•จ์— ๋”ฐ๋ผ ๋”์šฑ ์ค‘์š”ํ•ด์ง€๋ฉฐ, ์ฝ”๋“œ ๊ด€๋ฆฌ๊ฐ€ ํŽธ๋ฆฌํ•ด์ง„๋‹ค.

UI ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ•

JavaScript
  • UI ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด, ๊ฐœ๋ฐœ์ž๋Š” DOM์—์„œ ์š”์†Œ๋ฅผ ์ฐพ๊ณ , ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ๋ฐ˜์‘ํ•ด์•ผ ํ•œ๋‹ค. ์ด ๊ณผ์ •์€ ๋ณต์žกํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.
React
  • React๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด UI๋ฅผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด React๋Š” ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ํ•„์š”ํ•œ UI ๋ถ€๋ถ„๋งŒ์„ ํšจ์œจ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.
  • ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ UI ์—…๋ฐ์ดํŠธ ๋กœ์ง์— ์ง‘์ค‘ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์‚ฌ์šฉ์ž์™€์˜ ์ƒํ˜ธ์ž‘์šฉ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ ๊ด€๋ฆฌ์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค9.

๋ธŒ๋ผ์šฐ์ €์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ธฐ์ˆ ์˜ ์„ ํƒ์— ๋”ฐ๋ผ ํฌ๊ฒŒ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. JavaScript๋Š” ์ง์ ‘์ ์ธ DOM ์กฐ์ž‘์— ์˜์กดํ•˜๋Š” ๋ฐ˜๋ฉด, React๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ์„ ์–ธ์ ์ด๊ณ  ํšจ์œจ์ ์ธ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ์ฐจ์ด์ ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ์›น ๊ฐœ๋ฐœ์—์„œ ์ค‘์š”ํ•œ ์š”์†Œ ์ค‘ ํ•˜๋‚˜. ๐ŸŒŸ

React ์ปดํฌ๋„ŒํŠธ ๐ŸŽจ

React์—์„œ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„์ธ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ์ปดํฌ๋„ŒํŠธ๋Š” React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ์š”์†Œ๋กœ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ์˜ ๋ธ”๋ก์„ ์ œ๊ณตํ•œ๋‹ค.

์ปดํฌ๋„ŒํŠธ๋ž€? ๐Ÿค”

  • React์—์„œ์˜ ์—ญํ• : ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ตœ์†Œ ๋‹จ์œ„๋กœ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ์กฐ๊ฐ.
  • ๋„ค์ด๋ฐ ๊ทœ์น™: ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜ HTML ์š”์†Œ์™€ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•จ์ž„.

์ปดํฌ๋„ŒํŠธ์˜ ์ข…๋ฅ˜

  • Class ์ปดํฌ๋„ŒํŠธ: ์ดˆ๊ธฐ React์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋ฉฐ, Java ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์นœ์ˆ™ํ•œ ๊ฐœ๋…. React์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Function ์ปดํฌ๋„ŒํŠธ: React v16๋ถ€ํ„ฐ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์œผ๋กœ, ํ˜„์žฌ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ด ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. Hook์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

Controlled Component์™€ Uncontrolled Component

  • Controlled Component: form์„ ํ†ตํ•ด ์ž…๋ ฅ์„ ๋ฐ›์„ ๋•Œ, ๊ฐ input์˜ ๋ฐ์ดํ„ฐ๋ฅผ state๋ฅผ ํ†ตํ•ด ์ง์ ‘ ๊ด€๋ฆฌํ•œ.
  • Uncontrolled Component: React๋กœ input์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ , ํ•„์š”ํ•  ๋•Œ DOM์—์„œ ์ง์ ‘ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ง•

  • Props(Properties): ์ปดํฌ๋„ŒํŠธ์˜ ์†์„ฑ์œผ๋กœ, ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.
  • Children: ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์ž‘์„ฑ๋œ ํ•˜์œ„ ์š”์†Œ๋กœ, props์˜ ์ผ๋ถ€๋กœ ์ทจ๊ธ‰๋œ๋‹ค.

์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

  • Props๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ: ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” props๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  • State๋ฅผ ํ†ตํ•œ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ: ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ๋Š” state๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

React ์ปดํฌ๋„ŒํŠธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์žˆ์–ด ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด UI๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ, ๊ฐœ๋ฐœ ๊ณผ์ •์„ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ์ •๋ณด๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๐ŸŒŸ

@leekh8
Hello :)