[React] Props์™€ State

eonisalยท2023๋…„ 8์›” 1์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
4/10
post-thumbnail

๐Ÿค– Props๋ž€?

props

props๋Š” ์ปดํฌ๋„ŒํŠธ์— ์›ํ•˜๋Š” ๊ฐ’์„ ๋„˜๊ฒจ์ค„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

function App() {
  return (
    <div>
      <Greeting name="React" />
    </div>
  )
}

App ์ด๋ผ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ Greeting ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, Greeting ์ปดํฌ๋„ŒํŠธ์— name ์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ์ƒํ™ฉ์ด๋‹ค.

๋”ฑ js์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ธ์ž๋กœ ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์ด๋ ‡๊ฒŒ ๋ฆฌ์•กํŠธ์—์„œ ์ปดํฌ๋„ŒํŠธ์— ์–ด๋– ํ•œ ๊ฐ’์„ ๋„˜๊ฒจ์ค„ ์ˆ˜๊ฐ€ ์žˆ๊ณ  ๊ทธ ๊ฐ’์„ ์ปดํฌ๋„ŒํŠธ ์„ ์–ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์“ฐ๋Š” ๊ฒƒ์ด props๋ผ๋Š” ์นœ๊ตฌ๋‹ค.

function Greeting(props) {
  console.log(props);
  return <h2>Hello, {props.name}!</h2>;
}

Greeting ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜์—ฌ ๋„˜๊ฒจ์ค€ name ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, Greeting ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์“ด props๊ฐ€ ์œ„์˜ <Greeting name="React" /> ์—์„œ์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ์— ๋„˜๊ฒจ์ค€ ๋ณ€์ˆ˜๋“ค์„ ๋ฐ›์•„์ค€๋‹ค.

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด 2๋ฒˆ์งธ ์ค„์— ์จ๋†“์€ console.log(props)์— ์˜ํ•ด ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์ฐฝ์— {name: 'React'} ๋ผ๊ณ  ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค. props๋Š” object์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ์— ๋„˜๊ฒจ์ค€ ๋ณ€์ˆ˜๋“ค์„ ํ”„๋กœํผํ‹ฐ๋กœ ๊ฐ–๋Š” object์ธ ๊ฒƒ์ด๋‹ค.

์ด ์˜ˆ์‹œ๋Š” ๋„˜๊ฒจ์ฃผ๋Š”๊ฒŒ name ๋ฐ–์— ์—†์–ด์„œ props๊ฐ€ name์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ ํ•˜๋‚˜๋งŒ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ, ๋งŒ์•ฝ <Greeting name="ํ‚ด๋ฏผ์ˆ˜" age=27 job="๋ฐฑ์ˆ˜" /> ๋ผ๊ณ  ํ–ˆ๋‹ค๋ฉด props๋Š” {name: "ํ‚ด๋ฏผ์ˆ˜", age: 27, job: "๋ฐฑ์ˆ˜"} ์ธ object์ผ ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ props๋กœ ๊ฐ’์„ ๋ฐ›๊ณ  ๊ทธ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด js์—์„œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ props.๋ณ€์ˆ˜๋ช… ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๊ฒƒ์ด๊ณ , ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์ด๊ธฐ ๋•Œ๋ฌธ์— { }๋กœ ๊ฐ์‹ธ์ฃผ๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์›ํ•˜๋Š”๋Œ€๋กœ ๊ทธ๋•Œ๊ทธ๋•Œ ๋‹ค๋ฅธ ๊ฐ’์„ ๋„˜๊ฒจ์คŒ์œผ๋กœ์จ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ props์ธ ๊ฒƒ์ด๋‹ค!

๐Ÿ‘€ props๋Š” ๊ทธ๋ƒฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ช…์ผ ๋ฟ, ๋ฐ˜๋“œ์‹œ ์ด๋ฆ„์„ props๋กœ ํ•ด๋ผ! ๋ผ๊ณ  ์ •ํ•ด์ง„๊ฒŒ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ํ•ด๋„ ์ „ํ˜€ ์ƒ๊ด€์—†๋‹ค. ํ•˜์ง€๋งŒ properties์˜ ์ค„์ž„๋ง์ธ props ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํ•˜๋Š”๊ฒŒ ๊ด€๋ก€์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ props๋กœ ํ•˜์ž

props๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€

๊ทผ๋ฐ ์ด๋Ÿฐ props๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

