[๋ฐ๋ธŒ์ฝ”์Šค] React ๊ธฐ์ดˆ ํ•ต์‹ฌ ์ •๋ฆฌ(state, ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น, ์ปดํฌ๋„ŒํŠธ ๋ฐ˜๋ณต)

2025. 6. 15. 23:28ยท๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค/TIL
๋ชฉ์ฐจ
  1. ๐ŸฆState
  2. React์—์„œ ์ƒํƒœ์˜ ๊ฐœ๋…
  3. useState
  4. ๐Ÿ› ๏ธ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น: React์™€ ์ฐฐ๋–ก ๊ถํ•ฉ ๋ฌธ๋ฒ•
  5. ๐Ÿ—บ๏ธ.map()
  6. โฐ์‹œ๊ณ„ ๊ตฌํ˜„ํ•˜๊ธฐ

React๋Š” ์ƒํƒœ ๊ธฐ๋ฐ˜ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์„ ๋งŒํผ state(์ƒํƒœ)๊ฐ€ ์ค‘์‹ฌ์ด ๋˜๋Š” ๊ตฌ์กฐ๋‹ค. ์˜ค๋Š˜์€ React ์•ฑ์„ ๊ตฌ์„ฑํ•  ๋•Œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด์ž ๋ณธ์งˆ์ ์ธ ๋‹ค์Œ ๋„ค ๊ฐ€์ง€ ์ฃผ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฆฌ์•กํŠธ ๊ธฐ์ดˆ ํ•ต์‹ฌ๊ณผ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„์„ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

  • useState๋กœ ์ƒํƒœ ๋งŒ๋“ค๊ธฐ
  • ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์œผ๋กœ props์™€ state ๊น”๋”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ
  • ๋ฐฐ์—ด ๋ฐ์ดํ„ฐ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ(map)
  • setInterval์„ ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์‹œ๊ณ„ ๊ตฌํ˜„

๐ŸฆState

React์—์„œ ์ƒํƒœ์˜ ๊ฐœ๋…

React์˜ ๊ธฐ๋ณธ ์ฒ ํ•™์€ UI๋Š” ์ƒํƒœ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ƒํƒœ(state)๋ž€ ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋งํ•œ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ, ๋„คํŠธ์›Œํฌ ์‘๋‹ต, ์‹œ๊ฐ„ ํ๋ฆ„ ๋“ฑ์— ๋”ฐ๋ผ ๋ณ€ํ™” ๊ฐ€๋Šฅ
  • ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ™”๋ฉด(UI)๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ด์•ผ ํ•˜๋Š” ๊ฐ’

์ฆ‰, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋Š” ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค:

  • ๋ฒ„ํŠผ ํด๋ฆญ ํšŸ์ˆ˜
  • ์ž…๋ ฅ ํผ์˜ ๊ฐ’
  • API ์š”์ฒญ ๊ฒฐ๊ณผ
  • ์‹œ๊ฐ„

 

useState

React์—์„œ๋Š” useState๋ผ๋Š” ํ›…์„ ์ œ๊ณตํ•ด ์ƒํƒœ๊ฐ’์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์•„๋ž˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์นด์šดํ„ฐ ์˜ˆ์ œ๋‹ค.

import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0); // ์ƒํƒœ ์ดˆ๊ธฐ๊ฐ’: 0

  return (
    <div>
      <p>ํ˜„์žฌ ์นด์šดํŠธ: {count}</p>
      <button onClick={() => setCount(count + 1)}>+1</button>
      <button onClick={() => setCount(count - 1)}>-1</button>
    </div>
  );
}
  • const [count, setCount] = useState(0) -> count๋Š” ํ˜„์žฌ ์ƒํƒœ๊ฐ’, setCount๋Š” ์ด ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜๋‹ค.
  • setCount()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, React๋Š” count ๊ฐ’์„ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๊ต์ฒดํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ , ์ตœ์‹  UI๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค.

React์—์„œ ์ƒํƒœ๋ฅผ ์ง์ ‘ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  setCount() ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ์ด์œ ๋Š”, React๊ฐ€ ์ด ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  UI๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. ์ฆ‰, ์ƒํƒœ ๊ด€๋ฆฌ ์—†์ด ์ง์ ‘ DOM์„ ์กฐ์ ˆํ•˜๋ฉด ์•„๋ž˜ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

  • UI์™€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถˆ์ผ์น˜
  • ๋ณต์žกํ•œ ์กฐ๊ฑด๋ฌธ๊ณผ ํƒ€์ด๋จธ ๊ด€๋ฆฌ ํ•„์š”
  • ํ˜‘์—…, ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›€

useState๋Š” ์ด ๊ณผ์ •์„ ์™„์ „ํžˆ ์ž๋™ํ™”ํ•ด์ค€๋‹ค.


