JSX

2์ฃผ์ฐจ ํ‚ค์›Œ๋“œ

  • React์—์„œ JSX๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ 

  • Syntactic sugar

  • React.createElement

  • React Element

  • React StrictMode


JSX๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์ „์—...

React Element

React Element๋Š” React๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์ด๋‹ค. React DOM์€ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ๋ชจ์—ฌ์„œ ๋งŒ๋“ค์–ด์ง„ ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ๊ฐ์ง€ํ•ด์„œ DOM์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. React DOM์ด ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ถ€๋ถ„์€ Virtual DOM์„ ์ •๋ฆฌํ•˜๋ฉด์„œ ์ž์„ธํžˆ ํ•ด์•ผ๊ฒ ๋‹ค. JSX๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์„œ๋Š” React Element๊ฐ€ ๋ฆฌ์•กํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ๋ผ๋Š” ๊ฒƒ๋งŒ ์•Œ์•„๋‘์ž.

const element = <h1>Hello, world!</h1>;

React.createElement

React.createElement๋Š” React Element๋ฅผ ๋งŒ๋“œ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋กœ react๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

React.createElement(component, props, ...children)

function User({name}) {
    return <div>user name is {name}</div>
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(React.createElement(User, {name: 'Jiwon'}, null));

React.createElement ๋ฉ”์„œ๋“œ๋กœ User๋ผ๋Š” Component๋ฅผ ํ™”๋ฉด์— ๋žœ๋”๋ง ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ํ™”๋ฉด์—๋Š” user name is Jiwon์ด ์ถœ๋ ฅ๋œ๋‹ค.

JSX

JSX๋Š” React.createElement๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ React Element๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Javascript์˜ ํ™•์žฅ ๋ฌธ๋ฒ•์ด๋‹ค. JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด React Element๋ฅผ ๋” ์ง๊ด€์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ๋งˆ๋””๋กœ ๊ฐœ๋ฐœ์„ ๋” ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” Syntactic sugar์ด๋‹ค.

Syntactic sugar๋Š” ์‚ฌ๋žŒ์ด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ฌธ๋ฒ•์ด๋‹ค.

// JSX
<p>Hello, world!</p>
// Javascript
React.createElement("p", null, "Hello, world!");
// JSX
<p className="text">Hello, world!</p>
// Javascript
React.createElement("p", { className: "text" }, "Hello, world!");

JSX๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด JSX๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” Babel์ด๋ผ๋Š” ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. Babel์€ JSX๋ฅผ React.createElement๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค. typescript๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Babel์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

JSX ๋ฌธ๋ฒ•

  1. ํƒœ๊ทธ๋Š” ๊ผญ ๋‹ซํ˜€์•ผ ํ•œ๋‹ค. Why? JSX๊ฐ€ Javascript ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋  ๋•Œ ์ •ํ™•ํžˆ ์‹œ์ž‘๊ณผ ๋์„ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  2. ๋‘ ๊ฐœ ์ด์ƒ์˜ ํƒœ๊ทธ๋Š” ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ ธ ์žˆ์–ด์•ผ ํ•œ๋‹ค. why? ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‚˜์˜ DOM ํŠธ๋ฆฌ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค.

  3. JSX ์•ˆ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. JSX์•ˆ์—์„œ {}๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. JSX ์•ˆ์—์„œ if๋ฌธ, for๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. JSX๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์ด๊ธฐ ๋•Œ๋ฌธ์— if๋ฌธ, for๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  5. JSX ์•ˆ์—์„œ ์ฃผ์„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. {/* ์ฃผ์„ ๋‚ด์šฉ */}

  6. JSX ์•ˆ์—์„œ class ๋Œ€์‹  className์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  7. JSX ์•ˆ์—์„œ style์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. <div style={{color: 'red'}}></div>

  8. JSX ์•ˆ์—์„œ๋Š” camelCase๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. <div tabIndex="0"></div>


์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ์ 

๊ทธ๋™์•ˆ React์—์„œ JSX๋ฅผ ๋‹น์—ฐํ•˜๊ฒŒ ์จ์™”๋‹ค. ๋‹จ์ˆœํžˆ React์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์œผ๋กœ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ React๊ฐ€ ์•„๋‹ˆ์—ฌ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๊ผญ React์—์„œ JSX๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์ ์„ ์•Œ๊ฒŒ ๋๋‹ค. JSX๋กœ ๋งŒ๋“  ์ฝ”๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ Javascript๋กœ ๋ณ€ํ™˜๋˜๋Š”์ง€ ์•Œ๊ฒŒ๋๊ณ  ๋žœ๋”๋ง๊ณผ ์–ด๋–ป๊ฒŒ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š”์ง€ ์กฐ๊ธˆ ์ดํ•ด๊ฐ€ ๋œ ๊ฒƒ ๊ฐ™๋‹ค. ๋žœ๋”๋ง์ด ๋‚ด ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ๋•Œ๊ฐ€ ๋งŽ์•˜๋Š”๋ฐ Virtual DOM์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ React๊ฐ€ ์–ด๋–ป๊ฒŒ ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๊ณ  ๋žœ๋”๋ง ๋˜๋Š”์ง€ ์กฐ๊ธˆ ๋” ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.


๋” ๊ณต๋ถ€ํ•  ๊ฒƒ

Last updated