function Greeting(props) {
  props.name = "๊ฐœ๋˜ฅ์ด";
  return <h2>Hello, {props.name}!</h2>;
}

์ด์™€ ๊ฐ™์ด ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ๋‚ด์—์„œ props๋กœ ๋ฐ›์€ ๊ฐ’์„ ์ง์ ‘์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๋ฌผ๋ก  ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€, ํ•จ์ˆ˜ํ˜• ํด๋ž˜์Šคํ˜• ๋ญ˜๋กœ ์„ ์–ธํ–ˆ๋“  props๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜๋Š” ์—†๋‹ค.

๋ชจ๋“  React ์ปดํฌ๋„ŒํŠธ๋Š” props์™€ ๊ด€๋ จํ•œ ๋™์ž‘์„ ํ•  ๋•Œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์•ผํ•œ๋‹ค.

์ถœ์ฒ˜ : React ๊ณต์‹๋ฌธ์„œ

props ๊ฐ’์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ, ๊ตณ์ด ๋ฐ›์€ props๊ฐ’์„ ๋ณ€๊ฒฝํ•˜์—ฌ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

function Greeting(props) {
  const newName = "์กด์ž˜ " + props.name;
  return <h2>Hello, {newName}!</h2>;
}

์ด์™€ ๊ฐ™์ด ๊ทธ๋ƒฅ props ๋ณ€์ˆ˜์— ๋‹ค๋ฅธ ๊ฐ’์„ ๋ถ™์—ฌ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋กœ ๋งŒ๋“ค๊ณ  ๊ทธ ๋ณ€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค(...)

default props

์ปดํฌ๋„ŒํŠธ์— ๊ผญ props๋ฅผ ์ง์ ‘ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š๊ณ ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” props๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ default props๋ผ๊ณ  ํ•œ๋‹ค.

์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Card.defaultProps = {
  tags: "๋””ํดํŠธ ํ”„๋กญ์Šค"
}

