๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Frontend Dev/๐Ÿฅ ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  FE ๋ถ€ํŠธ์บ ํ”„

Section2 Unit4 [React] Intro

๋ฐ˜์‘ํ˜•

 


Section2 Unit4 [React] Intro

 

๐Ÿ“Œ Chapter1. React Intro

• React๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

• ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด UI๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ๊ณต๋ถ€ํ•  ๋ฌธ๋ฒ•๋“ค์ด ์ ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ๊นŒ์ง€ ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ๊ณ ํ•  ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋งŽ์œผ๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‚ฌ์šฉ์ด ์šฉ์ดํ•˜๊ฒŒ ์ฝ”๋“œ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฆฌ์•กํŠธ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, React-Native๋ฅผ ํ†ตํ•ด ๋ชจ๋ฐ”์ผ ๊ฐœ๋ฐœ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

React์˜ ํŠน์ง•

  1. ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์žฌ์‚ฌ์šฉ๊ฐ€๋Šฅ)

  2. ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  3. ๋ฒ”์šฉ์„ฑ

  4. Virtual DOM (๊ฐ€์ƒ๋”)

 

 ↓ React์—์„œ ์‚ฌ์šฉ๋˜๋Š” JSX ๋ฌธ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. 

 

React ๊ธฐ๋ณธ, JSX(JavaScript XML)์™€ JSX ๋ฌธ๋ฒ• ๊ทœ์น™ ํ•œ๋ฒˆ์— ์•Œ์•„๋ณด๊ธฐ

๐Ÿ‘พ JSX(JavaScript XML)๋ž€? JSX๋Š” JavaScript๋ฅผ ํ™•์žฅํ•œ ๋ฌธ๋ฒ•์œผ๋กœ React์—์„œ UI๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. JSX๋Š” React์—์„œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ๋‹ค. ๊ธฐ์กด์˜ JavaScript ์ฝ”๋“œ ์•ˆ์— HTML๊ณผ ์œ 

fay-story.com

 

๐Ÿ“Œ Chapter2. Create React App

create-react-app์œผ๋กœ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

npx create-react-app

 

• ๋ฆฌ์•กํŠธ๋กœ Random word ์ถœ๋ ฅํ•˜๊ธฐ

const word = ["๊ณ ์–‘์ด์•ผ์˜น", "๋Œ•๋Œ•์ด๋ฉ๋ฉ", "์†Œ๋Š”์Œ๋ฉ”~", "์˜ค๋ฆฌ๊ฝฅ๊ฝฅ", "์ฐธ์ƒˆ์งน์งน"];

function getRandomIndex(length) {
  return parseInt(Math.random() * length)
}

function App() {
  return (
    <div className="App">
        <p>
          {word[getRandomIndex(word.length)]}
        </p>
    </div>
  );
}

 

โญ๏ธ ๊ณผ์ œ. React Twittler Intro

 ์ „์ฒด์ ์œผ๋กœ ๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ์ต์ˆ™ํ•ด์ง€๊ธฐ ์œ„ํ•œ ๊ณผ์ œ์˜€๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋‹ค์Œ ์œ ๋‹›์—์„œ๋„ ๋น„์Šทํ•œ ๊ณผ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•˜๊ณ , ์–ด๋ ค์šด ๋ถ€๋ถ„์€ ์—†์–ด์„œ ๋”ฐ๋กœ ๊ธฐ๋กํ•˜์ง€๋Š” ์•Š์•„๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 create-react-app์œผ๋กœ ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ , ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‚ด์šฉ์„ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด์—ˆ๋‹ค. ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ํ™œ์šฉํ–ˆ๊ณ , ์งค๋ง‰ํ•˜๊ฒŒ font awesome๋„ ์‚ฌ์šฉํ–ˆ๋‹ค. 

 

 

๐ŸŒฑ ์˜คํ›„ QnA ์„ธ์…˜

 ์˜คํ›„ QnA ์„ธ์…˜์—์„œ๋„ ๋งŽ์€ ๊ฑธ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด์ „๊นŒ์ง€๋Š” ๋…ธ์…˜์—๋งŒ ์ •๋ฆฌ๋ฅผ ํ–ˆ์—ˆ๋Š”๋ฐ, ๋ธ”๋กœ๊ทธ์— ์ •๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ ํ•ด๋ณผ๊นŒ.

• JSX

 ๋ฆฌ์•กํŠธ๊ฐ€ ์ฒ˜์Œ ๋‚˜์™”์„ ๋•Œ๋Š” jsx๋Š” ์—†์—ˆ์ง€๋งŒ ํŽธ๋ฆฌํ•จ์„ ๊ณ ๋ คํ•˜์—ฌ ํŽ˜์ด์Šค๋ถ์—์„œ ๋งŒ๋“ค์—ˆ๋‹ค. jsx๋Š” js๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค jsx๋Š” ์ฝ”๋“œ๋Ÿ‰์ด ์ ๊ณ  ํŽธ๋ฆฌํ•˜๋‹ค. jsx๋Š” ๊ทธ๋Ÿฌํ•œ ์ด์œ ๋กœ ์ƒ๊ฒจ๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ์ฝ์ง€๋„ ๋ชปํ•˜๊ณ  ์‹คํ–‰๋„ ๋ชปํ•œ๋‹ค. ๋ฐ˜๋“œ์‹œ js๋กœ ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋‹ค. ๋ณ€ํ™˜์€ create-react-app์—์„œ ์•Œ์•„์„œ ํ•ด์ค€๋‹ค..ใ…Žใ…Ž ์ด๊ฒƒ๊นŒ์ง€ ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๋ฉด ๋ณต์žกํ•˜๋‹ค๊ณ ..! 

