Frontend๐ŸŽจ/Reactโš›๏ธ

[React]useState์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž(+React Hook)

JanuDev 2025. 1. 28. 21:23

(์‹œ์ž‘๋„ ์•ˆํ–ˆ์ง€๋งŒ ๋ฒŒ์จ ํ•˜๊ธฐ ์‹ซ์Œ)

์˜ค๋Š˜์€ ๋‚ด๊ฐ€ ๋งŒ๋“ค๊ณ  ์žˆ๋Š” ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” useState์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค(๋‚˜๋ฅผ ์œ„ํ•œ๊ฒƒ)

 

1. State๋ฅผ ๋จผ์ € ์•Œ์•„์•ผ ํ•œ๋‹ค

React ๊ณต์‹๋ฌธ์„œ์—์„œ state๋Š” ์ปดํฌ๋„ŒํŠธ ๋ณ„ ๋ฉ”๋ชจ๋ฆฌ๋ผ๊ณ   ์„ค๋ช…ํ•œ๋‹ค. ์ฆ‰, ์ปดํฌ๋„ŒํŠธ๋Š” ํ˜„์žฌ ์ž…๋ ฅ๊ฐ’, ํ˜„์ง€ ์ด๋ฏธ์ง€, ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ฐ™์€ ๊ฒƒ์„ "๊ธฐ์–ต"ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ state๋ผ๊ณ  ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

/*state๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  useState๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค.*/
import {useState} from 'react';

/*์ž„์˜์˜ ๋ณ€์ˆ˜ ํ•˜๋‚˜ ์„ ์–ธ*/
let count = 0;

/*[state๋ณ€์ˆ˜, setterํ•จ์ˆ˜ ์„ ์–ธ]*/
/*์—ฌ๊ธฐ์„œ [] ๋ฌธ๋ฒ•์€ ๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด๋ผ๊ณ  ํ•˜๋ฉฐ, useState๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฐ์—ด์—๋Š” ํ•ญ์ƒ 2๊ฐœ์˜ ํ•ญ๋ชฉ์ด ์žˆ๋‹ค.*/
const [count, setCount] = useState(0) 

/*setCount ๋™์ž‘ ์„ ์–ธ*/
function handleClick(){
	setCount(count+1);
}

count์—๋Š” ํด๋ฆญํ•  ๋•Œ ๋งˆ๋‹ค +1๋˜์–ด ๊ฐ’์ด ์ง€์†์ ์œผ๋กœ ๋ฐ”๋€๋‹ค. ์ด๋ ‡๋“ฏ ์ง€์†์ ์œผ๋กœ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ๋‹ด๋Š” ๊ฒƒ์ด state์ด๋‹ค.

2. ๊ทธ๋Ÿผ useState๋ž€ ๋ฌด์—‡์ธ๊ฐ€

๋ฆฌ์•กํŠธ ๊ณต์‹ ๋ฌธ์„œ์—์„  "useState๋Š” ์ปดํฌ๋„ŒํŠธ์— state๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” React Hook์ž…๋‹ˆ๋‹ค."๋ผ๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์ง€๋งŒ, ์ดˆ๋ณด ๋ฆฌ์•กํŠธ ์‚์•ฝ์ด์ธ ๋‚˜๋Š” ์†”์งํžˆ ๋ญ๋ผ๋Š”๊ฑด์ง€ ์กฐ๋˜ ๋ชฐ๋ผ์„œ ์ง€ํ”ผํ‹ฐ ์“ฐ์•ต๋‹˜ํ•œํ…Œ ํ—ฌํ”„์ณค๋‹ค.

์ง€ํ”ผํ‹ฐ ์“ฐ์•ต๋‹˜๐Ÿ‘ฝ ์™ˆ,

์ƒ์ƒํ•ด๋ณด์ž. ๋„ค๊ฐ€ ๊ฒŒ์ž„์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ฒŒ์ž„์—์„œ ์ ์ˆ˜๋ฅผ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด.
์ ์ˆ˜๊ฐ€ ๊ณ„์† ๋ณ€ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ ํ˜„์žฌ ์ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ณ , ์ ์ˆ˜๊ฐ€ ๋ณ€ํ•˜๋ฉด ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ด.
๋ฐ”๋กœ useState๊ฐ€ ๊ทธ๋Ÿฐ ์—ญํ• ์„ ํ•ด!

