TIL 033 | React์—์„œ props๋กœ key๐Ÿ”‘ ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

JU CHEOLJINยท2021๋…„ 8์›” 24์ผ
1

React

๋ชฉ๋ก ๋ณด๊ธฐ
2/15
post-thumbnail

๐Ÿ”‘ key props!!

React๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋Š๊ปด์กŒ๋˜ ๋ถ€๋ถ„์€ ๊ธฐ์กด์—๋Š” ํ•˜๋“œ์ฝ”๋”ฉ์„ ํ†ตํ•ด์„œ ๋ณต์‚ฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ–ˆ๋˜ ์ฝ”๋“œ๋“ค์„ ๋ฐ์ดํ„ฐ๋งŒ ์žˆ๋‹ค๋ฉด map() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ฒ˜์Œ map() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ˜•์ œ ์š”์†Œ๋“ค ์‚ฌ์ด์— ์œ ์ผํ•œ ํ‚ค๊ฐ’์„ ๋ถ€์—ฌํ•ธ๋‹ค๋Š” ๊ฒฝ๊ณ ์ฐฝ์ด ๋œจ๋Š” ๊ฒƒ์„ ๋ณด๊ฒŒ ๋œ๋‹ค.

"์•„๋‹ˆ... ํŽธ๋ฆฌํ•˜๊ณ  ์ข‹์€๋ฐ... key๋ฅผ ์™œ ๊ตณ์ด ๋ถ€์—ฌํ•ด์•ผํ•˜๋Š”๊ฑฐ์•ผ?" ๋ผ๋Š” ์˜๋ฌธ์ด ๋“œ๋Š”๋ฐ ์ด์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด์ž.

what key?

React์—์„œ๋Š” props์„ ํ†ตํ•ด์„œ key ๊ฐ’์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฃผ๋กœ ๋ฐฐ์—ด๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ์ดํ„ฐ๋“ค์„ map() ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ key ๊ฐ’์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š์œผ๋ฉด ์•„๋ž˜์˜ ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค.

Each child in an array should have a unique โ€œkeyโ€ prop.

๊ทธ๋ ‡๋‹ค๋ฉด key ๊ฐ’์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ์ด๋Š” ํŠน์ • ์š”์†Œ์˜ ๋ณ€ํ™”(์ถ”๊ฐ€, ์‚ญ์ œ ๋“ฑ)์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ๊ฐ’์ด๋‹ค. ๋ฆฌ์•กํŠธ์˜ ๊ฒฝ์šฐ state์— ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— render() ํ•จ์ˆ˜๊ฐ€ ๊ณ„์† ํ˜ธ์ถœ๋˜๋Š”๋ฐ ์ด ๊ฒฝ์šฐ์— ๊ฐ€์ƒ DOM ์„ ์ด์šฉํ•ด์„œ ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š” ์š”์†Œ๋งŒ์„ ๋ฐ˜์˜์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

์ฃผ์˜ํ•  ์ !!!

๊ทธ๋ ‡๋‹ค๋ฉด, key ๊ฐ’์—๋Š” ์–ด๋–ค ๊ฐ’๋“ค์„ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ์„๊นŒ. ๋ณดํ†ต ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ์— ์ธ๋ฑ์Šค๋ฅผ ์ž๋™์œผ๋กœ ๋ถ€์—ฌํ•ด์ฃผ๋ฉด ๊ดœ์ฐฎ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Š” ๋ณดํ†ต์˜ ๊ฒฝ์šฐ์— ์ข‹์ง€ ๋ชปํ•œ ์ƒ๊ฐ์ด๋‹ค.

์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์€ ์ค‘๋ณต๋œ ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ์ผ์€ ์—†์–ด์„œ ํŽธ๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ™ฉ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

key : 0 {userName: "dream", age:24}
key : 1 {userName: "sodis", age:20}
key : 2 {userName: "worms", age:14}

์œ„์™€ ๊ฐ™์€ ์š”์†Œ๋“ค์„ map() ์œผ๋กœ ๋Œ๋ฆฌ๋ฉด์„œ ์ธ๋ฑ์Šค๋ฅผ ํ‚ค ๊ฐ’์œผ๋กœ ์คฌ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋ฐฐ์—ด์˜ ๋งจ ์•ž์— setState()๋ฅผ ํ†ตํ•ด์„œ {userName: "jezz", age:33} ์ด๋ผ๋Š” ๊ฐ’์ด ๋“ค์–ด์˜จ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์•„์ด๋””๋กœ ์ฃผ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๊ฐ’๋“ค์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ ์•„์ด๋””๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ์ฐธ์‚ฌ๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ๋ฐฐ์—ด์˜ ์ „์ฒด ์•„์ดํ…œ์˜ ๋ Œ๋”๋ง์ด ๋‹ค์‹œ ์ผ์–ด๋‚˜๊ฒŒ ๋˜๊ณ  ์ด๋Š” ๋‚ญ๋น„๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

๋ฌผ๋ก , ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์ •์ ์ธ ๋ฐ์ดํ„ฐ๋กœ์„œ ๋ฐฐ์—ด์˜ ๊ตฌ์„ฑ์ด ๋ฐ”๋€” ์ผ์ด ์—†๋Š” ๊ฒฝ์šฐ, ์ •๋ ฌ์ด๋‚˜ ํ•„ํ„ฐ ์š”์†Œ๊ฐ€ ํ•„์š” ์—†๋Š” ๊ฒฝ์šฐ ๋“ฑ์ด๋‹ค.

๊ทธ๋ž˜์„œ key ๊ฐ’์€?

key ๋Š” ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š์„ ๊ฐ’์ด๋ผ๋ฉด ์–ด๋–ค ๊ฐ’์„ ์‚ฌ์šฉํ•ด๋„ ์ข‹๋‹ค. ํŠนํžˆ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ์š”์†Œ๋ผ๋ฉด Date.now() ๋“ฑ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด ๋  ๊ฒƒ์ด๋‹ค. ์ถ”๊ฐ€๋กœ key ๊ฐ’์˜ ์ค‘๋ณต์€ ๊ฐ™์€ ํ˜•์ œ ์š”์†Œ์˜ ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ ์š”์†Œ์™€์˜ ๊ด€๊ณ„์„ฑ์„ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

ํ˜„์žฌ ์ •์ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ธ์ œ๋‚˜ ์ •์ ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜๊ธฐ๋Š” ์–ด๋ ต๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€ํ•œ ์ธ๋ฑ์Šค์˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•˜๋ฉด์„œ ์œ ์ง€๋ณด์ˆ˜์— ์ข‹์€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.


๐Ÿ“• ์ฐธ์กฐ

https://ko.reactjs.org/docs/lists-and-keys.html#gatsby-focus-wrapper
https://www.youtube.com/watch?v=ghxHAy3LH28
https://ko.reactjs.org/docs/reconciliation.html#recursing-on-children
https://velog.io/@rhfovk/TIL-19React%EC%97%90%EC%84%9C-key%EC%9D%98-%EC%97%AD%ED%95%A0

profile
์‚ฌํšŒ์— ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์€ ๊ฟˆ, ๋ฐ”๋กœ ์˜†์˜ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์€ ํ‰์ƒ ๋ชฉํ‘œ์ธ ๊ฐœ๋ฐœ์ž.

0๊ฐœ์˜ ๋Œ“๊ธ€