State

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • state (์ƒํƒœ)

    • ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ 3๋Œ€ ์›์น™ - DRY ์›์น™

  • Lifting State Up

    • Inverse Data Flow

    • SSOT(Single Source of Truth)

  • useState

    • 1๊ธ‰ ๊ฐ์ฒด(first-class object)๋ž€?

State

๐Ÿ“– State(์ƒํƒœ)๋ž€?

  • ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ณ€๊ฒฝ๋˜๋Š” ๋™์ ์ธ ๊ฐ’

  • ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฐ์ฒด

  • ์ปดํฌ๋„ŒํŠธ์˜ ๋‚ด๋ถ€์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌ ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

๐Ÿ”„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ Re-render ํ•˜๋Š” ์กฐ๊ฑด

  • ์ƒํƒœ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ ( useState, Redux ๋“ฑ์„ ํ†ตํ•œ ์ƒํƒœ๊ฐ’ ๋ณ€๊ฒฝ์‹œ)

  • Props์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ

  • ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ state ๋ณ€๊ฒฝ๋˜์–ด ๋ Œ๋”๋ง ํ•˜๊ฒŒ๋˜๋ฉด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋„ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋œ๋‹ค.

State๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด

๋ฐ์ดํ„ฐ๋ผ๊ณ  ํ•ด์„œ ๋ชจ๋‘ state ์•„๋‹ˆ๋‹ค!

  1. ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฑด state๋กœ ๋‹ค๋ฃฐ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค. โ‡’ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค.

  2. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•œ๋‹ค๋ฉด state๊ฐ€ ์•„๋‹ˆ๋‹ค.

  3. ๋‹ค๋ฅธ state๋‚˜ props๋ฅผ ์ด์šฉํ•ด ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด state๊ฐ€ ์•„๋‹ˆ๋‹ค.

