1. JSX
React์์ JSX๋ฅผ ์ฌ์ฉํ๋ ๋ชฉ์
Syntactic sugar
React.createElement
React Element
React StrictMode
VDOM(Virtual DOM)์ด๋?
DOM์ด๋?
DOM๊ณผ Virtual DOM์ ์ฐจ์ด
Reconciliation(์ฌ์กฐ์ ) ๊ณผ์ ์ ๋ฌด์์ธ๊ฐ?
๊ฐ์ ์ ๋ฆฌ
JSX
JSX is an XML-like syntax extension to ECMAScript XML์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ๋ฌธ๋ฒ ํ์ฅ์ด๋ค.
React๋ ๋ณ๋์ ํ์ผ์ ๋งํฌ์
๊ณผ ๋ก์ง์ ๋ถ๋ฆฌํ๋ ๋์ , ๋ ๋ค ํฌํจํ๋ ์ปดํฌ๋ํธ
๋ผ๊ณ
๋ถ๋ฅด๋ ๋์จํ๊ฒ ์ฐ๊ฒฐ๋ ์ ๋์ผ๋ก ๊ด์ฌ์ฌ
๋ฅผ ๋ถ๋ฆฌํ๋ค.
๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃฐ ๋ ๊ธฐ๋ณธ์ด ๋๋ ๊ธฐ์ JSX๋ ์์ฃผ ์ ํ๊ฒ ๋๋ค.
JSX๋ ๋ฆฌ์กํธ๋ฅผ ๋ง๋ค๋ฉด์ ๋์จ ๋ถ์ฐ๋ฌผ์ด์ง๋ง ๋ค๋ฅธ๊ณณ์์๋ ์ฌ์ฉํ ์ ์๋ค. ๋ฆฌ์กํธ๋ง์ ์ ์ ๋ฌผ์ ์๋์ง๋ง ๋ฆฌ์กํธ๊ฐ ์ ๋ช ํด์ง๋ฉด์ ์ฌ์ค์ JSX๊ฐ ๋ฆฌ์กํธ๊ฐ ๋๋ค.
JSX๋ XML์ฒ๋ผ ์์ฑ๋ ๋ถ๋ถ์ React.createElement๋ฅผ ์ฐ๋ ์ฝ๋๋ก ๋ณํํ๋ค.
XML์์๋ <br>
๊ฐ์ ํ๊ทธ๋ฅผ ๊ผญ ๋ซ์์ ์จ์ผํ๋ค, </br>
์ค๊ดํธ๋ฅผ ์จ์ JavaScript ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ธ ์ ์๊ณ , ๊ฒฐ๊ตญ์ JavaScript ์ฝ๋์ 1:1๋ก ๋งค์นญ๋๋ค.
Example 1
<p>Hello, world!</p>;
React.createElement('p', null, 'Hello, world!');
// @jsx๋ฅผ ์ฝ๋์ ์๋จ์ ์์ฑํ๋ฉด JSX๋ฅผ JS๋ก ๋ณํํ ๋ ์๋์ ๊ฐ์ด ์์ฑ๋๋ค.
// jsx๋ฅผ ๋ฆฌ์กํธ ์ธ๋ถ์์ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
/* @jsx r.createElement */
<p>Hello, world!</p>;
r.createElement('p', null, 'Hello, world!');
Example 2
<Greeting name="world" />;
React.createElement(Greeting, { name: 'world' });
Example 3
<Button type="submit">Send</Button>;
React.createElement(Button, { type: 'submit' }, 'Send');
Example 4
JSX์์๋ ์๋์ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
React Element๋ React.createElement ๋ฉ์๋๋ฅผ ์คํํ๊ธฐ ์ํด 1๊ฐ์ ๋ถ๋ชจ๋ง ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
<div>
๊ฐ์ ํ๊ทธ๋ก ๊ฐ์ธ์ฃผ๊ฑฐ๋ ๋ ๋๋ง๋๊ณ ๋์ ๋์ ํ๊ทธ๋ฅผ ์ฝ์
ํ๊ณ ์ถ์ง ์๋ค๋ฉด, React.Fragment๋ฅผ ์ด์ฉํ๋ค.
<React.Fragment></React.Fragment>
๋ ์์ ์๋ตํด์ <></>
์ด๋ ๊ฒ ์ธ ์ ์๋ค.
<p>Hello, world!</p>
<Button type="submit">Send</Button>
<>
<p>Hello, world!</p>
<Button type="submit">Send</Button>
</>
React.createELement(
React.Fragment,
null,
React.createElement('p', null, 'Hello, world!'),
React.createElement('Button', {type: "submit"}, 'Send'),
)
<div className="test">
<p>Hello, world!</p>
<Button type="submit">Send</Button>
</div>;
React.createElement(
'div',
{ className: 'test' },
React.createElement('p', null, 'Hello, world!'),
React.createElement(Button, { type: 'submit' }, 'Send'),
);
Example 5
jsx๋ ํ๊ทธ์์์ text์ JavaScript ๊ฐ์ผ๋ก๋ง ๊ตฌ๋ถ์ ํ๋ค, ์์๋ก ๊ณต๊ฐ์ ์ฃผ๋ ค๋ฉด
{' '}
์ ์ด์ฉํ๋ฉด createElement์ ์ถ๊ฐ๋๋ค.
// prettier-ignore
<div>
<p>Count: {' '} {count}!</p>
<button type="button" onClick={() => setCount(count + 1)}>
Increase
</button>
</div>;
React.createElement(
'div',
null,
React.createElement('p', null, 'Count: ', ' ', count, '!'),
React.createElement(
'button',
{ type: 'button', onClick: () => setCount(count + 1) },
'Increase',
),
);
React Element
JSX๋ React์ ์๋ createElement๋ฅผ ์ฌ์ฉํ๋๋ก ์ฝ๋๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ๊ฒ JSX์์ด๋ React๋ฅผ ์ฌ์ฉํ ์ ์๋ค, JSX๋ก ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ์์ JavaScript๋ก๋ ํ ์ ์๋ค. ํ์ง๋ง JSX๋ก ๋ฆฌ์กํธ ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ ์ฑ, ์์ฐ์ฑ ์ธก๋ฉด์์ ๋ชจ๋ ์ข๋ค๊ณ ์๊ฐํ๋ค.
createElement๋ React Element๋ฅผ ๋ง๋ค์ด๋ธ๋ค. Browser DOM์์๋ element๋ฅผ ๋ง๋๋ createElement๊ฐ ์๋ค.
// ๋ช
๋ นํ ๋ฐฉ์์ ์ฝ๋
document.createElement('div');
const element = document.createElement('div');
// ํ๊ทธ์ ๋จ์ผ ํด๋์ค๋ช
์ ์ง์ ํ ๋
element.className = 'test';
// ํ๊ทธ์ ๋ณต์์ ํด๋์ค๋ช
์ ์ง์ ํ ๋
element.classList = 'test, good';
element.classList = ['test', 'good'].join(' ');
element.appendChild(document.createElement('p'));
JSX๋ React Element ํธ๋ฆฌ๋ฅผ ๊ฐฑ์ ํ๋๋ฐ ์ธ ์ ์๋ค.
React.createElement๋ฅผ ์ง์ ์ฐ๋ฉด ํ๋ค๊ธฐ ๋๋ฌธ์ jsx-runtime์์๋ _jsx, Preact๋ h๋ ํจ์๋ฅผ ์ง์ํ๋ค.
React Developer Tools
chrome์ extension์ด๋ค. ์ปดํฌ๋ํธ ๊ตฌ์กฐ๋ state์ ๋ณํ๋ฅผ ํ์ธํ ์ ์๊ณ , ๋ฆฌ๋ ๋๋ง ๋๋ ์ปดํฌ๋ํธ๋ ํ์ธํ ์ ์๋ค.
VDOM (Virtual DOM)
DOM๊ฐ์ ๊ฐ์์ DOM์ ๋ง๋ค์ด์ ์ฐ๋ ๊ฒ์ด๋ค. React์์๋ ๋ฐ๋ก DOM์ ์กฐ์ํ๋ ๊ฒ์ด ์๋๋ผ Virtual DOM Tree๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ค. ์ค์ DOM๊ณผ ๋๊ธฐํ๋ฅผ ํด์ค๋ค, ์ด ๊ณผ์ ์ ์ฌ์กฐ์ (Reconciliation)์ด๋ผ๊ณ ํ๋ค. VDOM๊ณผ Real DOM์ ๋น๊ตํ๋ฉด์ ๋ฐ๋ ๋ถ๋ถ๋ง ๋ณ๊ฒฝ์์ผ์ค๋ค.
VDOM์ ์ฐ๋ฉด ์ผ์ 2๋ฒ ํ๋ ๊ฒ์ด๋ค, ๋ฐ๋ก DOM์ ๋ฐ์ํด์ฃผ๋ฉด ๋ ํ ๋ฐ ์ VDOM์ ์ธ๊น?
VDOM์ ์ฐ๋ ์ด์ ?
๋ฏธ์ : React๋ DOM๋ณด๋ค ๋น ๋ฅด๋ค. ํ์ค: VDOM์ ์ ์ง๋ณด์ํ๊ธฐ ์ข์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด์ฃผ๊ณ ์ถฉ๋ถํ ๋น ๋ฅด๋ค.
VDOM์ ์ ๊ทผ ๋ฐฉ์์ด React์ ์ ์ธ์ API๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
๋ช
๋ นํ์ผ๋ก DOM์ ๋ค๋ฃจ๋ ๊ฒ์ ๋ฐ๋ณต์ ์ธ ์ฝ๋, ๊ฐ๋
์ฑ, ์๋๋ฅผ ๋๋ฌ๋ด๋ ์ฝ๋๋ฑ ๋ค์ํ ์ ์์ ์ข์ง ์๋ค๊ณ ์๊ฐํ๋ค.
์ ์ต์ ์ธ ํ๋ก๊ทธ๋๋ฐ์ ์๋๋ฅผ ๋์ฑ ๋ช ํํ๊ฒ ๋๋ฌ๋ด๊ณ ๊ฐ๋ ์ฑ์ด ์ข์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. JSX๋ฅผ ์์ฑํ๋ฉด ๋ฆฌ์กํธ๊ฐ ๊ทธ๋๋ก DOM์ ๋ฐ์ํด์ค๋ค, ๋ฐ์ํ๋ ํ์์ ๋ํด์๋ ์ ๊ฒฝ์ธ ํ์๊ฐ ์๋ค.
VDOM์ด ๋ฌด์์ด๊ณ , ์ ์ฐ๋์ง ์๋ค๋ฉด ํ์ฉํ ์ ์๋ ์ต์ ํ ๊ธฐ๋ฒ์ด ์กด์ฌํ๋ค.
์ฑ๋ฅ ์ต์ ํ
๋ฆฌ์กํธ์์์ ์ฑ๋ฅ ์ต์ ํ๋ ๋ฐฉ์์ด ๋ค์ํ๋ค.
์ ๋๋ก๋ ์ดํด๋ฅผ ๋ฐํ์ผ๋ก ์ํฉ์ ๋ง๋ ์ต์ ํ๋ฅผ ์งํํด์ผ ํ๋ค.
useMemo
, useCallback
๋ฑ์ ์บ์ฑ ์์ด๋ ์ปดํฌ๋ํธ ๊ตฌ์กฐ์
๋ถ๋ฆฌ๋ง์ผ๋ก๋ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ค.
๊ณต์ ๋ฌธ์
์ฑ์ ๋ฐฐํฌํ ๋๋ ํ๋ก๋์ ๋น๋๋ฅผ ์ฌ์ฉํด์ ์ฑ์ ์ต์ํํด์ผํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌ์กํธ๋ ๋์์ด ๋๋ ๊ฒฝ๊ณ ๋ค์ ๋ง์ด ํฌํจํ๊ณ ์๋ค. ์ด๋ฌํ ๊ฒฝ๊ณ ๋ค์ ๊ฐ๋ฐ์์๋ ๋งค์ฐ ์ฉํ์ง๋ง ๋ฆฌ์กํธ๋ฅผ ํฌ๊ณ ๋๋ฆฌ๊ฒ ๋ง๋ ๋ค. ๋ฐ๋ผ์ ์ฑ์ ๋ฐฐํฌํ ๋๋ ํ๋ก๋์ ๋ฒ์ ์ ์ฌ์ฉํด์ ๋ฐฐํฌํด์ผ ํ๋ค.
๋ง์ฝ ํ๋ก๋์
๋ฒ์ ์ผ๋ก ์ ๋๋ก ๋ฐฐํฌ๋์๋์ง ํ์ธํ๊ณ ์ถ๋ค๋ฉด React Developer Tools for Chrome
์
์ค์นํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ํ์ธํ ์ ์๋ค.
Last updated