React reconciliation์ ๋ํ ์ฌ์ธต ๋ถ์๊ณผ ํจ์จ์ ์ธ ๋ฆฌ์คํธ ๋ ๋๋ง์ ์ํ key์ ์ค์์ฑ, ๋์ ๋ฐ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ํฅ์ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
React Reconciliation Keys: ์ฑ๋ฅ์ ์ํ ๋ฆฌ์คํธ ๋ ๋๋ง ์ต์ ํ
React์ ๊ฐ์ DOM๊ณผ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ ํจ์จ์ฑ์ ํต์ฌ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ฆฌ์คํธ๋ฅผ ๋์ ์ผ๋ก ๋ ๋๋งํ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ข ์ข ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ ๋ฐํฉ๋๋ค. ์ด ๊ธ์์๋ ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ ๋ React์ ์ฌ์กฐ์ ๊ณผ์ ์์ key์ ์ค์ํ ์ญํ ์ ์ฌ๋ ์๊ฒ ๋ค๋ฃจ๋ฉฐ, ์ด๊ฒ์ด ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋ป๊ฒ ํฐ ์ํฅ์ ๋ฏธ์น๋์ง ํ๊ตฌํฉ๋๋ค. React ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฆฌ์คํธ ๋ ๋๋ง ์ต์ ํ๋ฅผ ๋ง์คํฐํ๋ ๋ฐ ๋์์ด ๋๋๋ก ๋ชจ๋ฒ ์ฌ๋ก, ์ผ๋ฐ์ ์ธ ํจ์ ๋ฐ ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
React ์ฌ์กฐ์ ์ดํดํ๊ธฐ
ํต์ฌ์ ์ผ๋ก React ์ฌ์กฐ์ ์ ๊ฐ์ DOM์ ์ค์ DOM๊ณผ ๋น๊ตํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ํ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๊ธฐ ์ํด ํ์ํ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ์ปดํฌ๋ํธ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด React๋ ์ ์ฒด DOM์ ๋ค์ ๋ ๋๋งํ์ง ์๊ณ , ๋์ ์๋ก์ด ๊ฐ์ DOM ํํ์ ๋ง๋ค์ด ์ด์ ๊ณผ ๋น๊ตํฉ๋๋ค. ์ด ๊ณผ์ ์ ์ค์ DOM์ ์ ๋ฐ์ดํธํ๋ ๋ฐ ํ์ํ ์ต์ํ์ ์์ ์งํฉ์ ์๋ณํ์ฌ ๋น์ฉ์ด ๋ง์ด ๋๋ DOM ์กฐ์์ ์ต์ํํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
๊ฐ์ DOM์ ์ญํ
๊ฐ์ DOM์ ์ค์ DOM์ ๋ฉ๋ชจ๋ฆฌ ์์์ ๊ฐ๋ณ๊ฒ ํํํ ๊ฒ์ ๋๋ค. React๋ ์ด๋ฅผ ์คํ ์ด์ง ์์ญ์ผ๋ก ์ฌ์ฉํ์ฌ ์ค์ DOM์ ๋ณ๊ฒฝ ์ฌํญ์ ์ปค๋ฐํ๊ธฐ ์ ์ ํจ์จ์ ์ผ๋ก ๋ณ๊ฒฝ์ ์ํํฉ๋๋ค. ์ด ์ถ์ํ๋ฅผ ํตํด React๋ ์ ๋ฐ์ดํธ๋ฅผ ์ผ๊ด ์ฒ๋ฆฌํ๊ณ , ๋ ๋๋ง์ ์ต์ ํํ๋ฉฐ, UI๋ฅผ ์ ์ธ์ ์ผ๋ก ๊ธฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ: ๊ฐ์
React์ ์ฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ์ฃผ๋ก ๋ ๊ฐ์ง์ ์ค์ ์ ๋ก๋๋ค:
- ์๋ฆฌ๋จผํธ ํ์
๋น๊ต: ์๋ฆฌ๋จผํธ ํ์
์ด ๋ค๋ฅธ ๊ฒฝ์ฐ(์:
<div>๊ฐ<span>์ผ๋ก ๋ณ๊ฒฝ), React๋ ์ด์ ํธ๋ฆฌ๋ฅผ ์์ ํ ์ธ๋ง์ดํธํ๊ณ ์ ํธ๋ฆฌ๋ฅผ ๋ง์ดํธํฉ๋๋ค. - ์์ฑ ๋ฐ ์ฝํ ์ธ ์ ๋ฐ์ดํธ: ์๋ฆฌ๋จผํธ ํ์ ์ด ๋์ผํ ๊ฒฝ์ฐ, React๋ ๋ณ๊ฒฝ๋ ์์ฑ๊ณผ ์ฝํ ์ธ ๋ง ์ ๋ฐ์ดํธํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ฆฌ์คํธ๋ฅผ ๋ค๋ฃฐ ๋, ํนํ ํญ๋ชฉ์ด ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ์ฌ์ ๋ ฌ๋ ๋ ์ด ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ ๋นํจ์จ์ ์ด ๋ ์ ์์ต๋๋ค.
๋ฆฌ์คํธ ๋ ๋๋ง์์ Key์ ์ค์์ฑ
๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ ๋ React๋ ๊ฐ ๋ ๋๋ง๋ง๋ค ๊ฐ ํญ๋ชฉ์ ๊ณ ์ ํ๊ฒ ์๋ณํ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ๋ฐ๋ก ์ฌ๊ธฐ์ key๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. key๋ ๋ฆฌ์คํธ์ ๊ฐ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ํน์ ์์ฑ์ผ๋ก, React๊ฐ ์ด๋ค ํญ๋ชฉ์ด ๋ณ๊ฒฝ, ์ถ๊ฐ ๋๋ ์ ๊ฑฐ๋์๋์ง ์๋ณํ๋ ๋ฐ ๋์์ ์ค๋๋ค. key๊ฐ ์์ผ๋ฉด React๋ ์ถ์ธก์ ์์กดํด์ผ ํ๋ฉฐ, ์ด๋ ์ข ์ข ๋ถํ์ํ DOM ์กฐ์๊ณผ ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง๋๋ค.
Key๊ฐ ์ฌ์กฐ์ ์ ๋๋ ๋ฐฉ๋ฒ
Key๋ React์๊ฒ ๊ฐ ๋ฆฌ์คํธ ํญ๋ชฉ์ ๋ํ ์์ ์ ์ธ ์๋ณ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฆฌ์คํธ๊ฐ ๋ณ๊ฒฝ๋๋ฉด React๋ ์ด key๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์์ ์ํํฉ๋๋ค:
- ๊ธฐ์กด ํญ๋ชฉ ์๋ณ: React๋ ํญ๋ชฉ์ด ์ฌ์ ํ ๋ฆฌ์คํธ์ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
- ์ฌ์ ๋ ฌ ์ถ์ : React๋ ํญ๋ชฉ์ด ๋ฆฌ์คํธ ๋ด์์ ์ด๋ํ๋์ง ๊ฐ์งํ ์ ์์ต๋๋ค.
- ์ ํญ๋ชฉ ์ธ์: React๋ ์๋ก ์ถ๊ฐ๋ ํญ๋ชฉ์ ์๋ณํ ์ ์์ต๋๋ค.
- ์ ๊ฑฐ๋ ํญ๋ชฉ ๊ฐ์ง: React๋ ํญ๋ชฉ์ด ๋ฆฌ์คํธ์์ ์ ๊ฑฐ๋์์ ๋ ์ด๋ฅผ ์ธ์ํ ์ ์์ต๋๋ค.
key๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ React๋ DOM์ ๋ํ ๋ชฉํ ์งํฅ์ ์ธ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ์ฌ ์ ์ฒด ๋ฆฌ์คํธ ์น์ ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ํผํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ํฌ๊ณ ๋์ ์ธ ๋ฆฌ์คํธ์์ ์๋นํ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ต๋๋ค.
Key๊ฐ ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ ๋ key๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด React๋ ํญ๋ชฉ์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ key๋ก ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์ด ์ฒ์์๋ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ๋ฆฌ์คํธ๊ฐ ๋จ์ํ ์ถ๊ฐ ์ด์ธ์ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋ ๋ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
๋ค์ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด๋ณด์ธ์:
- ๋ฆฌ์คํธ ๋งจ ์์ ํญ๋ชฉ ์ถ๊ฐํ๊ธฐ: ์ดํ์ ๋ชจ๋ ํญ๋ชฉ๋ค์ ์ธ๋ฑ์ค๊ฐ ๋ณ๊ฒฝ๋์ด, React๋ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋์ง ์์์์๋ ๋ถ๊ตฌํ๊ณ ๋ถํ์ํ๊ฒ ํด๋น ํญ๋ชฉ๋ค์ ๋ฆฌ๋ ๋๋งํ๊ฒ ๋ฉ๋๋ค.
- ๋ฆฌ์คํธ ์ค๊ฐ์์ ํญ๋ชฉ ์ ๊ฑฐํ๊ธฐ: ๋งจ ์์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ์ ์ฌํ๊ฒ, ์ดํ์ ๋ชจ๋ ํญ๋ชฉ๋ค์ ์ธ๋ฑ์ค๊ฐ ๋ณ๊ฒฝ๋์ด ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํฉ๋๋ค.
- ๋ฆฌ์คํธ ํญ๋ชฉ ์ฌ์ ๋ ฌํ๊ธฐ: React๋ ์ธ๋ฑ์ค๊ฐ ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ ๋๋ ๋ชจ๋ ๋ฆฌ์คํธ ํญ๋ชฉ์ ๋ฆฌ๋ ๋๋งํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
์ด๋ฌํ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ , ํนํ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ์ ํ๋ ์ฅ์น์์ ๋์ ๋๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. UI๊ฐ ๋๋ฆฌ๊ฑฐ๋ ๋ฐ์์ด ์๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
์ฌ๋ฐ๋ฅธ Key ์ ํํ๊ธฐ
ํจ๊ณผ์ ์ธ ์ฌ์กฐ์ ์ ์ํด์๋ ์ ์ ํ key๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ข์ key๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ ธ์ผ ํฉ๋๋ค:
- ๊ณ ์ ์ฑ: ๋ฆฌ์คํธ์ ๊ฐ ํญ๋ชฉ์ ๊ณ ์ ํ key๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
- ์์ ์ฑ: ํญ๋ชฉ ์์ฒด๊ฐ ๊ต์ฒด๋์ง ์๋ ํ key๋ ๋ ๋๋ง ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์์์ผ ํฉ๋๋ค.
- ์์ธก ๊ฐ๋ฅ์ฑ: key๋ ํญ๋ชฉ์ ๋ฐ์ดํฐ๋ก๋ถํฐ ์ฝ๊ฒ ๊ฒฐ์ ๋ ์ ์์ด์ผ ํฉ๋๋ค.
๋ค์์ key๋ฅผ ์ ํํ๋ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ๋ต์ ๋๋ค:
๋ฐ์ดํฐ ์์ค์ ๊ณ ์ ID ์ฌ์ฉํ๊ธฐ
๋ฐ์ดํฐ ์์ค๊ฐ ๊ฐ ํญ๋ชฉ์ ๋ํ ๊ณ ์ ID(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ID ๋๋ UUID)๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ, ์ด๋ key๋ฅผ ์ํ ์ด์์ ์ธ ์ ํ์ ๋๋ค. ์ด๋ฌํ ID๋ ์ผ๋ฐ์ ์ผ๋ก ์์ ์ ์ด๊ณ ๊ณ ์ ํจ์ด ๋ณด์ฅ๋ฉ๋๋ค.
์์:
const items = [
{ id: 'a1b2c3d4', name: 'Apple' },
{ id: 'e5f6g7h8', name: 'Banana' },
{ id: 'i9j0k1l2', name: 'Cherry' },
];
function ItemList() {
return (
{items.map(item => (
<li key={item.id}>{item.name}</li>
))}
);
}
์ด ์์ ์์๋ ๊ฐ ํญ๋ชฉ์ id ์์ฑ์ด key๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ๊ฐ ๋ฆฌ์คํธ ํญ๋ชฉ์ด ๊ณ ์ ํ๊ณ ์์ ์ ์ธ ์๋ณ์๋ฅผ ๊ฐ๋๋ก ๋ณด์ฅํฉ๋๋ค.
ํด๋ผ์ด์ธํธ ์ธก์์ ๊ณ ์ ID ์์ฑํ๊ธฐ
๋ฐ์ดํฐ์ ๊ณ ์ ID๊ฐ ์๋ ๊ฒฝ์ฐ, uuid๋ nanoid์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ ์ธก์์ ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ๋ฅํ๋ค๋ฉด ์๋ฒ ์ธก์์ ๊ณ ์ ID๋ฅผ ํ ๋นํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ์ข์ต๋๋ค. ํด๋ผ์ด์ธํธ ์ธก ์์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๊ตฌ ์ ์ฅํ๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ๋ด์์ ์์ ํ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ํ์ํ ์ ์์ต๋๋ค.
์์:
import { v4 as uuidv4 } from 'uuid';
function ItemList({ items }) {
const itemsWithIds = items.map(item => ({ ...item, id: uuidv4() }));
return (
{itemsWithIds.map(item => (
<li key={item.id}>{item.name}</li>
))}
);
}
์ด ์์ ์์๋ uuidv4() ํจ์๊ฐ ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ ๊ฐ ํญ๋ชฉ์ ๋ํ ๊ณ ์ ID๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์์ ํ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์๊ตฌ ์ฌํญ๊ณผ ์ผ์นํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
์ฌ๋ฌ ์์ฑ์ ์กฐํฉ ์ฌ์ฉํ๊ธฐ
๋๋ฌธ ๊ฒฝ์ฐ์ง๋ง, ๋จ์ผ ๊ณ ์ ์๋ณ์๋ ์์ง๋ง ์ฌ๋ฌ ์์ฑ์ ๊ฒฐํฉํ์ฌ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ฒฐํฉ๋ ์์ฑ์ด ์ง์ ์ผ๋ก ๊ณ ์ ํ๊ณ ์์ ์ ์ด์ง ์์ผ๋ฉด ๋ณต์กํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ฐ๋ฏ๋ก ์ด ์ ๊ทผ ๋ฐฉ์์ ์ ์คํ๊ฒ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์ (์ฃผ์ํด์ ์ฌ์ฉํ์ธ์!):
const items = [
{ firstName: 'John', lastName: 'Doe', age: 30 },
{ firstName: 'Jane', lastName: 'Doe', age: 25 },
];
function ItemList() {
return (
{items.map(item => (
<li key={`${item.firstName}-${item.lastName}-${item.age}`}>
{item.firstName} {item.lastName} ({item.age})
</li>
))}
);
}
์ด ์์ ์์๋ firstName, lastName, age ์์ฑ์ ๊ฒฐํฉํ์ฌ key๋ฅผ ๋ง๋ญ๋๋ค. ์ด ์กฐํฉ์ด ๋ฆฌ์คํธ์ ๊ฐ ํญ๋ชฉ์ ๋ํด ๊ณ ์ ํ๋ค๋ ๊ฒ์ด ๋ณด์ฅ๋ ๋๋ง ์๋ํฉ๋๋ค. ๋ ์ฌ๋์ด ๊ฐ์ ์ด๋ฆ๊ณผ ๋์ด๋ฅผ ๊ฐ์ง ์ ์๋ ์ํฉ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ธ๋ฑ์ค๋ฅผ Key๋ก ์ฌ์ฉํ์ง ์๊ธฐ (์ผ๋ฐ์ ์ผ๋ก)
์์ ์ธ๊ธํ๋ฏ์ด, ํญ๋ชฉ์ ์ธ๋ฑ์ค๋ฅผ key๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์์ผ๋ฉฐ, ํนํ ๋ฆฌ์คํธ๊ฐ ๋์ ์ด๊ณ ํญ๋ชฉ์ด ์ถ๊ฐ, ์ ๊ฑฐ ๋๋ ์ฌ์ ๋ ฌ๋ ์ ์๋ ๊ฒฝ์ฐ์๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์ธ๋ฑ์ค๋ ๋ณธ์ง์ ์ผ๋ก ๋ถ์์ ํ๋ฉฐ ๋ฆฌ์คํธ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฐ๋๋ฏ๋ก ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง๊ณผ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ด๋ํฉ๋๋ค.
์ธ๋ฑ์ค๋ฅผ key๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ ๋ ๋ณ๊ฒฝ๋์ง ์๋ ์ ์ ๋ฆฌ์คํธ์์๋ ์๋ํ ์ ์์ง๋ง, ๋ฏธ๋์ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ๋ฐ์ ์ผ๋ก ํผํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ ๋๋ก ๋ณ๊ฒฝ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์ ํ ํํ์ ์ธ ์ปดํฌ๋ํธ์ ๋ํด์๋ง ํ์ฉ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ์ธ์. ๋ชจ๋ ์ํธ์์ฉ์ด ์๋ ๋ฆฌ์คํธ๋ ํญ์ ๊ณ ์ ํ๊ณ ์์ ์ ์ธ key๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก
๋ค์ํ ์๋๋ฆฌ์ค์์ key๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ 1: ๊ฐ๋จํ ํ ์ผ ๋ชฉ๋ก
์ฌ์ฉ์๊ฐ ์์ ์ ์ถ๊ฐ, ์ ๊ฑฐํ๊ณ ์๋ฃ๋ก ํ์ํ ์ ์๋ ๊ฐ๋จํ ํ ์ผ ๋ชฉ๋ก์ ์๊ฐํด๋ณด์ธ์.
import React, { useState } from 'react';
import { v4 as uuidv4 } from 'uuid';
function TodoList() {
const [todos, setTodos] = useState([
{ id: uuidv4(), text: 'Learn React', completed: false },
{ id: uuidv4(), text: 'Build a Todo App', completed: false },
]);
const addTodo = (text) => {
setTodos([...todos, { id: uuidv4(), text, completed: false }]);
};
const removeTodo = (id) => {
setTodos(todos.filter(todo => todo.id !== id));
};
const toggleComplete = (id) => {
setTodos(todos.map(todo =>
todo.id === id ? { ...todo, completed: !todo.completed } : todo
));
};
return (
<div>
<input type="text" placeholder="Add a todo" onKeyDown={(e) => { if (e.key === 'Enter') { addTodo(e.target.value); e.target.value = ''; } }} />
<ul>
{todos.map(todo => (
<li key={todo.id}>
<input type="checkbox" checked={todo.completed} onChange={() => toggleComplete(todo.id)} />
<span style={{ textDecoration: todo.completed ? 'line-through' : 'none' }}>
{todo.text}
</span>
<button onClick={() => removeTodo(todo.id)}>Remove</button>
</li>
))}
</ul>
</div>
);
}
์ด ์์ ์์๋ ๊ฐ ํ ์ผ ํญ๋ชฉ์ uuidv4()๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ๊ณ ์ ID๊ฐ ์์ต๋๋ค. ์ด ID๋ key๋ก ์ฌ์ฉ๋์ด ํ ์ผ์ ์ถ๊ฐ, ์ ๊ฑฐํ๊ฑฐ๋ ์๋ฃ ์ํ๋ฅผ ํ ๊ธํ ๋ ํจ์จ์ ์ธ ์ฌ์กฐ์ ์ ๋ณด์ฅํฉ๋๋ค.
์์ 2: ์ ๋ ฌ ๊ฐ๋ฅํ ๋ฆฌ์คํธ
์ฌ์ฉ์๊ฐ ํญ๋ชฉ์ ๋๋๊ทธ ์ค ๋๋กญํ์ฌ ์ฌ์ ๋ ฌํ ์ ์๋ ๋ฆฌ์คํธ๋ฅผ ์๊ฐํด๋ณด์ธ์. ์์ ์ ์ธ key๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ์ ๋ ฌ ๊ณผ์ ๋์ ๊ฐ ํญ๋ชฉ์ ์ฌ๋ฐ๋ฅธ ์ํ๋ฅผ ์ ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
import React, { useState } from 'react';
import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';
import { v4 as uuidv4 } from 'uuid';
function SortableList() {
const [items, setItems] = useState([
{ id: uuidv4(), content: 'Item 1' },
{ id: uuidv4(), content: 'Item 2' },
{ id: uuidv4(), content: 'Item 3' },
]);
const handleOnDragEnd = (result) => {
if (!result.destination) return;
const reorderedItems = Array.from(items);
const [movedItem] = reorderedItems.splice(result.source.index, 1);
reorderedItems.splice(result.destination.index, 0, movedItem);
setItems(reorderedItems);
};
return (
<DragDropContext onDragEnd={handleOnDragEnd}>
<Droppable droppableId="items">
{(provided) => (
<ul {...provided.droppableProps} ref={provided.innerRef}>
{items.map((item, index) => (
<Draggable key={item.id} draggableId={item.id} index={index}>
{(provided) => (
<li {...provided.draggableProps} {...provided.dragHandleProps} ref={provided.innerRef}>
{item.content}
</li>
)}
</Draggable>
))}
{provided.placeholder}
</ul>
)}
</Droppable>
</DragDropContext>
);
}
์ด ์์ ์์๋ react-beautiful-dnd ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋๋๊ทธ ์ค ๋๋กญ ๊ธฐ๋ฅ์ ๊ตฌํํฉ๋๋ค. ๊ฐ ํญ๋ชฉ์๋ ๊ณ ์ ID๊ฐ ์์ผ๋ฉฐ, <Draggable> ์ปดํฌ๋ํธ ๋ด์์ key prop์ด item.id๋ก ์ค์ ๋ฉ๋๋ค. ์ด๋ React๊ฐ ์ฌ์ ๋ ฌ ๊ณผ์ ๋์ ๊ฐ ํญ๋ชฉ์ ์์น๋ฅผ ์ ํํ๊ฒ ์ถ์ ํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๊ณ ์ฌ๋ฐ๋ฅธ ์ํ๋ฅผ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก ์์ฝ
- ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ ๋๋ ํญ์ key๋ฅผ ์ฌ์ฉํ์ธ์: ๊ธฐ๋ณธ ์ธ๋ฑ์ค ๊ธฐ๋ฐ key์ ์์กดํ์ง ๋ง์ธ์.
- ๊ณ ์ ํ๊ณ ์์ ์ ์ธ key๋ฅผ ์ฌ์ฉํ์ธ์: ๊ณ ์ ํจ์ด ๋ณด์ฅ๋๊ณ ๋ ๋๋ง ๊ฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ key๋ฅผ ์ ํํ์ธ์.
- ๋ฐ์ดํฐ ์์ค์ ID๋ฅผ ์ ํธํ์ธ์: ๊ฐ๋ฅํ๋ค๋ฉด ๋ฐ์ดํฐ ์์ค์์ ์ ๊ณตํ๋ ๊ณ ์ ID๋ฅผ ์ฌ์ฉํ์ธ์.
- ํ์ํ ๊ฒฝ์ฐ ๊ณ ์ ID๋ฅผ ์์ฑํ์ธ์: ์๋ฒ ์ธก ID๊ฐ ์๋ ๊ฒฝ์ฐ
uuid๋nanoid์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ ์ธก์์ ๊ณ ์ ID๋ฅผ ์์ฑํ์ธ์. - ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์์ฑ ์กฐํฉ์ ํผํ์ธ์: ์กฐํฉ์ด ๊ณ ์ ํ๊ณ ์์ ์ ์ด๋ผ๋ ๊ฒ์ด ๋ณด์ฅ๋ ๋๋ง ์์ฑ์ ์กฐํฉํ์ฌ key๋ฅผ ๋ง๋์ธ์.
- ์ฑ๋ฅ์ ์ ์ํ์ธ์: ํจ์จ์ ์ด๊ณ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ๋ key ์์ฑ ์ ๋ต์ ์ ํํ์ธ์.
์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ
React ์ฌ์กฐ์ key์ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ์ด๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ์ฌ๋ฌ ํญ๋ชฉ์ ๋์ผํ Key ์ฌ์ฉํ๊ธฐ
ํจ์ : ๋ฆฌ์คํธ์ ์ฌ๋ฌ ํญ๋ชฉ์ ๋์ผํ key๋ฅผ ํ ๋นํ๋ฉด ์์ธกํ ์ ์๋ ๋์๊ณผ ๋ ๋๋ง ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. React๋ ๋์ผํ key๋ฅผ ๊ฐ์ง ํญ๋ชฉ๋ค์ ๊ตฌ๋ณํ ์ ์์ผ๋ฏ๋ก ์๋ชป๋ ์ ๋ฐ์ดํธ์ ์ ์ฌ์ ์ธ ๋ฐ์ดํฐ ์์์ด ๋ฐ์ํฉ๋๋ค.
ํด๊ฒฐ์ฑ : ๋ฆฌ์คํธ์ ๊ฐ ํญ๋ชฉ์ด ๊ณ ์ ํ key๋ฅผ ๊ฐ๋๋ก ํ์ธ์. ์ค๋ณต๋ key๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด key ์์ฑ ๋ก์ง๊ณผ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ค์ ํ์ธํ์ธ์.
2. ๋งค ๋ ๋๋ง๋ง๋ค ์๋ก์ด Key ์์ฑํ๊ธฐ
ํจ์ : ๋งค ๋ ๋๋ง๋ง๋ค ์๋ก์ด key๋ฅผ ์์ฑํ๋ฉด React๊ฐ ๊ฐ ํญ๋ชฉ์ ์๋ก์ด ํญ๋ชฉ์ผ๋ก ์ทจ๊ธํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ ๋ฐํ๋ฏ๋ก key์ ๋ชฉ์ ์ด ๋ฌด์๋ฏธํด์ง๋๋ค. ์ด๋ ๋ ๋ ํจ์ ์์ฒด ๋ด์์ key๋ฅผ ์์ฑํ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค.
ํด๊ฒฐ์ฑ : ๋ ๋ ํจ์ ์ธ๋ถ์์ key๋ฅผ ์์ฑํ๊ฑฐ๋ ์ปดํฌ๋ํธ์ state์ ์ ์ฅํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๋๋ง ๊ฐ์ key๊ฐ ์์ ์ ์ผ๋ก ์ ์ง๋ฉ๋๋ค.
3. ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ์๋ชป ์ฒ๋ฆฌํ๊ธฐ
ํจ์ : ๋ฆฌ์คํธ์์ ํญ๋ชฉ์ ์กฐ๊ฑด๋ถ๋ก ๋ ๋๋งํ ๋, key๊ฐ ์ฌ์ ํ ๊ณ ์ ํ๊ณ ์์ ์ ์ธ์ง ํ์ธํด์ผ ํฉ๋๋ค. ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ์๋ชป ์ฒ๋ฆฌํ๋ฉด key ์ถฉ๋์ด๋ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
ํด๊ฒฐ์ฑ : ๊ฐ ์กฐ๊ฑด๋ถ ๋ถ๊ธฐ ๋ด์์ key๊ฐ ๊ณ ์ ํ๋๋ก ํ์ธ์. ํด๋น๋๋ค๋ฉด ๋ ๋๋ง๋๋ ํญ๋ชฉ๊ณผ ๋ ๋๋ง๋์ง ์๋ ํญ๋ชฉ ๋ชจ๋์ ๋์ผํ key ์์ฑ ๋ก์ง์ ์ฌ์ฉํ์ธ์.
4. ์ค์ฒฉ๋ ๋ฆฌ์คํธ์์ Key๋ฅผ ์์ด๋ฒ๋ฆฌ๊ธฐ
ํจ์ : ์ค์ฒฉ๋ ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋งํ ๋ ๋ด๋ถ ๋ฆฌ์คํธ์ key๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์๊ธฐ ์ฝ์ต๋๋ค. ์ด๋ ํนํ ๋ด๋ถ ๋ฆฌ์คํธ๊ฐ ๋์ ์ผ ๋ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ ๋๋ง ์ค๋ฅ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
ํด๊ฒฐ์ฑ : ์ค์ฒฉ๋ ๋ฆฌ์คํธ๋ฅผ ํฌํจํ ๋ชจ๋ ๋ฆฌ์คํธ์ ํญ๋ชฉ์ key๊ฐ ํ ๋น๋์๋์ง ํ์ธํ์ธ์. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ์ผ๊ด๋ key ์์ฑ ์ ๋ต์ ์ฌ์ฉํ์ธ์.
์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋ฐ ๋๋ฒ๊น
๋ฆฌ์คํธ ๋ ๋๋ง ๋ฐ ์ฌ์กฐ์ ๊ณผ ๊ด๋ จ๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ๋๋ฒ๊น ํ๊ธฐ ์ํด React DevTools์ ๋ธ๋ผ์ฐ์ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
React DevTools
React DevTools๋ ์ปดํฌ๋ํธ ๋ ๋๋ง ๋ฐ ์ฑ๋ฅ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์์ ์ํํ ์ ์์ต๋๋ค:
- ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ์๋ณ: React DevTools๋ ๋ฆฌ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์กฐ ํ์ํ์ฌ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ ์ ์๊ฒ ํด์ค๋๋ค.
- ์ปดํฌ๋ํธ props์ state ๊ฒ์ฌ: ๊ฐ ์ปดํฌ๋ํธ์ props์ state๋ฅผ ๊ฒ์ฌํ์ฌ ๋ฆฌ๋ ๋๋ง๋๋ ์ด์ ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค.
- ์ปดํฌ๋ํธ ๋ ๋๋ง ํ๋กํ์ผ๋ง: React DevTools๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ ๋ ๋๋ง์ ํ๋กํ์ผ๋งํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์ฅ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๋ถ๋ถ์ ์๋ณํ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ํ๋กํ์ผ๋ง ๋๊ตฌ
Chrome DevTools์ ๊ฐ์ ๋ธ๋ผ์ฐ์ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ CPU ์ฌ์ฉ๋, ๋ฉ๋ชจ๋ฆฌ ํ ๋น, ๋ ๋๋ง ์๊ฐ์ ํฌํจํ ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๋๊ตฌ๋ค์ ์ฌ์ฉํ์ฌ ๋ค์์ ์ํํ ์ ์์ต๋๋ค:
- DOM ์กฐ์ ๋ณ๋ชฉ ํ์ ์๋ณ: ๋ธ๋ผ์ฐ์ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ DOM ์กฐ์์ด ๋๋ฆฐ ์์ญ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- JavaScript ์คํ ๋ถ์: JavaScript ์คํ์ ๋ถ์ํ์ฌ ์ฝ๋์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ ์ ์์ต๋๋ค.
- ๋ ๋๋ง ์ฑ๋ฅ ์ธก์ : ๋ธ๋ผ์ฐ์ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ ๋๋งํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ธก์ ํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
React ์ฌ์กฐ์ key๋ ๋์ ๋ฐ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฆฌ์คํธ ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ฌ์กฐ์ ๊ณผ์ ์์ key์ ์ญํ ์ ์ดํดํ๊ณ ์ด๋ฅผ ์ ํํ๊ณ ์ฌ์ฉํ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด React ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค. ํญ์ ๊ณ ์ ํ๊ณ ์์ ์ ์ธ key๋ฅผ ์ฌ์ฉํ๊ณ , ๊ฐ๋ฅํ๋ฉด ์ธ๋ฑ์ค๋ฅผ key๋ก ์ฌ์ฉํ์ง ์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ์ฌ ์ ์ฌ์ ์ธ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์. ์ธ๋ถ ์ฌํญ์ ๋ํ ์ธ์ฌํ ์ฃผ์์ React์ ์ฌ์กฐ์ ๋ฉ์ปค๋์ฆ์ ๋ํ ํ๊ณ ํ ์ดํด๋ฅผ ํตํด ๋ฆฌ์คํธ ๋ ๋๋ง ์ต์ ํ๋ฅผ ๋ง์คํฐํ๊ณ ๊ณ ์ฑ๋ฅ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ด ๊ฐ์ด๋๋ React ์ฌ์กฐ์ key์ ๊ธฐ๋ณธ ์ธก๋ฉด์ ๋ค๋ฃจ์์ต๋๋ค. ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ํฐ ์ฑ๋ฅ ํฅ์์ ์ํด ๋ฉ๋ชจ์ด์ ์ด์ , ๊ฐ์ํ, ์ฝ๋ ๋ถํ ๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ์ ์ ๊ณ์ ํ์ํ์ธ์. React ํ๋ก์ ํธ์์ ์ต์ ์ ๋ ๋๋ง ํจ์จ์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํด ๊ณ์ ์คํํ๊ณ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ ํด ๋๊ฐ์ญ์์ค.