• ์ปดํฌ๋„ŒํŠธ

 ์ปดํฌ๋„ŒํŠธ๋Š” ํ‰์†Œ์— ์›นํŽ˜์ด์ง€ ํ™”๋ฉด์„ ๋ณด๋ฉด์„œ ๋‚˜๋ฆ„๋Œ€๋กœ ์ž๊ธฐ๋งŒ์˜ ํ™•๊ณ ํ•œ ๊ธฐ์ค€์„ ๊ฐ€์ง€๊ณ  ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฅ˜ํ•ด๋ณด๋Š” ์—ฐ์Šต์„ ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.

 ํšŒ์‚ฌ๋งˆ๋‹ค ๋‹ค๋ฅด์ง€๋งŒ ์žฌ์‚ฌ์šฉ์„ฑ์„ ์œ„ํ•ด์„œ ์ตœ๋Œ€ํ•œ ์ชผ๊ฐœ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

• state ์ง„๋„ ์ „์ด์ง€๋งŒ, state์— ๊ด€ํ•œ ์ด์•ผ๊ธฐ

 state - ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜

 ๋ฆฌ์•กํŠธ ์ด์ „์˜ ์„ธ์ƒ์—์„œ๋Š” ์›๋ณธ ๋ฐ์ดํ„ฐ์™€ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„๋ฆฌ๊ฐ€ ๋˜์–ด ์žˆ์—ˆ๋‹ค.

 

- ์›๋ณธ๋ฐ์ดํ„ฐ

- ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๋ฐ์ดํ„ฐ (์˜ˆ๋ฅผ ๋“ค๋ฉด dom.textContent)

- ๊ทธ๋ž˜์„œ ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด dom์— ์ ‘๊ทผํ•ด์„œ textContent๋‚˜ value๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์‹์˜ ์ž‘์—…์„ ํ–ˆ๋‹ค.

- ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ → dom ๋ณ€๊ฒฝ ์ด ๋‘๊ฐ€์ง€๊ฐ€ ๊ธฐ๋ณธ์ž‘์—…์ธ ์‹œ๋Œ€์˜€๋‹ค.

 

์ด์ œ ๊ทธ๊ฑธ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ง€์›ํ•ด์ฃผ๋Š” ๋ฆฌ์•กํŠธ๊ฐ€ ํƒ„์ƒํ–ˆ๋‹ค.

• ๊ทธ๋ฆฌ๊ณ , Vite

 ์š”์ฆ˜์—๋Š” ์••๋„์ ์œผ๋กœ ๋นŒ๋“œ์†๋„๊ฐ€ ๋น ๋ฅธ Vite ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. vite๋Š” svelte react vue ์ „๋ถ€ ์…‹์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 ์•ˆ๊ทธ๋ž˜๋„ Vite, ์ตœ๊ทผ์— ๋ช‡ ๋ฒˆ ๋“ค์€ ์ ์ด ์žˆ์–ด์„œ ๊ถ๊ธˆํ–ˆ์—ˆ๋Š”๋ฐ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํŠธ๋ Œ๋“œ๊ธด ํ•œ๊ฐ€๋ณด๋‹ค!


๐ŸŒ™  ์˜ค๋Š˜์˜ ํšŒ๊ณ 

 ๋“œ๋””์–ด ๋ฆฌ์•กํŠธ์— ๋“ค์–ด๊ฐ”๋‹ค. ๋ฆฌ์•กํŠธ ์ฒซ๋‚ ์ด๋ผ ๋ณต์Šตํ•œ๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ ๋ฌด๋‚œํ•˜๊ฒŒ ๋„˜์–ด๊ฐ”๋‹ค. ๋ฆฌ์•กํŠธ๊ฐ€ ๋ฌด์—‡์ด๊ณ , ์–ด๋–ค ํŠน์ง•์„ ๊ฐ€์ง€๋Š”์ง€ ๋ฆฌ๋งˆ์ธ๋“œ ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ „์—๋Š” ๋”ฐ๋กœ ์ •๋ฆฌํ•œ ์  ์—†์ด ๋งˆ๊ตฌ ํœ˜๊ฐˆ๊ฒจ ๋†“์•˜๋˜ JSX ๋ฌธ๋ฒ•์— ๋Œ€ํ•ด์„œ๋„ ์ •๋ฆฌ๋ฅผ ์ข€ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ์ ์€ JSX๋Š” Boolean, null, undefined๋ฅผ ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ณ ์ฐจํ•จ์ˆ˜๋ž‘ ๋น„๋™๊ธฐ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•  ๋•Œ๋ž‘์€ ์ „ํ˜€ ๋‹ค๋ฅด๊ฒŒ ๋„ˆ๋ฌด ํŽธ-์•ˆ…ํœด. ์‹œ๊ฐ„์ด ๋งŽ์ด ๋‚จ์•„์„œ ๋‹ค์Œ ์ง„๋„๋„ ๋ณด๊ณ  ์ด์ „์— ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„๋“ค ๋ณต์Šต๋„ ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. (๋‚˜์ค‘์ด ๋ฌด์„ญ๊ธด ํ•˜๋‹ค……)

 ๊ทธ๋ž˜๋„ ์˜ค๋žœ๋งŒ์— ์—ฌ์œ ์žˆ๊ฒŒ ๋ฆฌ์•กํŠธ์— ๊ด€ํ•ด ์ •๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์˜ค๋Š˜์€ ๋จธ๋ฆฌ๋ฅผ ์กฐ๊ธˆ์€ ์‹ํž ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•