๐Ÿ› ๏ธ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น: React์™€ ์ฐฐ๋–ก ๊ถํ•ฉ ๋ฌธ๋ฒ•

destructuring assignment, ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์—์„œ ํ•„์š”ํ•œ ๊ฐ’์„ ์ถ”์ถœํ•ด ๋ณ€์ˆ˜์— ๋ฐ”๋กœ ๋‹ด๋Š” ๋ฌธ๋ฒ•

React์—์„œ๋Š” ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์„ ๋งŽ์ด ์“ด๋‹ค! ์™œ? 

  • useState๊ฐ€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, [state, setState]๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • props๋‚˜ ๊ฐ์ฒด์—์„œ ์›ํ•˜๋Š” ์†์„ฑ๋งŒ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๋‹ค.

props ๊ตฌ์กฐ ๋ถ„ํ•ด

function Greeting({ name, age }) {
  return <p>{name}๋‹˜์€ {age}์‚ด์ž…๋‹ˆ๋‹ค.</p>;
}

// ์‚ฌ์šฉ
<Greeting name="์ฑ„ํŠธ" age={3} />

 

์ƒํƒœ ๊ตฌ์กฐ ๋ถ„ํ•ด

const [user, setUser] = useState({ name: '์ฑ„ํŠธ', age: 3 });

const { name, age } = user; // ๊ตฌ์กฐ ๋ถ„ํ•ด

๊ตฌ์กฐ ๋ถ„ํ•ด ๋•๋ถ„์— user.name, user.age์ฒ˜๋Ÿผ ๊ธธ๊ฒŒ ์“ธ ํ•„์š” ์—†์ด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค


๐Ÿ—บ๏ธ.map()

React์—์„œ๋Š” ๋ฐฐ์—ด์„ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋ ค๋ฉด .map()์„ ์‚ฌ์šฉํ•ด JSX๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

const fruits = ['๐ŸŽ ์‚ฌ๊ณผ', '๐ŸŒ ๋ฐ”๋‚˜๋‚˜', '๐Ÿ‡ ํฌ๋„'];

function FruitList() {
  return (
    <ul>
      {fruits.map((fruit, idx) => (
        <li key={idx}>{fruit}</li>
      ))}
    </ul>
  );
}
  • fuits.map(...) -> ๊ฐ ํ•ญ๋ชฉ๋งˆ๋‹ค JSX <li>๋ฅผ ๋งŒ๋“ค์–ด ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜
  • key = {idx} : React๊ฐ€ ๊ฐ ํ•ญ๋ชฉ์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์œ  key ํ•„์š” 

React๋Š” ๋ฐฐ์—ด์„ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์—†๋‹ค. JSX๋Š” ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ์—ด ๋‚ด ๊ฐ ์š”์†Œ๋ฅผ JSX๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด map()์ด๋‹ค.


โฐ์‹œ๊ณ„ ๊ตฌํ˜„ํ•˜๊ธฐ

React์—์„œ๋Š” ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์ผ์ • ์ฃผ๊ธฐ๋กœ ์ƒํƒœ๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด useEffect์™€ setInterval์„ ์กฐํ•ฉํ•œ๋‹ค.

import { useEffect, useState } from 'react';

function Clock() {
  const [time, setTime] = useState(new Date());

  useEffect(() => {
    const timer = setInterval(() => {
      setTime(new Date());
    }, 1000);

    return () => clearInterval(timer); // ์–ธ๋งˆ์šดํŠธ ์‹œ ํƒ€์ด๋จธ ์ •๋ฆฌ
  }, []);

  return <h2>ํ˜„์žฌ ์‹œ๊ฐ: {time.toLocaleTimeString()}</h2>;
}
  • useState(new Date()) -> ํ˜„์žฌ ์‹œ๊ฐ์„ ์ƒํƒœ๋กœ ์ €์žฅ
  • useEffect(() => {...}, []) -> ๋งˆ์šดํŠธ ์‹œ ๋”ฑ ํ•œ๋ฒˆ ์‹คํ–‰
  • setInterval(...) -> 1์ดˆ๋งˆ๋‹ค setTime()์„ ํ˜ธ์ถœํ•ด ์ƒํƒœ ์—…๋ฐ์ดํŠธ
  • clearInterval() -> ์ปดํฌ๋„ŒํŠธ ์ œ๊ฑฐ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ์ •๋ฆฌ(cleanup)