๋ผ๊ณ  ํ•˜์…จ๋‹ค.

 

๋”ฐ๋ผ์„œ useState๋Š” ์ง€์†์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” react Hook์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด,

const [score, setScore] = useState(0)
  • score : ํ˜„์žฌ ์ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” state๋ณ€์ˆ˜
  • setScore : score์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
  • useState(0) : ์ ์ˆ˜๋ฅผ 0์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ดˆ๊ธฐํ™”ํ•œ ๊ฒƒ

์ ์ˆ˜๋ฅผ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„  setScore์„ ์„ธํŒ…ํ•ด์•ผ ํ•œ๋‹ค. 

setScore(score + 10)

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ํ˜„์žฌ ์ ์ˆ˜(score)์— +10์„ ๋”ํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

3. useState์˜ ํŠน์ง•

๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ํ™”๋ฉด์— ์—…๋ฐ์ดํŠธ ๋œ๋‹ค. โญโญโญ
  • ํ•œ๋ฒˆ ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด, ํ™”๋ฉด์— ๊ทธ ๋ฐ”๋€ ๊ฐ’์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด์—ฌ์ค€๋‹ค.
  • 1๏ธโƒฃ์ƒํƒœ๊ฐ’, 2๏ธโƒฃ๊ทธ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ํ•จ์ˆ˜๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋Š” ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.
  • ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
const [name, setName] = useState('')
const [age, setAge] = useState(0)

 

4. "use"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋ฅผ Hook์ด๋ผ๊ณ  ํ•œ๋‹ค

๊ทธ๋ž˜์„œ React์—์„œ๋Š” useEffect, useRef ๋“ฑ๋“ฑ์„ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ์น˜๋งŒ ์ด๊ฑด ํ˜„์žฌ(25.01.28 ๊ธฐ์ค€) ๊ฐ ํ”„์—์„œ useState์ด์™ธ์˜ ๋‹ค๋ฅธ ๊ฑด ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋‚˜์ค‘์— ์‚ฌ์šฉ๋  ๋•Œ ๊ฐ™์ด ์ •๋ฆฌํ•˜๊ฒ ๋‹ค!

 

์ฃผ์˜์ ?

Hook์€ ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ์ˆ˜์ค€(ex. App.jsx) ํ˜น์€ ์ปค์Šคํ…€ ํ›…์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค?

์ด๊ฒŒ ๋ญ”์†Œ๋ฆฌ๋ƒ ์นด๋ฉด, ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋งจ ์œ„์ชฝ, ์ฆ‰ ๋ Œ๋”๋ง ๋˜๋Š” JSX ์ฝ”๋“œ ์‹คํ–‰ ์ „์— ํ›…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.

return ์ „์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.
if๋ฌธ ๋’ค์— ์ผ๋‹ค๊ฐ€ ํ˜ธ๋œ ์—๋Ÿฌ๋ฅผ ๋‹นํ–ˆ๋‹ค...

ํ™”๋ฉด์—์„œ ๋ Œ๋”๋ง ๋˜๋Š” ๊ฑด return๋ฌธ ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ€์žฅ ์ƒ๋‹จ์— ์„ ์–ธ๋˜์–ด์•ผ react Hook์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๊ทธ๋Ÿผ ์ปค์Šคํ…€ ํ›…์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

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

/*useCounter์ด๋ผ๋Š” ์ปค์Šคํ…€ ํ›… ๋งŒ๋“ค๊ธฐ*/
function useCounter(args){
  const [count, setCount] = useState(args)
  
  function increment(){
    setCount(count + 1)
  }
  
  function decrement(){
    setCount(count - 1)
  }
  
  return {count, increment, decrement}
}

function myComponent(){
  const {count, increment, decrement} = useCounter // ์ปค์Šคํ…€ ํ›… ์‚ฌ์šฉ
  
  return(
  <div>
  	<h3>{count}</h3>
    <button onClick={increment}>์ฆ๊ฐ€</button>
    <button onClick={decrement}>๊ฐ์†Œ</button>
  </div>
  )
}

์ด๋Ÿฐ์‹์œผ๋กœ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ปค์Šคํ…€ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[์ถœ์ฒ˜]

state: https://ko.react.dev/learn/state-a-components-memory

 

State: ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ์–ต ์ €์žฅ์†Œ – React

The library for web and native user interfaces

ko.react.dev

useState : https://ko.react.dev/reference/react/useState