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

Frontend Dev/React

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

๋ฐ˜์‘ํ˜•

๐Ÿ‘พ JSX(JavaScript XML)๋ž€?

 JSX๋Š” JavaScript๋ฅผ ํ™•์žฅํ•œ ๋ฌธ๋ฒ•์œผ๋กœ React์—์„œ UI๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

 

 JSX๋Š” React์—์„œ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ๋‹ค. ๊ธฐ์กด์˜ JavaScript ์ฝ”๋“œ ์•ˆ์— HTML๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์ธ๋ผ์ธ์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ UI ์š”์†Œ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ์ด๋Š” UI์™€ ๊ด€๋ จ๋œ ๋กœ์ง๊ณผ ๋งˆํฌ์—…์„ ํ•œ ๊ณณ์—์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํŽธ๋ฆฌํ•จ์„ ์ œ๊ณตํ•œ๋‹ค.

 JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JavaScript ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํ‘œํ˜„์‹ ๋“ฑ์„ ๋งˆํฌ์—… ์•ˆ์—์„œ ์ค‘๊ด„ํ˜ธ({})๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์ ์ธ ๊ฐ’์„ ํ…œํ”Œ๋ฆฟ์— ์‰ฝ๊ฒŒ ์‚ฝ์ž…ํ•˜๊ณ , ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ˜๋ณต๋ฌธ ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์œ ์—ฐํ•œ UI๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 JSX๋Š” JavaScript๊ฐ€ ํ™•์žฅ๋œ ๋ฌธ๋ฒ•์ด์ง€๋งŒ, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” JavaScript ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— Babel๊ณผ ๊ฐ™์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” JavaScript๋กœ ์ปดํŒŒ์ผํ•ด์•ผ ํ•œ๋‹ค. ์ปดํŒŒ์ผ ํ›„, JavaScript๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฝ๊ณ  ํ™”๋ฉด์— ๋ Œ๋”๋งํ•œ๋‹ค.

 

 

๐Ÿ‘พ JSX ๋ฌธ๋ฒ• ๊ทœ์น™

โœ”๏ธ 1. ์ฃผ์„

 JSX ์•ˆ์—์„œ ์ฃผ์„์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ๋Š” ๋‹ค๋ฅด๋ฉฐ, {/* ์ฃผ์„ */} ์ด์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•œ๋‹ค.

function App() {
  return (
    // ํƒœ๊ทธ ์™ธ๋ถ€์—์„œ์˜ ์ฃผ์„
    <div>
      {/* ํƒœ๊ทธ ๋‚ด๋ถ€์—์„œ์˜ ์ฃผ์„ */}
      Hello, React!
    </div>
  );
}

 

โœ”๏ธ 2. ์ตœ์ƒ์œ„ ํƒœ๊ทธ ๊ทœ์น™: ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ์ตœ์ƒ์œ„ ํƒœ๊ทธ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

function App() {
  return (
    <div> {/* ์ตœ์ƒ์œ„ ํƒœ๊ทธ */}
      <div>
        <h1>Hello</h1>
      </div>
      <div>
        <h2>React</h2>
      </div>
    </div>
  )
}

 → VirtualDOM ์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•ด ๋‚ผ ๋•Œ ํšจ์œจ์ ์œผ๋กœ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋‚˜์˜ DOM ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ

 

• ๋˜๋Š” React v16 ์ด์ƒ๋ถ€ํ„ฐ ๋„์ž…๋œ <React.Fragment>๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Fragment๋Š” ๋ธŒ๋ผ์šฐ์ € ์ƒ์—์„œ ๋”ฐ๋กœ ๋ณ„๋„์˜ ์—˜๋ฆฌ๋จผํŠธ๋กœ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค.

import { Fragment } from 'react';

function App() {
  return (
    <Fragment> 
      <div>
        <h1>Hello</h1>
      </div>
      <div>
        <h2>React</h2>
      </div>
    </Fragment>
  )
}

 

