๐ ๋ฆฌ์กํธ๋ ์ด๋ป๊ฒ ๋ ๋๋ง์ ํ ์ ์์๊น?
์ฌํ์ ์ค๋ช ์์์ด ๋ฆฌ์กํธ๋ฅผ ์คํํ๋ฉด ๊ต์ฅํ ํผ๋์ค๋ฌ์์ง๋๋ค.
HTML์ ์์ฑํด์ผํ๋๋ฐ ์ด๋์ ์์ฑํ ์ง.. ํด๋๋ ๋ ์์ด๋ฆฌ๋ง์์ง...
๊ทธ๋ฌ๋ค ์ด์ App.js์ ์ ์ผ๋ผ๋ ์ด๋๊ฐ์ ์ค๋ช ์ ๋ณด๊ณ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ฆฌ์กํธ ์ฌ์ฉ์ด ๋๋๋ฐ์.
๊ทธ๋ฐ๋ฐ ์ด๋ป๊ฒ JSํ์ผ์ ์ ์๋๋ฐ ํ๋ฉด์ ๋ ๋๋ง์ด ๋๋์ง ๊ถ๊ธํฉ๋๋ค.
์ด๋ป๊ฒ ์ด๋ฐ ์ผ์ด ๊ฐ๋ฅํ ๊น์??
๐ญ Virture DOM
๋ฆฌ์กํธ์์๋ ์ค์ DOM์ ๋ฐ๋ก ์์๋ฅผ ์ฐ๊ฒฐ์ํค๋ ๊ฒ์ด ์๋ ๊ฐ์ DOM์ ๋จผ์ ์ฐ๊ฒฐ์ ์ํต๋๋ค.
๊ฐ์ DOM์ด๋ ๋ฉ๋ชจ๋ฆฌ ์์ DOMํธ๋ฆฌ๋ฅผ ๋ปํฉ๋๋ค. ์ค์ DOM์ ๋จ์ํ ์ํจ ๊ฐ๋ ์ ๋๋ค.
๋ง์ฝ ์ ๋ฐ์ดํธ๊ฐ ์ผ์ด๋๋ฉด ๊ฐ์DOM๋ผ๋ฆฌ ๋น๊ต๋ฅผ ํ๋ค์ ์ ๋ฐ์ดํธ๋ฅผ ํฉ๋๋ค
๋น์ ํ์๋ฉด ๊ฐ์ DOM์ ์ด์์ด๊ณ ์ค์ DOM์ ์ต์ข ๋ณธ ๊ฐ์ ๋๋์ ๋๋ค.
๐ฅ๏ธ ๋ ๋๋ง
๋ฆฌ์กํธ๋ก ๊ตฌํ๋๋ ๋ ธ๋๋ค์ root๋ ธ๋์์์ ๊ด๋ฆฌ๊ฐ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์์๋ฅผ ๋ง๋ค๊ณ root๋ ธ๋์ ๋ถ์ธ๋ค์ ๋ ๋๋ง์ ํ๋ ์์๋ก ์ด์ด์ง๊ฒ ๋ฉ๋๋ค.
๋ ์์๋ HTML๊ณผ๋ ๋ค๋ฅด๊ฒ ๋ฆฌ์กํธ์์๋ ์ผ๋ฐ๊ฐ์ฒด๋ก ๊ด๋ฆฌ๊ฐ๋ฉ๋๋ค.
์ค์ ๋ก ๋ฒํผ์ ํ๋ ๋ง๋ค๊ณ ์ถ๋คํ๋ฉด ๋ฐ์ ์ฝ๋๋ก ๋ง๋ญ๋๋ค.
const btn = createElement('button'.{type="button"},click'
createElement('HTMLํ๊ทธ',{ ํ๊ทธ์์๋ค์ด๊ฐ ์์ฑ๊ณผ ์์ฑ๊ฐ}, ํ๊ทธ ์์ ๋ค์ด๊ฐ ๋ด์ฉ }
์ผ๋ฐ๊ฐ์ฒด๋ ์์๊ฐ์ ์ฝ๋๋ก ์ด๋ฃจ์ด์ง๋๋ค.
์์๋ฅผ ๋ง๋ค์๋ค๋ฉด root๋ ธ๋์ ๋ถ์ ๋๋ค.
const root = document.getElementById('app')
const elem = root.createRoot(btn)
elem.render(btn)
โ ์กฐ๊ฑด๋ถ ๋ ๋๋ง
ํน์ ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๋ ๋๋ง์ ๋ค๋ฅด๊ฒ ํด์ผํ ๋ ์ด๋ฅผ ์กฐ๊ฑด๋ถ๋ ๋๋ง์ด๋ผ ๋ถ๋ฆ ๋๋ค.
๋ฆฌ์กํธ์์๋ if๋ฌธ๋์ ์ผํญ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๊ฐ๋จํ ์กฐ๊ฑด์์ ์ฒ๋ฆฌํ์ฌ ๋ ๋๋ง ํ ์ ์์ต๋๋ค
์ผํญ์ฐ์ฐ์ : ์กฐ๊ฑด? ์ฐธ : ๊ฑฐ์ง
function Item({ name, isPacked }) {
return (
<li className="item">
{name} {isPacked ? 'โ
':'โ"}
</li>
);
}
๋ง์ฝ ์กฐ๊ฑด๋ฌธ์ด ๊ฑฐ์ง์ผ ๋ โ๋ ๋์ฐ๊ณ ์ถ์ง ์์๊ฒ๋๋ค.
์ด๋ด๋๋ ''์ด๋ null๋ก ์ฒ๋ฆฌํด์ค๋ ๋์ง๋ง &&์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค
&&์ฐ์ฐ์์ ํน์ง์ ์ดํด๋ณด์๋ฉด,
- && ์ฐ์ฐ์๋ falsyํ ๊ฐ์ ๋ฐํํฉ๋๋ค.
- ๋ง์ฝ falsyํ ๊ฐ์ด ์๋ค๋ฉด ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ์ ๋ฐํํฉ๋๋ค.
์์ ์ฝ๋๋ฅผ &&์ฐ์ฐ์๋ฅผ ์ด์ฉํด ์์ฑํด ๋ณธ๋ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
function Item({ name, isPacked }) {
return (
<li className="item">
{name} {isPacked && 'โ
'}
</li>
);
}
๊ทธ๋ฐ๋ฐ &&์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋๋ ์ฃผ์์ ์ด ์์ต๋๋ค.
falsyํ ๊ฐ์ ๋ฐํํด์ค๋ค๊ณ ํด์ 0์ ์ ๋ ฅํ๋ฉด ํ๋ฉด์ ์ง์ง๋ก ์ซ์ 0์ ๋์์ค๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ํ๊ฐ ๋ณํ๋ count๋ณ์ ๊ฐ์๊ฒ์ ์ฌ์ฉํ ๋ ์กฐ๊ฑด๋ฌธ์ ํตํด์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค
function Item({ name, importance }) {
return (
<li className="item">
{name} {importance > 0 && importance]
</li>
);
}
export default function PackingList() {
return (
<section>
<h1>Sally Ride's Packing List</h1>
<ul>
<Item
importance={9}
name="Space suit"
/>
<Item
importance={0}
name="Helmet with a golden leaf"
/>
<Item
importance={6}
name="Photo of Tam"
/>
</ul>
</section>
);
}
๐ ๋ฆฌ์คํธ ๋ ๋๋ง
๋น์ทํ๊ฒ ์๊ธด UI๋ฅผ ๋ฐ๋ณตํด์ ๋ ๋๋งํ๋ค๊ณ ๊ฐ์ ํ์๋, ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋๋ง๋ค ์๋์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ๋ค ์ญ์ ํ๋ค ํ๋ฉด
๋งค์ฐ ๋นํจ์จ์ ์ธ ์ผ์ด๋ฉ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ UI๋ฅผ ๋ ๋๋ง ์ํฌ์ ์๋๋ฐ ์ด๊ฒ์ ๋ฆฌ์คํธ๋ ๋๋ง์ด๋ผ๊ณ ํฉ๋๋ค.
export const recipes = [{
id: 'greek-salad',
name: 'Greek Salad',
}, {
id: 'hawaiian-pizza',
name: 'Hawaiian Pizza',
}, {
id: 'hummus',
name: 'Hummus',
}];
์์ ๊ฐ์ ๋ฐฐ์ด๋ก ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ๋ณต์ ์ธ UI๋ฅผ ์ถ๋ ฅ ํ ์ ์์ต๋๋ค
๊ทธ๋ฐ๋ฐ ๋ฆฌ์คํธ๋ ๋๋ง ํ ๋ ํญ์ key๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค
ํค๊ฐ ์๋ค๋ฉด ์ปดํจํฐ๋ ๋ฐฐ์ด๋ฉ์๋์ ๋ฒํธ๋ฅผ ์ธ๋ฑ์ค๋ก ๋จ๊น๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๋ฐฐ์ด์ด ๋ณํ๋ ๋ ์ธ๋ฑ์ค ๋๋ฒ๋ ๋ค์ฃฝ๋ฐ์ฃฝ์์ฌ์ ์ปดํจํฐ๋ ๋ฌด์์ด ๊ฐ๋ฐ์๊ฐ ์ํ๋ ์์์ธ์ง ์์ง ๋ชปํฉ๋๋ค.

์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฆฌ์คํธ ๋ ๋๋ง์ํด๋ณด๋ฉด ์๋ ์ฝ๋์ ๊ฐ์ต๋๋ค.
import { recipes } from './data.js';
export default function RecipeList() {
return (
<div>
<h1>Recipes</h1>
{
recipes.map(item =>
<h2 key = {item.id}>{item.name}</h2>
}
</div>
);
}
๐ ์ปดํฌ๋ํธ ๋ ๋๋ง
์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํ๊ธฐ์ ๋ฆฌ์กํธ๋ ๋ฐ๋ก ์ค์ DOM์ ์ฐ๊ฒฐ์ํค์ง ์๊ณ ๋ฆฌ์กํธ์์ ์์ฒด์ ์ผ๋ก ํ๋ฒ ๊ฒ์ด์ ํฉ๋๋ค.
์ด ๊ณผ์ ์ ํตํด์ ์ค์ ํ๋ฉด์ ๋ ๋๋ง์ด ๋๋๋ฐ 3๋จ๊ณ๋ก ์ค๋ช ๋ ์ ์์ต๋๋ค.
1. ๋ ๋๋ง ํธ๋ฆฌ๊ฑฐ
๋ ๋๋ง์ ์์ํ ์ ์๊ฒํ๋ ๋ฐฉ์์ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค.
๋ ๋๋ง ํธ๋ฆฌ๊ฑฐ๋ ๋๊ฐ์ง์ ์ํด ๋ฐ๋ ๋ฉ๋๋ค.
์ฒซ ์งธ๋ก, ํ๋ฉด์ ์ฒ์ ๋ ๋๋ง์ ํ ๋ ๋ฐ๋๋๊ณ
๋๋ฒ์งธ๋ก, state๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ฉด ๋ ๋๋ง ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ฐ๋๋ฉ๋๋ค
2. ์ปดํฌ๋ํธ๋ ๋๋ง
๋ ๋๋ง ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ์์ผ๋ฉด ๋ฆฌ์กํธ๋ root์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๊ทธ ํ, ์ ๋ฐ์ดํธ๋ ์ปดํฌ๋ํธ์ root์ปดํฌ๋ํธ์ ๋ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ์ฌ ์ต๊ทผ ๋ ๋๋ง๋ ๋ค๋ฅธ ๋ถ๋ถ๋ง์ ๊ฐ์ ธ์ต๋๋ค.
3. DOM์ ์ปค๋ฐ
๊ธฐ์กด์ ์ปดํฌ๋ํธ์ ๋ค๋ฅธ์ ์ ๋ฐ๊ฒฌํ๋ค๋ฉด ์ค์ DOM์ ์ปค๋ฐํฉ๋๋ค.
์ฌ๊ธฐ์ ์ปค๋ฐ์ ๊นํ๋ธ์์ ์ปค๋ฐํ๋ค์ ๋์ผํ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [React] ๋ ๋๋ง ์ค๋ ์ท๊ณผ ์ ๋ฐ์ดํธ (0) | 2025.07.15 |
|---|---|
| [React] sideEffect (0) | 2025.07.09 |
| [React] ๋ฆฌ์กํธ๋ ๋ญ๊น? (0) | 2025.07.06 |
| [React] useEffect ์ฌ์ฉํ๊ธฐ (0) | 2025.05.13 |
| [React] ๋ผ์ฐํฐ์ ๋ช ๊ฐ์ง ๋ฌธ๋ฒ (0) | 2025.04.27 |