๊ด€๋ฆฌ ๋ฉ”๋‰ด

ruriruriya

[React] ๋ฆฌ์•กํŠธ - ๊ฐ์ฒด(Object)๋ž€? ๋ณธ๋ฌธ

๐Ÿ–Œ๏ธWeb/React

[React] ๋ฆฌ์•กํŠธ - ๊ฐ์ฒด(Object)๋ž€?

๋ฃจ๋ฆฌ์•ผใ…‘ 2025. 3. 10. 17:55
๋ฐ˜์‘ํ˜•

React์—์„œ **๊ฐ์ฒด(Object)**๋Š” ์ƒํƒœ(state)๋‚˜ props๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค. ๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์†์„ฑ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. React์—์„œ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๊ณผ ์˜ฌ๋ฐ”๋ฅธ ์‚ฌ์šฉ๋ฒ•์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

1๏ธโƒฃ ๊ฐ์ฒด(Object)๋ž€?

๊ฐ์ฒด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ํ•˜๋‚˜์˜ ๊ตฌ์กฐ๋กœ ๋ฌถ์–ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒํ˜•์ด๋‹ค. JavaScript์—์„œ๋Š” {}(์ค‘๊ด„ํ˜ธ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

const user = {
  name: "์ฒ ์ˆ˜",
  age: 25,
  isAdmin: false
};
  • user๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , name, age, isAdmin์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค.
  • ์†์„ฑ ๊ฐ’์€ ๋ฌธ์ž์—ด, ์ˆซ์ž, ๋ถˆ๋ฆฌ์–ธ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

 

2๏ธโƒฃ React์—์„œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

React์—์„œ๋Š” ์ƒํƒœ(state)๋‚˜ props๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ **๋‹จ์ผ ๊ฐ’(primitive value)**๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

const [user, setUser] = useState({ name: "์ฒ ์ˆ˜", age: 25 });
  • useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด ํ˜•ํƒœ์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ด€๋ จ๋œ ๊ฐ’์„ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๋ฌถ์–ด ๊ด€๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ์ง๊ด€์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง„๋‹ค.

 

3๏ธโƒฃ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์ฃผ์˜ํ•  ์ 

โœ” ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค

React์—์„œ ์ƒํƒœ(state)๋Š” ๋ถˆ๋ณ€์„ฑ(immutability)์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

โŒ ์ž˜๋ชป๋œ ์˜ˆ์ œ (์ง์ ‘ ๊ฐ์ฒด ๋ณ€๊ฒฝ)

function Profile() {
  const [user, setUser] = useState({ name: "์ฒ ์ˆ˜", age: 25 });

  function updateAge() {
    user.age += 1;  // โŒ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ˆ˜์ •
    setUser(user);   // โŒ ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ์„ค์ •
  }

  return (
    <div>
      <p>์ด๋ฆ„: {user.name}</p>
      <p>๋‚˜์ด: {user.age}</p>
      <button onClick={updateAge}>๋‚˜์ด ์ฆ๊ฐ€</button>
    </div>
  );
}

์ด ์ฝ”๋“œ์˜ ๋ฌธ์ œ์ 

  • user.age += 1;๋กœ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ–ˆ๋‹ค.
  • setUser(user);๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ React๋Š” ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’์ด ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด๋„ UI๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

โœ” ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์ œ (์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ)

function Profile() {
  const [user, setUser] = useState({ name: "์ฒ ์ˆ˜", age: 25 });

  function updateAge() {
    setUser({ ...user, age: user.age + 1 }); // โœ… ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
  }

  return (
    <div>
      <p>์ด๋ฆ„: {user.name}</p>
      <p>๋‚˜์ด: {user.age}</p>
      <button onClick={updateAge}>๋‚˜์ด ์ฆ๊ฐ€</button>
    </div>
  );
}

์™œ ์ด ๋ฐฉ์‹์ด ์˜ฌ๋ฐ”๋ฅธ๊ฐ€?

  • setUser({ ...user, age: user.age + 1 })๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.
  • React๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์ฐธ์กฐ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ๊ฐ์ง€ํ•˜๊ณ , UI๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•œ๋‹ค.

 

4๏ธโƒฃ ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•

React์—์„œ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•œ ํ›„, ๋ณ€๊ฒฝ๋œ ๊ฐ’๋งŒ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค.

โœ” ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ์‹

setState({ count: state.count + 1 });
  • {}๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ๊ธฐ์กด ์ƒํƒœ์™€ ์ƒ๊ด€์—†์ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ์— ์ ํ•ฉํ•˜๋‹ค.

โœ” ์ „๊ฐœ ์—ฐ์‚ฐ์ž(Spread Operator) ์‚ฌ์šฉ

setState({ ...state, count: state.count + 1 });
  • ...state๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด ๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ณต์‚ฌํ•˜๋ฉด์„œ, ํŠน์ • ์†์„ฑ๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ์กด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ผ๋ถ€ ์†์„ฑ๋งŒ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

๐Ÿ’ก ์˜ˆ์ œ

const [user, setUser] = useState({ name: "์ฒ ์ˆ˜", age: 25 });

setUser({ ...user, age: 26 }); // โœ… ๊ธฐ์กด name ์†์„ฑ์€ ์œ ์ง€๋˜๊ณ  age๋งŒ ๋ณ€๊ฒฝ๋จ

 

5๏ธโƒฃ React์—์„œ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ 

1๏ธโƒฃ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค

  • ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉด React๊ฐ€ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด setState()์— ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.

2๏ธโƒฃ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” ... ์ „๊ฐœ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค

  • setState({ ...state, ๋ณ€๊ฒฝํ•  ๊ฐ’ }) ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฝ๋‹ค.

3๏ธโƒฃ ์ด์ „ ์ƒํƒœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ๊ฒฝ์šฐ prevState๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค

setState(prevState => ({ ...prevState, count: prevState.count + 1 }));
  • ์ƒํƒœ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋  ๋•Œ prevState๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ์ „ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

6๏ธโƒฃ ์ •๋ฆฌ

โœ” React์—์„œ ๊ฐ์ฒด๋ฅผ ์ƒํƒœ(state)๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ” ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.
โœ” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ setState()์— ์ „๋‹ฌํ•ด์•ผ React๊ฐ€ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
โœ” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•

  • { ...state, ๋ณ€๊ฒฝํ•  ์†์„ฑ } (์ „๊ฐœ ์—ฐ์‚ฐ์ž)
  • Object.assign({}, state, ๋ณ€๊ฒฝํ•  ์†์„ฑ)

โœ” ๊ฐ์ฒด์™€ ๊ธฐ๋ณธ ๊ฐ’(Primitive Value)์€ ์ƒํƒœ ๋ณ€๊ฒฝ ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค.
โœ” ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด React์˜ ์›ํ™œํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์ค‘์š”ํ•˜๋‹ค.

๋ฐ˜์‘ํ˜•