Hook series 1 : useState๐Ÿช

๋ฐ๊ฐฑยท2025๋…„ 2์›” 3์ผ
0

REACT

๋ชฉ๋ก ๋ณด๊ธฐ
5/9

*React state ๊ด€๋ จ ์ž‘์„ฑ๊ธ€ โ–ถ๏ธ์ด์ „ ์ •๋ฆฌ๊ธ€ ์ฐธ๊ณ 

1. React Hook๐Ÿช

01. React Hook์ด๋ž€?

React๋Š” 16.8 ๋ฒ„์ „๋ถ€ํ„ฐ Hook์ด๋ž€ ๊ฐœ๋…์ด ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. Hook์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ React state์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ์„ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋กœ, React์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ Hook(useState, useEffect ๋“ฑ)๊ณผ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” Custom Hooks๊ฐ€ ์žˆ๋‹ค.

02. Hook์˜ ๋“ฑ์žฅ ์ด์ „ : ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ฌธ์ œ์ 

  • ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ state๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ณต์žกํ•˜๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์ƒํƒœ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • Class ๋ฌธ๋ฒ•(this ๋ฐ”์ธ๋”ฉ ๋“ฑ) ์ž์ฒด๊ฐ€ ์–ด๋ ต๋‹ค.

03. Hook์˜ ๋“ฑ์žฅ ์ดํ›„ : ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์™€ Hook์˜ ์žฅ์ 

  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ณ„์ธต์„ ๋ฐ”๊พธ์ง€ ์•Š์•„๋„ ์ƒํƒœ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ์•„๋‹Œ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜ ๋‹จ์œ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • Class ๋ฌธ๋ฒ• ์—†์ด๋„ React ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

04. Hook ์ž‘์„ฑ ๊ทœ์น™

  • ๊ฐ™์€ Hook์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
