๐ŸŽฏ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ React์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“— Today I Learned

React

react.js๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(SPA)๊ณผ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(React Native)์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿค” jQuery๋ฅผ ์žฌ์น˜๊ณ , React๊ฐ€ ๋“ฑ์žฅํ•œ ์ด์œ ๋Š” ๋ญ˜๊นŒ?

๊ธฐ์กด์˜ ์›น ๊ฐœ๋ฐœ ๋ฐฉ์‹( jQuery)์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ƒํƒœ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค HTML ์š”์†Œ(DOM)๋ฅผ ์ง์ ‘ ์ฐพ์•„ ์กฐ์ž‘ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. (์ฆ‰, ๊ฐ’์ด ๋ณ€ํ•ด๋„ ์ž๋™์œผ๋กœ UI๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ UI๋ฅผ ์กฐ์ž‘ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.)

if (user.loggedIn) {
  document.getElementById("loginBtn").style.display = "none";
  document.getElementById("logoutBtn").style.display = "block";
  document.getElementById("welcomeMsg").textContent = "ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!";
}

ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ ์  ๋ณต์žกํ•ด์ง€๋ฉด์„œ ์ƒํƒœ์™€ UI ๊ฐ„์˜ ์ผ์น˜๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์–ด๋ ค์›Œ์กŒ๊ณ , ์„ฑ๋Šฅ ์ €ํ•˜๋‚˜ ๋ฒ„๊ทธ๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.


React๋Š” DOM์„ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ๋” ์ถ”์ƒํ™”ํ•ด์ค๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ”์•ผ ํ• ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ, ์ง€๊ธˆ ์ƒํƒœ๋ผ๋ฉด ์–ด๋–ค ํ™”๋ฉด์ด์–ด์•ผ ํ•˜๋Š”์ง€๋งŒ ์„ ์–ธ์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. (์ฆ‰, ์ƒํƒœ๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด, ํ™”๋ฉด์€ React๊ฐ€ ์ž๋™์œผ๋กœ ๊ทธ๋ ค์ค๋‹ˆ๋‹ค.)

function Greeting({ isLoggedIn }) {
  return (
    <div>
      {isLoggedIn ? (
        <p>ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!</p>
      ) : (
        <button>๋กœ๊ทธ์ธ</button>
      )}
    </div>
  );
}


๋™์ž‘ ์›๋ฆฌ

์ถœ์ฒ˜: https://ninefloor.tistory.com/118


1. ์ดˆ๊ธฐ ๋ Œ๋”๋ง

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ํ™”๋ฉด์— ๊ทธ๋ ค์งˆ ๋•Œ, React๋Š” ์ „์ฒด UI ๊ตฌ์กฐ๋ฅผ ํ•œ ๋ฒˆ์— ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

2. ๊ฐ€์ƒ DOM ๋ณ€๊ฒฝ

๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์„œ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด, ๊ฐ€์ƒ DOM(Virtual DOM)์„ ๋จผ์ € ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค” ๊ฐ€์ƒ DOM์ด๋ž€?

์‹ค์ œ ํ™”๋ฉด์ด ์•„๋‹Œ, ๋ฉ”๋ชจ๋ฆฌ ์†์— ์กด์žฌํ•˜๋Š” ๊ฐ€์ƒ์˜ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ทธ๋ฆฌ๊ธฐ ์ „์— ๋น ๋ฅด๊ฒŒ ๊ณ„์‚ฐํ•˜๊ณ  ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์žฌ์กฐ์ •

๋ณ€๊ฒฝ๋œ ๊ฐ€์ƒ DOM๊ณผ ์ด์ „ ๊ฐ€์ƒ DOM์„ ๋น„๊ตํ•˜์—ฌ
์–ด๋–ค ๋ถ€๋ถ„์ด ๋‹ฌ๋ผ์กŒ๋Š”์ง€๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

4. ์‹ค์ œ DOM ์—…๋ฐ์ดํŠธ

๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด(DOM)์— ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ํšจ์œจ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.




React ์•ฑ ๋งŒ๋“ค๊ธฐ

โ„น๏ธ ํ˜„์žฌ๋Š” ์‚ฌ์šฉ์ด ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š” ๊ตฌ๋ฒ„์ „ ๋ฌธ์„œ (React 17 ์ดํ•˜)๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์•ฑ์„ ๋งŒ๋“œ๋Š” ์ ์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