function Cart({tags}) {
  return <h1>{tags}</h1>

์ปดํฌ๋„ŒํŠธ๋ช….defaultProps์— ์›ํ•˜๋Š” props๋ช…์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ ๊ฐ์ฒด์— ์ง€์ •ํ•œ ํ”„๋กœํผํ‹ฐ๋“ค์ด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ default props๊ฐ€ ๋˜๊ณ  ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ props๋ฅผ ๋ฐ›์„๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๐ŸฆŽ State๋ž€?

state

๋ฆฌ์•กํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์œ ๋™์ ์œผ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ state ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ €์žฅํ•œ๋‹ค.

์›๋ž˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” state ๊ธฐ๋Šฅ์ด ์—†์—ˆ์ง€๋งŒ Hook ์ด๋ผ๋Š” ๊ฐœ๋…์ด ๋„์ž…๋˜๋ฉด์„œ ํ•จ์ˆ˜ํ˜•์—์„œ๋„ state๋ฅผ ์“ธ ์ˆ˜๊ฐ€ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ state ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

state๋Š” props์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ js ๊ฐ์ฒด์ด๋‹ค.

์ผ๋‹จ state๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด react์˜ useState๋ฅผ import ํ•ด์•ผ ํ•œ๋‹ค.

import { useState } from 'react'

๊ทธ๋ฆฌ๊ณ  console.log(useState(0)) ์ด๋ผ๊ณ  ํ•˜๋ฉด ์ฝ˜์†”์ฐฝ์— Array ๊ฐ์ฒด๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด ๋ฐฐ์—ด์„ ํŽผ์ณ๋ณด๋ฉด ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋Š” useState์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€ 0์ด ๋“ค์–ด๊ฐ€์žˆ๊ณ , ๋‘๋ฒˆ์งธ ์š”์†Œ๋Š” ์–ด๋– ํ•œ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ๋‹ค.

์ด ๋‘๋ฒˆ์งธ ์š”์†Œ์ธ ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ ์ฒซ๋ฒˆ์งธ ์š”์†Œ์˜ ๊ฐ’์„ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค(์ด ํ•จ์ˆ˜๋ฅผ ๋ณดํ†ต "setState ํ•จ์ˆ˜" ๋ผ๊ณ  ์นญํ•จ).
๊ทธ๋ฆฌ๊ณ  ์ฒซ๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ useState์˜ ์ธ์ž์— ์ ์–ด์ค€ ๊ฐ’์œผ๋กœ, state ๋ณ€์ˆ˜์˜ ์ดˆ๊ธฐ๊ฐ’์ด ๋œ๋‹ค.

์ด๋ฅผ ์ด์šฉํ•ด useState๋กœ state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

const getState = useState("๊ฐœ๋˜ฅ์ด")
const name = getState[0];
const setName = getState[1];

name ๋ณ€์ˆ˜๋Š” useState("๊ฐœ๋˜ฅ์ด")๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ, ์ฆ‰ useState๋กœ ์ง€์ •ํ•œ ์ดˆ๊ธฐ๊ฐ’์ธ "๊ฐœ๋˜ฅ์ด"๊ฐ€ ๋˜๊ณ , setName ๋ณ€์ˆ˜๋Š” state ๋ณ€์ˆ˜์ธ name์„ ๋ณ€๊ฒฝ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” setState ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค

const [ name, setName ] = useState("๊ฐœ๋˜ฅ์ด");

useState๊ฐ€ [ state ๋ณ€์ˆ˜ ์ดˆ๊ธฐ๊ฐ’, setState ํ•จ์ˆ˜ ] ํ˜•ํƒœ์˜ ๋ฐฐ์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ฒ˜๋Ÿผ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์œผ๋กœ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

props์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ useState์˜ ๋‘๋ฒˆ์งธ ์š”์†Œ์ธ setState ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ๋ญ˜๋กœ ํ•˜๋“  ์ƒ๊ด€์€ ์—†์ง€๋งŒ ๋ณดํ†ต ์ง€์ •ํ•œ ๋ณ€์ˆ˜๋ช… ์•ž์— set์„ ๋ถ™์—ฌ ์นด๋ฉœ์ผ€์ด์Šค๋กœ ์ง“๋Š”๋‹ค.

state๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ๋Š” setState ํ•จ์ˆ˜๋งŒ์„ ํ†ตํ•ด state ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด์žˆ๋‹ค. ์ด setState ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด state ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

setName("๋Œ์‡ ");
setName((current) => { return "๋Œ์‡ " });

state ๋ณ€์ˆ˜๋Š” setState ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ์ด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ setName("๋Œ์‡ ") ๋ผ๊ณ  ํ•˜๋ฉด name์€ ๋Œ์‡ ๊ฐ€ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์„ ๋ฐ”๋กœ setState์˜ ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ  ๋‘๋ฒˆ์งธ์ฒ˜๋Ÿผ setState์˜ ์ธ์ž๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, setState์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์ธ์ž๋กœ state ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  return ์œผ๋กœ ๋ฐ˜ํ™˜๋œ ๊ฐ’์œผ๋กœ state ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ์ด ๋œ๋‹ค.

๋”ฐ๋ผ์„œ setName((current) => { return "๋Œ์‡ " }); ์—์„œ current๋Š” state ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์ธ "๊ฐœ๋˜ฅ์ด"๊ฐ€ ๋˜๊ณ , ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์ธ "๋Œ์‡ "๋กœ state ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด setName("๋Œ์‡ ") ์™€ ์™„๋ฒฝํ•˜๊ฒŒ ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.

๋‘ ๋ฐฉ๋ฒ•์˜ ์ฐจ์ด

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

์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ state ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์ด ๋ญ๋“  ๊ทธ๋ƒฅ setState ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋ƒ…๋‹ค ๋ณ€๊ฒฝํ•ด๋ฒ„๋ฆฌ๋Š” ์ƒ๋‚จ์ž๋‹ค์šด ๋ฐฉ๋ฒ•์ด๊ณ , ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ state ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์„ ๊ณ ๋ คํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์ฐจ์ด์ด๋‹ค.

๋ฌผ๋ก  ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๋„ state ๋ณ€์ˆ˜์˜ ํ˜„์žฌ๊ฐ’์ธ current๊ณผ๋Š” ์ƒ๊ด€์—†์ด ๊ทธ๋ƒฅ ๋ฐ”๋กœ return ๊ฐ’์„ "๋Œ์‡ "๋กœ ๋ฐ•์•„๋ฒ„๋ ค์„œ ์˜๋ฏธ์—†๊ธด ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ state ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์ด ๋ญ”์ง€์— ๋”ฐ๋ผ์„œ ๋ฐ”๊ฟ€ ๊ฐ’์ด ๋‹ฌ๋ผ์ง„๋‹ค๊ฑฐ๋‚˜ state ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ฑฐ๋‚˜ ๋ญ ์ด๋ ‡๊ฒŒ state ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์„ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ๋„ ์žˆ์„ ์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์“ฐ๋ฉด ๋œ๋‹ค.

์•„๋ฌดํŠผ state ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์„ ๊ณ ๋ คํ•˜๋Š๋ƒ ์•„๋‹ˆ๋ƒ์˜ ์ฐจ์ด์ธ ๊ฒƒ์ด๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—์„œ๋Š” ๋‘˜์ค‘ ๋ญ˜ ์‚ฌ์šฉํ•ด๋„ ์ƒ๊ด€์—†์„ ๊ฒƒ์ด๋‹ค.

๋ฆฌ๋ Œ๋”๋ง

๋ฆฌ์•กํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์œ ๋™์ ์œผ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ state ๋ผ๋Š” ์• ๋ฅผ ์ด์šฉํ•ด์„œ ์ €์žฅํ•œ๋‹ค.

state ํŒŒํŠธ์—์„œ ์ฒ˜์Œ ํ•œ ๋ง์ด๋‹ค.

state ๋ณ€์ˆ˜๊ฐ€ ๋ญ”์ง€ ์•Œ๊ฒ ๊ณ , setState ํ•จ์ˆ˜๋กœ ๊ฑ”๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ด์ œ ์•Œ๊ฒ ๋Š”๋ฐ ๊ทธ๋Ÿผ ์™œ ๊ทธ๋ƒฅ ๋ณ€์ˆ˜ ์•ˆ์“ฐ๊ณ  ๊ตณ์ด state ๋ณ€์ˆ˜๋ฅผ ์จ๊ฐ€์ง€๊ณ  ๋ณ€๊ฒฝ๋„ setState ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํ•ด์•ผํ•˜๋Š” ๊ท€์ฐฎ์€ ๋ฐฉ์‹์„ ํƒํ•ด์•ผ ๋˜๋Š”๊ฑฐ์ž„? ์ด๋ผ๊ณ  ๋ฌผ์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ์•กํŠธ์—์„œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ state ๋ณ€์ˆ˜๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š” ๋ฆฌ๋ Œ๋”๋ง(re-rendering) ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.
(๋ฌผ๋ก  ๋‚ด ๋‡Œํ”ผ์…œ์ด๋‹ค)

๋ฆฌ์•กํŠธ๋Š” state ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋œ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์–ด๋– ํ•œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š”๊ฑด ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๋‚ด์šฉ์„ ํ™”๋ฉด์ƒ์— ์ถœ๋ ฅํ•˜๋“  ๊ทธ ๋ณ€์ˆ˜๋กœ ์–ด๋– ํ•œ ์ƒํƒœ๋ฅผ ๋„์ถœํ•ด๋‚ด์„œ ๊ทธ๊ฑธ ํ™”๋ฉด์ƒ์— ์ถœ๋ ฅํ•˜๋“  ํ•˜๊ธฐ ์œ„ํ•จ์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ฐ”๊พผ๋‹ค๋Š”๊ฑด ํ™”๋ฉด์ƒ์— ์ถœ๋ ฅํ•œ ๋ณ€์ˆ˜, ํ˜น์€ ์–ด๋–ค ์ƒํƒœ์˜ ๊ฐ’์„ ์ƒˆ๋กœ ๋ฐ”๋€ ๊ฐ’ ํ˜น์€ ์ƒํƒœ๋กœ ๋ฐ”๊ฟ” ๋ณด์—ฌ์ฃผ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ผ ๊ฒƒ์ด๋‹ค(์•„๋‹˜ ๋ง๊ณ ).

๊ทธ๋Ÿฐ ๊ด€์ ์—์„œ ๋ณด๋ฉด ๋ฆฌ์•กํŠธ๋Š” state ๋ณ€์ˆ˜๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง, ์ฆ‰ ๋ฐ”๋€ ๋ณ€์ˆ˜๊ฐ’์ด ๋‚˜์˜ค๊ฒŒ ์•Œ์•„์„œ ๊ฐฑ์‹ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ๋งŒ์œผ๋กœ state ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๋Š”๊ฑด ์•„์ฃผ ํ•ฉ๋ฆฌ์ ์ด๋‹ค.

state๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ฆฌ์•กํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ state ๋ณ€์ˆ˜์˜ ๊ฐ’์€ setState ํ•จ์ˆ˜๋งŒ์„ ํ†ตํ•ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ์ด๋Š” state ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ, ์ฆ‰ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ(state)๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฆฌ์•กํŠธ์—๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•˜๋ผ๋Š” ๋ช…๋ น์„ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

๋‹ค์‹œ๋งํ•ด, setState ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์•ผ ๋ฆฌ์•กํŠธ๊ฐ€ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค๋ผ๋Š” ๊ฒƒ์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ๊ฐฑ์‹ ์‹œ์ผœ์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋ ‡๊ธฐ๋•Œ๋ฌธ์— setState ํ•จ์ˆ˜๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์•ผ๋งŒ ํ•˜๋Š” state ๋ณ€์ˆ˜๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ๊ตณ์ด๊ตณ์ด ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.

์•„๋ฌดํŠผ ์ค‘์š”ํ•œ๊ฑด state ๋ณ€์ˆ˜๋Š” setter ํ•จ์ˆ˜๋กœ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ , state ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค! ๋ผ๋Š”๊ฑฐ๋‹ค ๐Ÿ‘

Object ํƒ€์ž…์˜ state ๋ณ€์ˆ˜ ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ

state ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒด๋ผ๋ฉด ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด ํ•˜๋‚˜ ์žˆ๋‹ค.

const [ user, setUser ] = useState({ name: "ํ‚ด๋ฏผ์ˆ˜", age: 27, job: "๋ฐฑ์ˆ˜" });
setUser(current => {
  current.job = "FE ์‹ ์ž… ๊ฐœ๋ฐœ์ž";
  return current;
});

user๋ผ๋Š” state ๋ณ€์ˆ˜๋ฅผ { name: "ํ‚ด๋ฏผ์ˆ˜", age: 27, job: "๋ฐฑ์ˆ˜" } ๋ผ๋Š” ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  setUser์˜ ์ธ์ž๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ผ๋‹ค.

ํ˜„์žฌ state ๋ณ€์ˆ˜์ธ ๊ฐ์ฒด์˜ job ํ”„๋กœํผํ‹ฐ๋ฅผ "FE ์‹ ์ž… ๊ฐœ๋ฐœ์ž"๋กœ ๋ฐ”๊พธ๊ณ  ๋ฐ”๋€ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ ๊ฒฐ๊ณผ์ ์œผ๋กœ setUser ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ job ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ”๋€ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ผด์ด๋‹ˆ ์œ„์—์„œ ์‚ดํŽด๋ณธ setState ํ•จ์ˆ˜์˜ ๊ฐœ๋…๋Œ€๋กœ๋ผ๋ฉด ์ „ํ˜€ ๋ฌธ์ œ์—†์–ด ๋ณด์ธ๋‹ค.

ํ•˜์ง€๋งŒ ์•ˆํƒ€๊น๊ฒŒ๋„ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฆฌ์•กํŠธ๊ฐ€ state์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•ด ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

๊ฐ์ฒด ์•ˆ์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋ฟ, ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ข€ ์ƒ์†Œํ•œ ๊ด€์ ์ผ ์ˆ˜ ์žˆ๋Š”๋ฐ ์˜ˆ๋ฅผ๋“ค๋ฉด ์‚ฌ๊ณผ, ๋ฐฐ, ์˜ค๋ Œ์ง€๊ฐ€ ๋“ค์–ด์žˆ๋Š” ์ƒ์ž๊ฐ€ ํ•˜๋‚˜ ์žˆ๊ณ  ์ด ์ƒ์ž๋Š” ๋‚ด๋ถ€๊ฐ€ ๋ณด์ด์ง€ ์•Š๊ฒŒ ๋‹ซํ˜€์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ์ƒ์ž์˜ ๊ฒ‰๋ชจ์Šต๋งŒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

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

์‹ค์ œ๋กœ๋Š” ์‚ฌ๊ณผ์˜ ๊ฐœ์ˆ˜๋Š” ํ•˜๋‚˜ ์ค„๊ณ  ๋ฐฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ•˜๋‚˜ ๋Š˜์–ด์„œ ์ƒ์ž์˜ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€ ์ƒํ™ฉ์ธ๋ฐ ์šฐ๋ฆฌ๋Š” ๋‹ซํžŒ ์ƒ์ž์˜ ๊ฒ‰๋ชจ์Šต๋งŒ์„ ๋ณด๊ณ ์„œ๋Š” ์ด๋ฅผ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์—†๋‹ค.

์ด์ฒ˜๋Ÿผ ๋ฆฌ์•กํŠธ๋กœ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค ํ•ด๋„ ๊ฐ์ฒด ์ž์ฒด๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

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

const [ user, setUser ] = useState({ name: "ํ‚ด๋ฏผ์ˆ˜", age: 27, job: "๋ฐฑ์ˆ˜" });
setUser(current => {
  const newUser = { ...current };
  newUser.job = "FE ์‹ ์ž… ๊ฐœ๋ฐœ์ž";
  return newUser;
});

ํ˜„์žฌ์˜ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด ๊ทธ์™€ ๋™์ผํ•œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•œ ๋’ค ๊ฑ”๋ฅผ setState์˜ ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ธฐ์กด์˜ ๊ฐ์ฒด์™€ ๋‹ค๋ฅธ ๋ณ„๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ๋œ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ๊ฐ€ ๋ณ€ํ™”๋ฅผ ์ธ์‹ํ•œ๋‹ค.

์•ฝ๊ฐ„ ์–•์€๋ณต์‚ฌ, ๊นŠ์€๋ณต์‚ฌ์˜ ๊ฐœ๋…๊ณผ ๋น„์Šทํ•œ ๊ฑฐ ๊ฐ™๋‹ค. ์–•๋ณต์„ ํ•˜๋ฉด ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์ด ๋™์ผํ•˜๋‹ˆ ๊ฐ์ฒด์˜ ๋ณ€ํ™”๊ฐ€ ๊ธฐ์กด๊ฐ์ฒด, ๋ณต์‚ฌํ•œ๊ฐ์ฒด ๋ชจ๋‘์—์„œ ์ผ์–ด๋‚˜๊ณ  ๊นŠ๋ณต์„ ํ•ด์„œ ์ฃผ์†Œ๊ฐ’์ด ๋‹ฌ๋ผ์•ผ ๊ธฐ์กด ๊ฐ์ฒด์™€ ๋‹ค๋ฅธ ๋ณ„๊ฐœ์˜ ๊ฐ์ฒด๋กœ ์ธ์‹์ด ๋˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ

๋ฆฌ์•กํŠธ๋„ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š”๊ฑด ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ๋ฐ”๊ฟ”๋ดค์ž ๊ทธ ๊ฐ์ฒด ๊ณ ์œ ์˜ ์ฃผ์†Œ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋‹ˆ ๊ทธ ๊ฐ์ฒด ์ž์ฒด๋Š” ๊ทธ๋Œ€๋กœ์ธ ๊ฒƒ์œผ๋กœ ์ธ์‹์ด ๋˜๋Š”๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋ฉ‹๋Œ€๋กœ ๋‚ฉ๋“ํ•ด๋ฒ„๋ ธ๋‹ค.

๊ทธ๋ž˜์„œ ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋„ newUser = current ๋ผ๊ณ  ํ•˜์ง€ ์•Š๊ณ  spread ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊นŠ๋ณต์„ ํ•ด์ค€๊ฒƒ์ด ์•„๋‹Œ๊ฐ€! newUser = current ๋ผ๊ณ  ํ•˜๋ฉด ์•„๋งˆ ๋˜‘๊ฐ™์ด ์•ˆ๋ ๊ฑฐ๋‹ค.
(spread ์—ฐ์‚ฐ์ž๋Š” 1์ฐจ์› ๊นŠ์ด์ธ ๊ฐ์ฒด(๋ฐฐ์—ด)๋Š” ๊นŠ์€๋ณต์‚ฌ๋ฅผ ํ•ด์ค€๋‹ค๊ณ  ์•Œ๊ณ ์žˆ์Œ)

์•”ํŠผ ๊ฐ์ฒด ์ƒํƒœ์˜ state๋ฅผ ์‚ฌ์šฉํ• ๋• ์ด ์ ์„ ์ฃผ์˜ํ•˜๋„๋ก ํ•˜์ž โœ…





์ฐธ๊ณ ์ž๋ฃŒ

https://reactjs-kr.firebaseapp.com/docs/components-and-props.html
https://onlyfor-me-blog.tistory.com/463#google_vignette
https://yung-developer.tistory.com/96

profile
์–ธ์ œ๊นŒ์ง€_์ด๋ ‡๊ฒŒ_์‚ด์•„์•ผ๋ผ_

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