React๋ฅผ ๋ณธ์งˆ์ ์œผ๋กœ ์ดํ•ดํ•˜๋ ค๋ฉด ์ƒํƒœ๊ฐ€ ๋ณ€ํ•  ๋•Œ UI๊ฐ€ ๋ณ€ํ•œ๋‹ค๋Š” ๊ด€์ ์„ ๋†“์น˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์˜ค๋Š˜์€ ๋‹ค์Œ ํ๋ฆ„์œผ๋กœ ์ด ์›๋ฆฌ๋ฅผ ๊ณต๋ถ€ํ•ด ๋ณด์•˜๋‹ค.

  • useState๋Š” UI๋ฅผ ์ƒํƒœ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ•ต์‹ฌ ๋„๊ตฌ
  • ๊ตฌ์กฐ ๋ถ„ํ•ด๋Š” ์ƒํƒœ์™€ props๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ฌธ๋ฒ•์  ๋„๊ตฌ
  • .map()์„ ์ด์šฉํ•œ ๋ฐ˜๋ณต ๋ Œ๋”๋ง์€ ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜ UI์˜ ๊ธฐ๋ณธ
  • useEffect์™€ ํƒ€ใ…‡๋จธ๋Š” ์‹œ๊ฐ„ ํ๋ฆ„ ๊ฐ™์€ ์™ธ๋ถ€ ์ด๋ฒคํŠธ๋ฅผ React ์ปดํฌ๋„ŒํŠธ์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

์ด ๋„ค๊ฐ€์ง€ ๊ฐœ๋…์€ React๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์˜ ์ถœ๋ฐœ์ ์ด์ž ์‹œ์ž‘์ ์ด๋‹ค. ๋‹ค์Œ์—๋Š” useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด๊ณผ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง, ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ์ „๋žต๋“ค์„ ๋” ๊ณต๋ถ€ํ•ด๋ด์•ผ ํ•  ๋“ฏ.

'๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค > TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฐ๋ธŒ์ฝ”์Šค] react task app 2  (0) 2025.06.21
[๋ฐ๋ธŒ์ฝ”์Šค] Redux  (2) 2025.06.16
[๋ฐ๋ธŒ์ฝ”์Šค] React์™€ JSX, UI ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์ „ํ™˜  (1) 2025.06.14
[๋ฐ๋ธŒ์ฝ”์Šค] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ: ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๋ถ€ํ„ฐ ํด๋ž˜์Šค๊นŒ์ง€  (0) 2025.06.11
[๋ฐ๋ธŒ์ฝ”์Šค] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ธฐ์ดˆ(ํƒ€์ž…, ์ธํ„ฐํŽ˜์ด์Šค, ์—ด๊ฑฐํ˜•)  (2) 2025.06.10
'๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค/TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ฐ๋ธŒ์ฝ”์Šค] react task app 2
  • [๋ฐ๋ธŒ์ฝ”์Šค] Redux
  • [๋ฐ๋ธŒ์ฝ”์Šค] React์™€ JSX, UI ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ์ „ํ™˜
  • [๋ฐ๋ธŒ์ฝ”์Šค] ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ: ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๋ถ€ํ„ฐ ํด๋ž˜์Šค๊นŒ์ง€
ํ‚ํ‚์ž‰
ํ‚ํ‚์ž‰
๋ฟŒ๋ก ํŠธ ๊ฐœ๋ฐœ์ž(์ง€๋ง์ƒ)์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ
  • ํ‚ํ‚์ž‰
    monicx.dev
    ํ‚ํ‚์ž‰
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (161)
      • ๐Ÿ–ฅ๏ธdevelop (2)
        • Github (2)
        • Frontend (4)
        • Backend (5)
        • Mobile (0)
        • CS (0)
        • Three.js (0)
        • Docker (2)
      • ๐Ÿ“šbook (9)
        • npm Deep Dive (4)
      • ๐Ÿ“•review (5)
        • ์ฑ… (13)
        • ํ–‰์‚ฌ (1)
        • ํšŒ๊ณ  (2)
      • โญproject (5)
        • petiary (2)
        • ๆšŽ่ฉ  (0)
        • ์ธํ„ด (2)
      • ๐Ÿ˜ถโ€๐ŸŒซ๏ธalgorithm (0)
      • ๐Ÿ’กtips (1)
      • ๐Ÿ˜Ždaily (10)
      • ๐Ÿ•น๏ธgame (0)
      • ๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค (87)
        • TIL (61)
        • ํ”„๋กœ์ ํŠธ (18)
        • ํšŒ๊ณ  (8)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

    • ๋ฒจ๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
ํ‚ํ‚์ž‰
[๋ฐ๋ธŒ์ฝ”์Šค] React ๊ธฐ์ดˆ ํ•ต์‹ฌ ์ •๋ฆฌ(state, ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น, ์ปดํฌ๋„ŒํŠธ ๋ฐ˜๋ณต)

๊ฐœ์ธ์ •๋ณด

  • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
  • ํฌ๋Ÿผ
  • ๋กœ๊ทธ์ธ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

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