function App() {
  // useState ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  const [name, setName] = useState('');
  const [age, setAge] = useState(0);
  
 ... ์ดํ•˜ ์ƒ๋žต
  • ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ์œ„์—์„œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ›…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
function App() {
  // useState ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  if(true){
  
  	// ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ hook ํ˜ธ์ถœ = ์ž‘๋™X
  	const [bar, setBar] = useState(0) 
    
	}
  
 ... ์ดํ•˜ ์ƒ๋žต
  • ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์ด๋‚˜ ์ง์ ‘ ๋งŒ๋“  Hook์—์„œ๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜(async, await)๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

2. useState๐Ÿ”ƒ

00. state๋ž€?

useState hook์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ์„  state์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ดํ•ดํ•ด์•ผํ•œ๋‹ค.
์ปดํฌ๋„ŒํŠธ๋Š” ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ •ํ•œ ๊ฐ’ (์ž…๋ ฅ๊ฐ’, ์ด๋ฒคํŠธ) ๋“ฑ์„ ๊ธฐ์–ตํ•ด์•ผํ•˜๋Š”๋ฐ, React๋Š” ์ด๋ฅผ state๋ผ๊ณ  ์ •์˜ํ•œ๋‹ค. ์ฆ‰, React ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋™์ ์ธ ์ƒํƒœ๊ฐ’์ด state์ด๋‹ค.

01. useState๋ž€?

useState๋Š” ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ(state) ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€/๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Hook์ด๋‹ค.

02. useState ์‚ฌ์šฉ๋ฒ•

์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ useState๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ state ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.

  • ๋งค๊ฐœ๋ณ€์ˆ˜ : state์˜ ์ดˆ๊ธฐ ์„ค์ •๊ฐ’
  • ๋ฐ˜ํ™˜๊ฐ’ : ํ˜„์žฌ state / set ํ•จ์ˆ˜
    *set ํ•จ์ˆ˜๋ž€? : state๋ฅผ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋ฆฌ๋ Œ๋”๋ง์„ ์ด‰๋ฐœํ•˜๋Š” ํ•จ์ˆ˜
//๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์—ฌ State ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •
const [๋ณ€์ˆ˜๋ช…, setํ•จ์ˆ˜๋ช…] = useState(๋งค๊ฐœ๋ณ€์ˆ˜=์ดˆ๊ธฐ๊ฐ’)

//์˜ˆ์‹œ
import { useState } from 'react';

function App = () => {
  const [name, setName] = useState('');
  const [age, setAge] = useState(0);
  
 ... ์ดํ•˜ ์ƒ๋žต

03. ์–ด๋ผ, useState๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€๊ฑฐ๊ฐ™์€๋ฐ?

  • state๋งˆ๋‹ค useState ์ƒ์„ฑ
    ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ๋งˆ๋‹ค set ํ•จ์ˆ˜๋ฅผ ๊ฐ๊ฐ ํ•œ ๋ฒˆ์”ฉ ๋ถˆ๋Ÿฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
function UserCard() {
  const [name, setName] = useState("ํ™๊ธธ๋™");
  const [age, setAge] = useState(20);
  const [address, setAddress] = useState("์„œ์šธ")

  return (
    <div>
      <h1>์ด๋ฆ„: {name}</h1>
      <h2>๋‚˜์ด: {age}</h2>
      <h3>ํ•™๊ต: {school}</h3>
      <button
        onClick={() => {
          setName("ํ™๊ธธ์ˆœ");
          setAge(22);
          setAddress("๋ถ€์‚ฐ")
        }}
      >
        ์‚ฌ๋žŒ ๋ณ€๊ฒฝ
      </button>
    </div>
  );
}
  • state๋ฅผ ๊ฐ์ฒด๋กœ ๋ฌถ์–ด์„œ useState ์ƒ์„ฑ
    ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๋ฌถ์–ด์„œ set ํ•จ์ˆ˜๋ฅผ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
function UserCard() {
  const [user, setUser] = useState({
    name: "ํ™๊ธธ๋™",
    age: 20,
    address: "์„œ์šธ",
  });

  return (
    <div>
      <h1>์ด๋ฆ„: {user.name}</h1>
      <h2>๋‚˜์ด: {user.age}</h2>
      <h3>ํ•™๊ต: {user.address}</h3>
      <button
        onClick={() => {
          setUser({
            ...user,
            name: "ํ™๊ธธ์ˆœ",
            address: "๋ถ€์‚ฐ",
          });
        }}
      >
        ์‚ฌ๋žŒ ๋ณ€๊ฒฝ
      </button>
    </div>
  );
}

์œ„์™€ ๊ฐ™์ด, age์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ์กด user ๊ฐ์ฒด๋ฅผ spread ์‹œํ‚จ ํ›„, ๋ณ€๊ฒฝ์„ ์›ํ•˜๋Š” ๊ฐ’๋“ค์„ ๋‹ค์‹œ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด ๊ณผ์ •์„ "override"๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์„ ๊ฐ’์€ ์ด์ „์˜ ์ƒํƒœ์—์„œ ๊ฐ€์ ธ์˜จ๋‹ค.

  • ์–ด๋–ค ๋ฐฉ๋ฒ•์ด ๋” ์ข‹์€๊ฐ€?
    ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์—†๋‹ค! ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
    ์ƒํ™ฉ์— ๋”ฐ๋ผ ํ•˜๋‚˜์˜ object๋กœ ๋ฌถ์„ ๋งŒํ•œ ๊ฒƒ์ด๋ฉด ๋ฌถ๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ์ˆœํžˆ ๊ฐœ์ˆ˜๋งŒ ๋งŽ๋‹ค๋Š” ์ด์œ ๋กœ ๊ด€๋ จ์ด ์—†๋Š” ํ•ญ๋ณต๋“ค์„ ํ•˜๋‚˜์˜ object ๋กœ ๋ฌถ๋Š”๋‹ค๋ฉด, ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ์˜คํžˆ๋ ค ๋–จ์–ด์ง„๋‹ค.

04. useState์˜ ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ

ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋ž€ setํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค. setํ•จ์ˆ˜์— ๊ฐ’์„ ๋„ฃ์–ด ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰ํ•˜๋ฉด batch update๋กœ ์ธํ•ด ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค. ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋กœ ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰ํ•˜๋ฉด ๋ช…๋ น์„ ๋ชจ์•„์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ํ•œ๋ฒˆ์”ฉ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ ๋ฐ˜์˜๋œ๋‹ค. ๋˜ํ•œ, ๋ณ€์ˆ˜๋ฅผ props๋กœ ๋‚ด๋ ค์ฃผ์ง€ ์•Š์•„๋„ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

//example
const [count, setCount] = useState(0)

//์ผ๋ฐ˜์ ์ธ set
setCount(count + 1)
setCount(count + 1)
setCount(count + 1)

console.log(count) // 1 โ–ถ๏ธ ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ•œ๋ฒˆ๋งŒ ์ž‘๋™ํ•œ๋‹ค.

//ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ
setCount((prevํ˜„์žฌ๊ฐ’) => prevํ˜„์žฌ๊ฐ’ + 1)
setCount((prevํ˜„์žฌ๊ฐ’) => prevํ˜„์žฌ๊ฐ’ + 1)
setCount((prevํ˜„์žฌ๊ฐ’) => prevํ˜„์žฌ๊ฐ’ + 1)

console.log(count) // 3 โ–ถ๏ธ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ชจ๋‘ ์‹คํ–‰

05. useState ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ์ƒํƒœ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋œ๋‹ค.
  • setState๋Š” ๋™๊ธฐ ํ•จ์ˆ˜์ด์ง€๋งŒ, ๋น„๋™๊ธฐ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค. React์˜ ๋ฆฌ๋ Œ๋”๋ง ์›๋ฆฌ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • state์˜ ๋ถˆ๋ณ€์„ฑ์„ ์ง€์ผœ์•ผํ•œ๋‹ค. ์ฆ‰, ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๊ธฐ์กด์˜ ์ƒํƒœ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•œ๋‹ค.

useState React ๊ณต์‹ ๋ฌธ์„œ
useState ์ฐธ๊ณ  ์‚ฌ์ดํŠธ 1
useState ์ฐธ๊ณ  ์‚ฌ์ดํŠธ 2
React Hook ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

profile
๋ฏธ์ˆ  ์ „๊ณต์—์„œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ๊นŒ์ง€

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