React๋ ํ๋ก ํธ์๋์ ์ฌ๊ณ ๋ฐฉ์์ ์์ ํ ๋ฐ๊พผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. DOM์ ์ง์ ๋ค๋ฃจ๋ imperative ๋ฐฉ์์์ ์ปดํฌ๋ํธ๋ฅผ ํตํด UI๋ฅผ ์ ์ธ์ ์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ์์ผ๋ก ์ ํ์์ผฐ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ํต์ฌ์๋ JSX๋ผ๋ ๋ ํนํ ๋ฌธ๋ฒ์ด ์๋ค.
JSX๋ ์ฒ์๋ณด๋ฉด, HTML๊ณผ Javascript๋ฅผ ์์ ์กฐ๊ธ ์ด์ํ ๋ชจ์ต(ใ ใ )์ผ๋ก ๋ณด์ธ๋ค. ํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ ๋๋ผ์ด ์ผ๊ด์ฑ๊ณผ ํจ์จ์ฑ์ ๊ฐ์ถ ๋ฌธ๋ฒ์ด๋ค. ์ค๋์ React์ JSX๊ฐ ์ ๋ฑ์ฅํ๊ณ , ์ด๋ค ์ฒ ํ๊ณผ ๊ตฌ์กฐ๋ก ์ค๊ณ๋์๋์ง ์์๋ณธ๋ค
React์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ - DOM ์ง์ฅ ํ์ถํ๊ธฐ
2010๋ ๋ ์ด๋ฐ, ํ๋ก ํธ์๋์ ๋ณต์ก๋๋ ๊ธ๊ฒฉํ ์ฆ๊ฐํ๋ค. DOM ์กฐ์์ ์ ์ ์ด๋ ค์์ก๊ณ ์ํ์ ๋ทฐ๋ฅผ ์๋์ผ๋ก ๋๊ธฐํํ๋ ์ฝ๋๊ฐ ๋์ณ๋ฌ๋ค.
const div = document.createElement('div');
div.innerText = user.isLoggedIn ? '๋ก๊ทธ์์' : '๋ก๊ทธ์ธ';
parent.appendChild(div);
- ์ํ๊ฐ ๋ฐ๋๋ฉด? -> ์ง์ DOM ๋ค์ ์์ ํด์ผ ํจ
- UI๊ฐ ๋ณต์กํด์ง์๋ก ์ฝ๋๋ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์ด๋ฌ๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํ์ถํ๊ธฐ ์ํด, React๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐ์์ ๋์ ํ์๋ค.
์ํ๊ฐ ๋ฐ๋๋ฉด ์ ์ฒด UI๋ฅผ ๋ค์ ๋ ๋๋งํด๋ ๋์ง ์์๊น?
์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋ฅํ๊ฒ ํ ๊ฒ์ด Virtual DOM์ด๋ค. ์ค์ DOM ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ DOM ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ ๋ณ๊ฒฝ ์ ํ๋ฅผ diffingํ๊ณ , ์ค์ DOM์๋ ์ต์ํ์ ๋ณ๊ฒฝ๋ง ์ ์ฉํ๋ ๋ฐฉ์์ด๋ค.
์ด ์ฒ ํ์ ๊ธฐ๋ฐ์ผ๋ก, React๋ ๋ค์์ ์ ์ํ์๋ค.
- UI = ์ํ์ ๋ฐ๋ฅธ ํจ์์ ๊ฒฐ๊ณผ
- ๋ณ๊ฒฝ์ด ์๊ธฐ๋ฉด ์ปดํฌ๋ํธ ๋ค์ ํธ์ถ(re-render)
- React๊ฐ ํจ์จ์ ์ผ๋ก DOM patching ์ํ
JSX์ ๋ฑ์ฅ - UI๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ค
React์ ํต์ฌ์ UI๋ฅผ ํจ์๋ก ํํํ๋ ๊ฒ์ด๋ค.
function Button(props) {
return React.createElement('button', null, props.label);
}
๊ทธ์น๋ง ์ด๋ฐ ์ฝ๋๋ ๋๋ฌด ์ฅํฉํ๋ค. ๊ฒฐ๊ตญ HTML๊ณผ ๋น์ทํ UI ๊ตฌ์กฐ๋ฅผ ํํํ๊ณ ์ถ์ด์ง๋ค. ๊ทธ๋์ ๋ฑ์ฅํ ๊ฒ์ด JSX์ด๋ค.
JSX๋ syntactic sugar
<Button label="Click me" />
๋ ๋ค์๊ณผ ๊ฐ์ JS์ฝ๋๋ก ๋ณํ๋๋ค.
React.createElement(Button, { label: 'Click me' });
์ฆ, JSX๋ React.createElement ํธ์ถ์ ์งง๊ฒ ์ฐ๋ ๋ฌธ๋ฒ์ด๋ค. HTML์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ Javascript ์ฝ๋๋ค. ๊ทธ๋์ ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ, ๋ณ์ ์ฝ์ ์ด ์์ ๋กญ๋ค.
JSX์ ์ง์ง ์ฅ์ - ์ ์ธํ UI์ ํธ๋ฆฌ ๊ตฌ์กฐ ํํ
JSX์ ๋ฑ์ฅ์ ๋จ์ํ ๋ฌธ๋ฒ์ ํธ์์ฑ์ ๋์ด์, UI๋ฅผ ํธ๋ฆฌ ํํ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ๋ช ์ํ ์ ์๊ฒ ๋ง๋ค์๋ค.
UI๋ฅผ ํ๋์ ํธ๋ฆฌ๋ก ๋ฐ๋ผ๋ณด๋ ์ฌ๊ณ ๋ฐฉ์
<App>
<Header />
<Main>
<Article />
<Sidebar />
</Main>
<Footer />
</App>
์ด๊ฑด ๋จ์ํ ํ๊ทธ ๋์ด์ด ์๋๋ค! ์ด ์์ฒด๊ฐ UI ํธ๋ฆฌ๋ค. ๋ฐ์ดํฐ๋ก ๋ณผ ์ ์๊ณ , ์ํํ๊ฑฐ๋ ๋ณํํ๊ฑฐ๋ ๋น๊ตํ ์ ์๋ ๊ตฌ์กฐ๋ค. React๋ ์ด๋ฅผ ๋ด๋ถ์ ์ผ๋ก Virtual DOM์ผ๋ก ๊ตฌ์ฑํ ํ diffing & patching์ ์ํํ๋ค.
Babel ํธ๋์คํ์ผ๋ง
๋ธ๋ผ์ฐ์ ๋ JSX๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ์ฝ๋๋ ๋ฐ๋์ babel์ ํตํด ๋ณํ๋์ด์ผ ํ๋ค.
<Button label="Hi" />
⇓
React.createElement(Button, { label: 'Hi' });
์ด ๊ณผ์ ๋๋ถ์ ์ฐ๋ฆฌ๋ HTML-like ๋ฌธ๋ฒ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ ์ ์๊ณ , ๋์์ ํ์ ์์คํ ๊ณผ ESLint, Prettier ๊ฐ์ ๋๊ตฌ๋ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
JSX ๋ด๋ถ ๋์ ๋ฐฉ์
JSX๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฐ๊ตญ ์๋์ ๊ฐ์ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๋ค.
{
type: 'button',
props: {
children: 'ํด๋ฆญ',
onClick: () => alert('clicked'),
},
key: null,
ref: null,
$$typeof: Symbol(react.element)
}
์ฆ, JSX๋ ReactElement๋ฅผ ์์ฑํ๋ ์ผ์ข ์ ๋น๋๋ค. ์ด ReactElement๋ Virtual DOM ํธ๋ฆฌ์ ๋ ธ๋๊ฐ ๋๋ฉฐ, ๋ฆฌ๋ ๋๋ง ์ diff์ ๊ธฐ์ค์ด ๋๋ค.
JSX vs Template ๋ฌธ๋ฒ
Vue, Angular๋ HTML ํ ํ๋ฆฟ ๊ธฐ๋ฐ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค. ๋ฐ๋ฉด React๋ JSX๋ฅผ ํตํด UI๋ Javascript์ ์ผ๋ถ๋ก ๊ฐ์ฃผํ๋ค. ์ด ๋ฐฉ์์๋ ๊ฐ๋ ฅํ ์ฅ์ ์ด ์๋ค.
//์กฐ๊ฑด๋ฌธ
{isLoggedIn && <LogoutButton />}
//๋ฐ๋ณต๋ฌธ
{items.map(item => <Item key={item.id} {...item} />)}
//์์ ๋ถ๋ฆฌ
const controls = <ControlPanel />;
return <Header right={controls} />;
ํ ํ๋ฆฟ ๋ฌธ๋ฒ์์๋ ์ด ๋ชจ๋ ๊ฑธ ๋ณ๋์ ๋ฌธ๋ฒ์ผ๋ก ํด๊ฒฐํด์ผ ํ์ง๋ง, JSX๋ JS๋ก ํด๊ฒฐํ๋ค.
JSX์ ๋จ์
- HTML๊ณผ ๋น์ทํ๋ ์์ ํ ๊ฐ์ง๋ ์๋ค.
- Babel ์ค์ ํ์(ํธ๋์คํ์ผ ๋จ๊ณ ์ถ๊ฐ)
- ํ์ ์คํฌ๋ฆฝํธ์ ํจ๊ป ์ฐ๋ ค๋ฉด ์ถ๊ฐ ์ค์ ํ์
ํ์ง๋ง ๋๋ถ๋ถ ๋จ์ ์ด๋ผ๊ณ ํ ๋งํ ๊ฒ๋ค์ ํ๊ฒฝ ์ ์ ๋ฌธ์ ๊ณ , ๋ฑํ ๋จ์ ๋ ์๋๊ธด ํจ. ์ฅ๊ธฐ์ ์ผ๋ก ๋ณด๋ฉด JSX์ ์ผ๊ด์ฑ๊ณผ ํ์ฅ์ฑ์ ์ด์ ์ด ๋ ํฌ๋ค.
React์ JSX๋ UI๋ฅผ ๋ฐ์ดํฐ์ฒ๋ผ ๋ค๋ฃฐ ์ ์๊ฒ ๋ง๋ ์ฌ๊ณ ๋ฐฉ์์ ์ ํ์ด๋ค. imperative → declarative, mutable DOM → immutable state, ์๋ ๋ ๋๋ง → ์๋ ๋ฆฌ๋ ๋๋ง์ผ๋ก์ ์ ํ์ด๋ค.
JSX๋ ์ด ํจ๋ฌ๋ค์์ ํํํ๋ ๊ฐ์ฅ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ด๋ค. ๋จ์ํ ๋ฌธ๋ฒ์ด ์๋๋ผ, UI๋ฅผ ์ฝ๋๋ก ์์ ํ๋ ์๋ก์ด ์ธ์ด๋ค. React๋ฅผ ์ ๋๋ก ์ดํดํ๊ณ ์ฐ๊ธฐ ์ํด์๋ JSX๊ฐ ๋จ์ํ HTML์ด ์๋์ ๋ช ํํ ์ธ์ํด์ผ ํ๋ค.
'๐๏ธํ๋ก๊ทธ๋๋จธ์ค ๋ฐ๋ธ์ฝ์ค > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐ๋ธ์ฝ์ค] Redux (2) | 2025.06.16 |
---|---|
[๋ฐ๋ธ์ฝ์ค] React ๊ธฐ์ด ํต์ฌ ์ ๋ฆฌ(state, ๊ตฌ์กฐ ๋ถํด ํ ๋น, ์ปดํฌ๋ํธ ๋ฐ๋ณต) (1) | 2025.06.15 |
[๋ฐ๋ธ์ฝ์ค] ํ์ ์คํฌ๋ฆฝํธ: ๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ถํฐ ํด๋์ค๊น์ง (0) | 2025.06.11 |
[๋ฐ๋ธ์ฝ์ค] ํ์ ์คํฌ๋ฆฝํธ ๊ธฐ์ด(ํ์ , ์ธํฐํ์ด์ค, ์ด๊ฑฐํ) (1) | 2025.06.10 |
[๋ฐ๋ธ์ฝ์ค] ๊ฐ์ฒด์งํฅ ์ธ์ด (3) | 2025.06.04 |