์์ฆ ๋ค์ Advanced React๋ฅผ ์ฝ์ผ๋ฉฐ, React์์ key๊ฐ DOM ์ฌ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์ด๋ป๊ฒ ๊ฒฐ์ ์ง๋์ง์ ๋ํ ๋ด์ฉ์ ๋ํด ์ ๋ฆฌํด๋ณด์๋ค.
ํ์ ๋น๊ต๋ "DOM ์ฌ์ฌ์ฉ" ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค.
const App = () => {
const [isMarketMember, setIsMarketMember] = useState(false);
....
return (
<>
{isMarketMember ? (
<Input
id="market-id"
placeholder="Enter your Market ID"
onChange={handleMarketIdChange}
/>
) : (
<Input
id="user-name"
placeholder="Enter your Name"
onChange={handleNameChange}
/>
)}
</>
);
};
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด isMarketMember ๊ฐ์ ๋ฐ๋ผ <Input /> ์ปดํฌ๋ํธ๊ฐ ๋ฐ๋๋ ๋์์ ๋น์ฐํ ๊ธฐ๋ํ์ง๋ง, ์ค์ ์ฌ์ฉ์ ๊ฒฝํ์์๋ ์ ๋ ฅ๊ฐ์ด ์ ์ง๋๋ค. ์ฆ, Market ID๋ฅผ ์ ๋ ฅํ ๋ค ์ฒดํฌ๋ฐ์ค๋ฅผ ํด์ ํ๋ฉด Name ์ ๋ ฅ์ฐฝ์ด ๋์ค๋๋ฐ, ๋ฐฉ๊ธ ์ Market ID ํ๋์ ์ ๋ ฅํ๋ ๊ฐ์ด ๊ทธ๋๋ก ๋ณด์ธ๋ค.
์ ์ ๋ ฅ๊ฐ์ด ์ ์ง๋ ๊น?
์ด ํ์์ React๊ฐ ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, ๋ฆฌ๋ ๋๋ง์ ์ผ์ด๋ฌ์ง๋ง ๊ธฐ์กด DOM ๋
ธ๋๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ input์ ๋ด๋ถ ์ํ๊ฐ ๊ทธ๋๋ก ๋จ์์๋ ๊ฒ์ด๋ค.
๋ฆฌ์กํธ ๋์์ ์ดํด๋ณด์.
React๋ JSX๋ฅผ ๋ค์๊ณผ ๊ฐ์ ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
<Input
id="market-id"
placeholder="Enter your Market ID"
onChange={handleMarketIdChange}
/>
์ ์ฝ๋๋ ๋ด๋ถ์ ์ผ๋ก ๋ค์์ฒ๋ผ ๋ณํ๋๋ค.
React.createElement(Input, {
id: 'market-id',
placeholder: 'Enter your Market ID',
onChange: handleMarketIdChange,
});
์ฆ, JSX๋ ๊ฒฐ๊ตญ React.createElement(type, props)๋ก ๋ณํ๋๋ฉฐ, React๋ ์ด type ๊ฐ์ ๊ธฐ์ค์ผ๋ก "๊ฐ์ ์ปดํฌ๋ํธ์ธ์ง"๋ฅผ ํ๋จํ๋ค.
- ํ์ ์ด ๊ฐ๋ค๋ฉด = ๊ฐ์ ์ปดํฌ๋ํธ
- ๊ฐ์ ์ปดํฌ๋ํธ๋ผ๋ฉด = ๊ธฐ์กด DOM ๋ ธ๋๋ฅผ ์ฌ์ฌ์ฉ
- props๋ง ๋ฐ๋์๋ค๋ฉด = DOM์ ๊ทธ๋๋ก ๋๊ณ ๋ณ๊ฒฝ๋ง ์ ์ฉ
๊ฒฐ๊ณผ์ ์ผ๋ก, <Input />์ด JSX ์์์ ์กฐ๊ฑด๋ฌธ์ผ๋ก ๊ฐ์ธ์ก๋๋ผ๋ React ์ ์ฅ์์๋ ๋งค๋ฒ ๋์ผํ Input ํ์ ์ด๋ฏ๋ก, ๊ฐ์ ์ปดํฌ๋ํธ๋ผ๊ณ ๊ฐ์ฃผํ์ฌ ๊ธฐ์กด DOM์ ์ฌ์ฌ์ฉํ๊ณ , ๋ด๋ถ ์ํ๋ ๊ทธ๋๋ก ์ ์ง๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น?
key๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. React์๊ฒ ๋ ์ปดํฌ๋ํธ๊ฐ ์์ ํ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์๋ ค์ฃผ๊ณ ์ถ๋ค๋ฉด, ๊ณ ์ ํ key ๊ฐ์ ์ง์ ํด์ค์ผ ํ๋ค.
{isMarketMember ? (
<Input
key="market"
id="market-id"
placeholder="Enter your Market ID"
onChange={handleMarketIdChange}
/>
) : (
<Input
key="personal"
id="user-name"
placeholder="Enter your Name"
onChange={handleNameChange}
/>
)}
์ด๋ ๊ฒ key๊ฐ ๋ค๋ฅด๋ฉด React๋ ์ด์ ์ ๋ ๋๋ง ๋ DOM ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๊ณ , ์๋ก์ด ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ์์ฑํ๋ค. ๋ฐ๋ผ์ <Input key="market" />์ <Input key="personal" /> ์ ๋์ผํ ์์น์ ์๋๋ผ๋ ์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ์ธ์๋๋ค.
๊ทธ ๊ฒฐ๊ณผ, ์ ํ์ด ์ผ์ด๋ ๋ ๊ธฐ์กด ์ปดํฌ๋ํธ๋ฅผ ์ธ๋ง์ดํธ ํ๊ณ , ์๋ก์ด ์ปดํฌ๋ํธ๋ฅผ ๋ง์ดํธ ํ๊ฒ ๋์ด input value๊ฐ ์ด๊ธฐํ๋๋ค.
์ฆ, type์ด ๋ค๋ฅด๊ฑฐ๋ key๊ฐ ๋ค๋ฅด๋ฉด, React๋ ๋์ผํ ์์น์ ์๋๋ผ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ๊ฐ์ฃผํ๊ณ ๊ธฐ์กด DOM ๋ ธ๋๋ฅผ ์ ๊ฑฐํ ๋ค ์๋กญ๊ฒ ์์ฑํ๋ค.
key์๋ ์ ๋ํฌํ ๊ฐ์ ๋ฃ์ด์ผ ํ๋ค.
์ด ๋ง์ ๋จ์ํ ๊ท์น์ด ์๋๋ผ, React๊ฐ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํ ํต์ฌ ์์น์ด๋ค. ํนํ ์ ๋ ฌ์ด ๊ฐ๋ฅํ๊ฑฐ๋, ์ฌ์ฉ์๊ฐ ๋๋๊ทธ๋ก ๋ฆฌ์คํธ์ ์์๋ฅผ ๋ฐ๊พธ๋ UI์์๋ ํด๋น ์์น์ด ๋ฌด๋์ง๋ฉด ์ปดํฌ๋ํธ์ ์ํ์ ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ค์์ด๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ์ฌ์ฉ์ ๋ฆฌ์คํธ๊ฐ ์๋ค๊ณ ํ์.
[
{ id: 'member-number', placeholder: 'Enter your member number' },
{ id: 'user-id', placeholder: 'Enter your user ID' },
]
์ฌ์ฉ์๊ฐ ํํฐ๋ฅผ ์ ์ฉํ๊ฑฐ๋ ๋๋๊ทธ๋ก ์์๋ฅผ ๋ฐ๊พธ๋ฉด, ๋ฆฌ์คํธ๋ ์๋์ ๊ฐ์ด ๋ฐ๋ ์ ์๋ค.
[
{ id: 'user-id', placeholder: 'Enter your user ID' },
{ id: 'member-number', placeholder: 'Enter your member number' },
]
์ด ์ํ์์ ๋ฆฌ์คํธ๋ฅผ ์๋์ฒ๋ผ index๋ฅผ key๋ก ์ฌ์ฉํ๋ฉด, ์์์ ์์๊ฐ ๋ฐ๋์์ ๋๋ React๋ ๋์ผํ key๋ก ํ๋จํ๊ณ ๊ธฐ์กด DOM ๋ ธ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ค. ์ด๋ก ์ธํด ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ, ํฌ์ปค์ค ์ํ ๋ฑ ์ปดํฌ๋ํธ์ ๋ด๋ถ ์ํ๊ฐ ์์ผ๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
{list.map((item, index) => (
<Input
key={index}
id={item.id}
placeholder={item.placeholder}
/>
))}
https://react.dev/learn/rendering-lists#keeping-list-items-in-order-with-key
Rendering Lists – React
The library for web and native user interfaces
react.dev
'๐ WIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Windowing ๊ธฐ๋ฒ์ ์ ์ฉํ ๋์ฉ๋ ๊ณ ์ฑ๋ฅ ํ ์ปดํฌ๋ํธ ๊ฐ๋ฐ๊ธฐ (1) | 2025.07.06 |
---|---|
ํ ์คํธ ์ฝ๋ ์์ฑํด๋ณด๊ธฐ (1) | 2025.06.29 |
debugger ์์ด ํธ์ถ ์คํ ํ์ธํ๋ ๋ฒ (0) | 2025.06.15 |
Stagewise - ๋ธ๋ผ์ฐ์ ์์ AI ์ฝ๋ ์ปจํ ์คํธ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ ๋๊ตฌ (2) | 2025.06.06 |
๋ชจ๋ ธ๋ ํฌ์์ ์ค์ ๊ณตํตํํ๊ธฐ (1) | 2025.05.30 |