Frontend/React

[React] ๋ฆฌ์•กํŠธ์˜ Key์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž

_์„ฑํ˜ธ_ 2023. 8. 16. 16:57
728x90
๋ฐ˜์‘ํ˜•

ํ•œ ํšŒ์‚ฌ์˜ ๊ธฐ์ˆ  ์ธํ„ฐ๋ทฐ์—์„œ ๋ฆฌ์•กํŠธ์˜ key์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ๋ฐ›์•˜๋‹ค. ํ•ด๋‹น ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ทธ๋™์•ˆ์— ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ•ญ๋ชฉ์— key๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ๋„ˆ๋ฌด ๋‹น์—ฐ์‹œํ•œ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

๋ฐฐ์—ด์—์„œ ๋ฐ์ดํ„ฐ ๋ Œ๋”๋ง

const people = [
  {
    id: 0,
    name: 'Creola Katherine Johnson',
    profession: 'mathematician',
  },
  {
    id: 1,
    name: 'Mario José Molina-Pasquel Henríquez',
    profession: 'chemist',
  },
];

export default function List() {
  const listItems = people.map((person) => <li>{person.name}</li>);
  return <ul>{listItems}</ul>;
}

 

๐Ÿšจ ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝ˜์†”์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ•ญ๋ชฉ์— "key"๋ฅผ ๋„ฃ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

 

๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ•ญ๋ชฉ์— "key"๋ฅผ ๋„ฃ์–ด์คŒ์œผ๋กœ์จ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. (๊ณ ์œ ํ•œ ๊ฐ’ ์‚ฌ์šฉ)

<li key={person.id}>...</li>

key๋Š” ๋ฆฌ์•กํŠธ์— ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ•ด๋‹นํ•˜๋Š” ๋ฐฐ์—ด ํ•ญ๋ชฉ์„ ์•Œ๋ ค์ฃผ๋ฏ€๋กœ ๋‚˜์ค‘์— ์ผ์น˜์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ๋ฐฐ์—ด ํ•ญ๋ชฉ์ด ์ •๋ ฌ๋กœ ์ธํ•ด ์ด๋™ํ•˜๊ฑฐ๋‚˜, ์‚ฝ์ž… ๋˜๋Š” ์‚ญ์ œ๋  ๊ฒฝ์šฐ key๋Š” ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค. ์ž˜ ์„ ํƒ๋œ key๋Š” ๋ฆฌ์•กํŠธ๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ฌ๋Š”์ง€ ์ถ”๋ก ํ•˜๊ณ  DOM ํŠธ๋ฆฌ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

 

๋ฆฌ์•กํŠธ์— key๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

๊ณต์‹ ๋ฌธ์„œ์—์„œ ํŒŒ์ผ ์ด๋ฆ„์„ ์˜ˆ์‹œ๋กœ ์นœ์ ˆํ•˜๊ฒŒ ์„ค๋ช…ํ•ด ์ฃผ๊ณ  ์žˆ๋‹ค.

๋ฐ์Šคํฌํ†ฑ์˜ ํŒŒ์ผ์— ์ด๋ฆ„์ด ์—†๋Š” ๋Œ€์‹ ์— ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ, ๋‘ ๋ฒˆ์งธ ํŒŒ์ผ ๋“ฑ์˜ ์ˆœ์„œ๋กœ ์ฐธ์กฐํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์ž. ์ต์ˆ™ํ•ด์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์ด ์‚ญ์ œ๋œ๋‹ค๋ฉด ๋‘ ๋ฒˆ์งธ ํŒŒ์ผ์€ ์ฒซ ๋ฒˆ์งธ ํŒŒ์ผ์ด ๋˜๊ณ  ์„ธ ๋ฒˆ์งธ ํŒŒ์ผ์€ ๋‘ ๋ฒˆ์งธ ํŒŒ์ผ์ด ๋œ๋‹ค. ์ด๋Š” ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํด๋”์˜ ํŒŒ์ผ ์ด๋ฆ„๊ณผ JSX์—์„œ key๋Š” ๋น„์Šทํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค. key๋ฅผ ํ†ตํ•ด ํ˜•์ œ๊ฐ„์— ํ•ญ๋ชฉ์„ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์žฌ์ •๋ ฌ๋กœ ์œ„์น˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ key๋ฅผ ํ†ตํ•ด ๋ฆฌ์•กํŠธ๋Š” ์ „์ฒด ์ˆ˜๋ช… ๋™์•ˆ ํ•ญ๋ชฉ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ณ ์œ ํ•œ key๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•

ํ•ญ๋ชฉ์„ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋ฐฐ์—ด์ด ์žฌ์ •๋ ฌ๋˜๋Š” ๊ฒฝ์šฐ ํ•ญ๋ชฉ์„ ๋ Œ๋”๋งํ•˜๋Š” ์ˆœ์„œ๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ธ๋ฑ์Šค๋ฅผ key๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์ข…์ข… ๋ฏธ๋ฌ˜ํ•˜๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฌ์šด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. (๊ถŒ์žฅ โŒ)

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ: ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ ๋ณธ์งˆ์ ์œผ๋กœ ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ‚ค/ID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋กœ์ปฌ์—์„œ ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ: ๋ฐ์ดํ„ฐ๊ฐ€ ๋กœ์ปฌ์—์„œ ์ƒ์„ฑ๋˜๊ณ  ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ crypto.randomUUID() ๋˜๋Š” uuid์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

key์˜ ๊ทœ์น™

  • key๋Š” ํ˜•์ œ๊ฐ„์— ๊ณ ์œ ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฐ์—ด์˜ JSX ๋…ธ๋“œ์— ๋™์ผํ•œ key๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ๋‹ค.
  • ํ‚ค๋Š” ๋ณ€๊ฒฝ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ํ‚ค์˜ ๋ชฉ์ ์— ์–ด๊ธ‹๋‚˜๋ฉด ์•ˆ ๋œ๋‹ค! ๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ ์ƒ์„ฑํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

 

๐Ÿ™‡๐Ÿป ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

 

Rendering Lists – React

The library for web and native user interfaces

react.dev

 

๋ฆฌ์•กํŠธ์˜ Key๋ฅผ ์•Œ์•„๋ณด์ž

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๋ฆฌ์•กํŠธ์—์„œ key๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์™€ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. key๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  ๊ฐ„๋‹จํ•œ ์ดํ•ด๋ฅผ ์œ„ํ•ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฐ์—ด์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ์œ„ ๋ฐฐ์—ด์„ ๋‹ค์Œ

tecoble.techcourse.co.kr