• ํƒœ๊ทธ๋ฅผ ์ž‘์„ฑ ํ•  ๋•Œ ์ด๋ฆ„ ์—†์ด ์ž‘์„ฑ์„ ํ•˜๊ฒŒ ๋˜๋ฉด Fragment๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.

function App() {
  return (
    <> 
      <div>
        <h1>Hello</h1>
      </div>
      <div>
        <h2>React</h2>
      </div>
    </>
  )
}

 

โœ”๏ธ 3. JSX์—์„œ๋Š” ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ๋‹ซ์•„์ค˜์•ผ ํ•œ๋‹ค.

<div></div>
<input /> // self-closing ํƒœ๊ทธ

 

โœ”๏ธ 4. CSS class ์†์„ฑ์€ className์œผ๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.

<div className="myClass"></div>

 

โœ”๏ธ 5. JavaScript ํ‘œํ˜„์‹ ์‚ฌ์šฉ์‹œ {์ค‘๊ด„ํ˜ธ}๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ธ์‹ํ•œ๋‹ค.

function App() {
  const name = "react"
  return (
    <div>
      Hi, {name}
    </div>
  )
}

 

โœ”๏ธ 6. ์‚ฌ์šฉ์ž ์ •์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค. (PascalCase)

 ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด ์ผ๋ฐ˜์ ์ธ HTML ์—˜๋ฆฌ๋จผํŠธ๋กœ ์ธ์‹ํ•œ๋‹ค.

function MyComponent() {
  return <div>Hello, {name}</div>
}

function Hello() {
  return <MyComponent />
}

 

โœ”๏ธ 7. ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง

 • ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์—๋Š” if๋ฌธ์ด ์•„๋‹Œ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

JSX ๋‚ด๋ถ€์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” if๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. (JSX ์™ธ๋ถ€์—์„œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

function App() {
  const name = "react";
  return (
    <div>
      {name === "react" ? <p>react</p> : <p>javascript</p> }
    </div>
  )
}

 

 • ๋˜๋Š” AND ์—ฐ์‚ฐ์ž(&&)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

function App() {
  const name = "react";
  return (
    <div>
      {name === "react" && <p>react</p> }
    </div>
  )
}

 → JSX์—์„œ boolean, null, undefined๋ฅผ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์•„๋ฌด๊ฒƒ๋„ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค. (์œ ํšจํ•˜์ง€๋งŒ ๋ Œ๋”๋ง๋งŒ ๋˜์ง€ ์•Š๋Š”๋‹ค.)

ํ•˜์ง€๋งŒ 0๊ณผ ๊ฐ™์€ falsyํ•œ ๊ฐ’๋“ค์€ React๊ฐ€ ๋ Œ๋”๋ง ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

(๊ด€๋ จ ์ž๋ฃŒ๋Š” react ๊ณต์‹๋ฌธ์„œ ํ™•์ธ)

 

โœ”๏ธ 8. ์—ฌ๋Ÿฌ ๊ฐœ์˜ HTML ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ๋Š” map() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 • map ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” key๋ผ๋Š” props๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

 • key ์†์„ฑ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๊ณ , ์˜ˆ์ƒ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œ ์ผํ•ด์•ผ ํ•œ๋‹ค. (ex. id)

const posts = [
  { id : 1, title : 'Hello World', content : 'Welcome to learning React!' },
  { id : 2, title : 'Installation', content : 'You can install React via npm.' },
  { id : 3, title : 'reusable component', content : 'render easy with reusable component.' },
  // ...
  { id : 100, title : 'I just got hired!', content : 'OMG!' },
];

function Blog() {
  const postToElement = (post) => (
    <div key={post.id}>
      <h3>{post.title}</h3>
      <p>{post.content}</p>
    </div>
  );

  const blogs = posts.map(postToElement);

  return <div className="post-wrapper">{blogs}</div>;
}

 


โœ๏ธ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์ •๋ณด๋‚˜ ๋” ๊ณต์œ ํ•  ๋‚ด์šฉ์ด ์žˆ์œผ๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜Š

๋ฐ˜์‘ํ˜•