๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Front-end

React key prop๊ณผ ์ƒํƒœ ์ดˆ๊ธฐํ™”

React์—์„œ key prop์€ ๋ฆฌ์ŠคํŠธ๋‚˜ iterable ๊ฐ์ฒด ๋ Œ๋”๋ง ์‹œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜์ง€๋งŒ, ์ƒํƒœ(state) ๊ด€๋ฆฌ์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

key์˜ ์—ญํ• 

  • React์—์„œ key๋Š” ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ๊ณ ์œ ์„ฑ์„ ๋ณด์žฅํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํšจ์œจ์ ์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ key๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์œ ์ง€๋˜๋ฉฐ, ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒˆ๋กœ์šด ๊ฒƒ์œผ๋กœ ์ธ์‹๋ฉ๋‹ˆ๋‹ค.

key๊ฐ€ state์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ

  • key๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด React๋Š” ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, key ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ€ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
import { useState } from "react";

type Props = {
  id: number;
};

const MyComponent = ({ id }: Props) => {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>์ปดํฌ๋„ŒํŠธ ID: {id}</p>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>์ฆ๊ฐ€</button>
    </div>
  );
};

const App = () => {
  const [componentId, setComponentId] = useState(1);

  return (
    <div>
      <button onClick={() => setComponentId(componentId + 1)}>
        ์ปดํฌ๋„ŒํŠธ ๋ณ€๊ฒฝ
      </button>
      <MyComponent key={componentId} id={componentId} />
    </div>
  );
};

 

์œ„ ์ฝ”๋“œ์—์„œ key={componentId}๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด MyComponent์˜ ์ƒํƒœ(count)๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

useState์˜ ์ดˆ๊ธฐํ™” ๋ฐฉ์‹

React์˜ useState๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์ดˆ ๋ Œ๋”๋ง๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

const [count, setCount] = useState(0);

 

์œ„ ์ฝ”๋“œ์—์„œ count์˜ ์ดˆ๊ธฐ๊ฐ’ 0์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋งˆ์šดํŠธ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ useState(0)์˜ 0์ด ๋‹ค์‹œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๋งŒ์•ฝ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋งˆ์šดํŠธ๋˜๋ฉด useState๋Š” ๋‹ค์‹œ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์•ž์„œ ์„ค๋ช…ํ•œ key๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ด๋ฅผ ๊ฐ•์ œ๋กœ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์š”์•ฝ

  • key prop์ด ๋ณ€๊ฒฝ๋˜๋ฉด React๋Š” ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ƒํƒœ๊ฐ€ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
  • useState๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋งˆ์šดํŠธ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
  • key๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํŠน์ • ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ๊ฐ•์ œ๋กœ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • references
 

๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง – React

The library for web and native user interfaces

ko.react.dev

 

๋ฆฌ์ŠคํŠธ์™€ Key – React

A JavaScript library for building user interfaces

ko.legacy.reactjs.org