๐Ÿ”ฅ CRA(Create React App) vs Vite
๐Ÿ‘‰ ๋” ์ด์ƒ CRA(Create React App)์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ  / Vite๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ•ญ๋ชฉCreate React App (CRA)Vite
๋ช…๋ น์–ดnpx create-react-app my-appnpm create vite@latest my-app -- --template react
๊ธฐ์ˆ  ๊ธฐ๋ฐ˜WebpackESBuild + Rollup
์ดˆ๊ธฐ ์„ค์ •์ž๋™ ์„ค์ •, ์ˆจ๊ฒจ์ง„ ์„ค์ • (eject ํ•„์š”)ํ…œํ”Œ๋ฆฟ ๊ธฐ๋ฐ˜, vite.config.js๋กœ ์‰ฝ๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ
๊ฐœ๋ฐœ ์„œ๋ฒ„ ์†๋„๋А๋ฆด ์ˆ˜ ์žˆ์Œ๋น ๋ฅด๊ฒŒ ๋ฐ˜์‘ํ•จ
๋นŒ๋“œ ์†๋„๋น„๊ต์  ๋А๋ฆผ๋น ๋ฆ„
๊ธฐ๋ณธ ๋ฒˆ๋“ค๋ŸฌWebpackRollup
์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)๊ธฐ๋ณธ ๋ฏธ์ง€์›์ผ๋ถ€ SSR ๊ฐ€๋Šฅ (Next.js๋ณด๋‹จ ์ œํ•œ์ )

Create React App์„ ํ†ตํ•ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์„ค์ •

typescript๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— typescript ํ…œํ”Œ๋ฆฟ์„ ์„ค์ •ํ•˜์—ฌ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

npx create-react-app ํ”„๋กœ์ ํŠธ๋ช… --template typescript
cd ํ”„๋กœ์ ํŠธ๋ช…
npm start



JSX

JavaScript XML์˜ ์ค„์ž„๋ง๋กœ, React์—์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค. React ์ปดํฌ๋„ŒํŠธ์˜ return ๋ฌธ ์•ˆ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ HTML์„ JSX๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์‚ฌ์ดํŠธ


1. JSX ์•ˆ์— JS ์ฝ”๋“œ๋Š” {} ์•ˆ์— ์ž‘์„ฑ

์ค‘๊ด„ํ˜ธ {} ์•ˆ์— JavaScript ํ‘œํ˜„์‹์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function Greeting() {
  const name = "Yuna";
  return <h1>Hello, {name}!</h1>;
}

2. ํ•˜๋‚˜์˜ ์ตœ์ƒ์œ„ ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์•ผ ํ•จ

function App() {
  return (
    <div>
      <h1>Hello</h1>
      <p>Welcome</p>
    </div>
  );
}

3. ํƒœ๊ทธ๋Š” ๋ฐ˜๋“œ์‹œ ๋‹ซ์•„์•ผ ํ•จ

HTML์—์„œ๋Š” ์ผ๋ถ€ ํƒœ๊ทธ๋ฅผ ๋‹ซ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ, JSX์—์„œ๋Š” ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

function Logo() {
  return <img src="logo.png" />;
}

4. class ๋Œ€์‹  className ์‚ฌ์šฉ

class ๋Œ€์‹  className์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

function Container() {
  return <div className="container">๋‚ด์šฉ</div>;
}

5. jsx ๋‚ด๋ถ€์—์„œ ์ฃผ์„์„ ์ž‘์„ฑํ•  ๋•Œ๋Š” {/* */} ๋ฅผ ์‚ฌ์šฉ

jsx ์™ธ๋ถ€์—์„œ๋Š” // ๋˜๋Š” /* */๋กœ js์™€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์ง€๋งŒ jsx ๋‚ด๋ถ€์—์„œ๋Š” {/* */}๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฃผ์„์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

function Home({ isLoggedIn }) {
  return (
    <div>
      {/* ์—ฌ๊ธฐ๋Š” ์ œ๋ชฉ์ž…๋‹ˆ๋‹ค */}
      <h1>Hello, world!</h1>

      {/* ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ์˜ˆ์‹œ */}
      {isLoggedIn ? <LogoutButton /> : <LoginButton />}
    </div>
  );
}

6. ์ธ๋ผ์ธ ์Šคํƒ€์ผ : style ์†์„ฑ์— ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ „๋‹ฌ

JSX์—์„œ๋Š” JavaScript ๊ฐ์ฒด ํ˜•์‹์œผ๋กœ ์Šคํƒ€์ผ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ค‘๊ด„ํ˜ธ ๋‘ ๊ฐœ({{ ... }})๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. css ์†์„ฑ ์ด๋ฆ„๋„ camelCase๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

function StyledBox() {
  return (
    <div style={{ 
      padding: '20px', 
      backgroundColor: 'lightgray', 
      borderRadius: '8px' 
    }}>
      ์ธ๋ผ์ธ ์Šคํƒ€์ผ๋กœ ๊พธ๋ฉฐ์ง„ ๋ฐ•์Šค์ž…๋‹ˆ๋‹ค.
    </div>
  );
}



โœ๏ธ ํšŒ๊ณ 

JSX์˜ ๋ฌธ๋ฒ•์ด ์•„์ง ํ—ท๊ฐˆ๋ฆฌ์ง€๋งŒ ์ž˜ ์ •๋ฆฌํ•ด์„œ ์ต์ˆ™ํ•ด์ง€๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค.

profile
๐ŸŒฑ๊ฐœ๋ฐœ ๊ธฐ๋ก์žฅ

0๊ฐœ์˜ ๋Œ“๊ธ€