๐ŸŒŽ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ 3๋Œ€ ์›์น™

  • DRY (Don't Repeat Yourself) : ์ค‘๋ณต ๋ฐฐ์ œ

    • ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ค‘๋ณตํ•ด์„œ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.

    • ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์—ฌ์•ผ ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์—์„œ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€๋ณด์ˆ˜๋น„์šฉ์ด ์ ˆ๊ฐ์ด ๋œ๋‹ค.

  • KISS (Keep It Simple, Stupid) : ๋‹จ์ˆœํ™”

    • ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP) , ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™

    • ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋…์„ฑ์ด ์ข‹๊ณ , ๋ฒ„๊ทธ๋ฅผ ์œ ๋ฐœํ•˜๋Š”๊ฒƒ๋„ ์ค„์–ด๋“ ๋‹ค.

  • YAGNI (You Ain't Gonna Need It) : ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํ™•์žฅ์„ ๊ณ ๋ คํ•œ ๊ฐœ๋ฐœ์€ ํ•˜์ง€ ๋ง์•„๋ผ.

    • ๋ถˆํ•„์š”ํ•˜๊ฒŒ ํ™•์žฅ์— ์น˜์ถฉํ•œ ์ฝ”๋“œ๊ฐ€ ์ƒ๊ธฐ๊ฑฐ๋‚˜ ์ง€๊ธˆ ๋‹น์žฅ ํ•„์š”๋กœ ์•Š์€ ๋กœ์ง์„ ๋งŒ๋“ค์ง€ ๋ง์ž๋Š” ์›์น™

โฌ† Lifting State Up

๐Ÿค” state๋ฅผ ๋ˆ„๊ฐ€ ๊ด€๋ฆฌํ•˜๊ณ , ์†Œ์œ ํ•ด์•ผ ํ• ๊นŒ?

state๊ฐ€ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์˜ํ–ฅ์„ ์ค€๋‹ค๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์œ„์น˜ํ•ด๋„ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋‘๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜์˜ state๋กœ ๋ถ€ํ„ฐ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค๋ฉด ๋‘ ์ปดํฌ๋„ŒํŠธ ๊ณตํ†ต ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์— state๋ฅผ ๋Œ์–ด์˜ฌ๋ ค ๊ณต์œ ํ•ด์•ผํ•œ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ Lifting State Up state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ๋ผ๊ณ  ํ•œ๋‹ค.

๐Ÿค– ๊ทธ๋ ‡๋‹ค๋ฉด Lifting State Up์€ ์—ญ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ์•„๋‹Œ๊ฐ€?

๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด๋ผ๋Š” ์›์น™์— ๋”ฐ๋ผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ ํ˜น์ธ ํƒ€์ž…์ด ๋ฌด์—‡์ธ์ง€๋งŒ ์•Œ์ˆ˜ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ state, ํ•˜๋“œ์ฝ”๋”ฉ์œผ๋กœ ์ž…๋ ฅ๋œ ๋‚ด์šฉ์ธ์ง€๋„ ์•Œ์ง€ ๋ชปํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์–ด๋–ค ์ด๋ฒคํŠธ๋กœ ์ธํ•ด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ state๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์€ ๋งˆ์น˜ ์—ญ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐ ๋œ๋‹ค.

์ƒ์œ„ ์ปดํฌ๋„Œ์˜ "์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜" ๊ทธ ์ž์ฒด๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๊ณ , ์ด ํ•จ์ˆ˜๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰ํ•œ๋‹ค.

โ‡’ state ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ๋Š” state๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ state ๊ฐฑ์‹  ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ ๋ฐ›์•„ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ state ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•œ๋‹ค.

  • ๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›

  • ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๊ณต๊ฐ„์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

React์—์„œ๋Š” ๋ชจ๋“  state๊ฐ€ ํ•œ๊ณณ์— ์žˆ๋‹ค๋Š” ๋œป์ด ์•„๋‹ˆ๋ผ, ๊ฐ state ๋งˆ๋‹ค ํ•ด๋‹น ์ •๋ณด๋ฅผ ์†Œ์œ ํ•˜๋Š” ํŠน์ • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ์˜๋ฏธ ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ๊ณต์œ ํ•˜๋Š” state๋“ค์„ ๊ฐ์ž ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ถ€๋ชจ์ปดํฌ๋„ŒํŠธ(๋‹จ์ผ์ฑ…์ž„)์—์„œ state๋ฅผ ์ƒ์„ฑํ•ด, ์ž์‹์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š”๊ฒƒ์„ ์˜๋ฏธ

๐Ÿช useState

  • React Hook์ด๋ฉฐ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ

  • setStateํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ state๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” ํ™”๋ฉด์— ๋‹ค์‹œ ๋ Œ๋”๋ง์ด ๋œ๋‹ค.

  • ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œ๋Š” setState ํ•จ์ˆ˜๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

export default function Index() {
  const [state, setState] = useState(0);
  const onClick = () => {
    setCount(count + 1) // 0 + 1
    setCount(count + 1) // 0 + 1
    setCount(count + 1) // 0 + 1   <- ์ด ์ฝ”๋“œ๋งŒ ์ ์šฉ๋จ
    console.log(count) // 0
  };
  return (
    <div>
      <p> ํ˜„์žฌ state : {state}</p>
      <button type="button" onClick={onClick}>
        +3
      </button>
    </div>
  );
}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ ๋ณด๋ฉด console.log(state) ๊ฐ’์€ ์ด์ „์˜ ์ƒํƒœ๊ฐ’์ธ 0์ด ์ถœ๋ ฅ๋˜๊ณ , state ๊ฐ’์€ 1์ด๋‹ค. โ‡’ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ด์œ ๋Š” setState ํ•จ์ˆ˜๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  React๊ฐ€ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ๋‚ด์˜ ๋กœ์ง์„ ๋ชจ๋‘ ์ฝ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ์— ์ผ๊ด„ ์ฒ˜๋ฆฌ(Batch)ํ•ด ํ•œ๋ฒˆ์— ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿค” ์™œ React๋Š” ์ƒํƒœ ๊ฐ’์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์„๊นŒ?

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

๐Ÿค” ์—ฐ์†๋œ setState๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€?

  • setStateํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

  • useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.

๐Ÿ“– 1๊ธ‰ ๊ฐ์ฒด(first-class object)๋ž€?

  • 1๊ธ‰ ์‹œ๋ฏผ์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๊ฐ์ฒด(Object)

  • Javascript ์—์„œ๋Š” ๊ฐ์ฒด๋Š” 1๊ธ‰ ์‹œ๋ฏผ์„ ์ถฉ์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1๊ธ‰๊ฐ์ฒด ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

ํ•จ์ˆ˜์ง€ํ–ฅ ์–ธ์–ด๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 1๊ธ‰ ๊ฐ์ฒด ์ฆ‰, 1๊ธ‰ ํ•จ์ˆ˜ ๊ฐœ๋…์„ ๋งŒ์กฑํ•ด์•ผ๋˜๋ฉฐ, JS์—์„œ๋Š” ์ด๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ํ˜• ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ฐ–์ถ˜ ์–ธ์–ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

โ‡’ props๋กœ ํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ ์ค„ ์ˆ˜ ์žˆ๋Š”๊ฑด 1๊ธ‰ ๊ฐ์ฒด์ด๊ธฐ์— ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๊ฑฐ๋‚˜, ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ดํ•ดํ–ˆ๋‹ค.

๐Ÿ”— ์ฐธ๊ณ 

Last updated