๋ฆฌ์•กํŠธ State Hook๊ณผ ์ƒํƒœ, ์ƒ๋ช…์ฃผ๊ธฐ

2025. 9. 10. 23:06ยทํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/React & NextJS

 

 

๋“ค์–ด๊ฐ€๋ฉฐ

์•ž์„œ ์†Œ๊ฐœํ–ˆ๋‹ค์‹œํ”ผ React๋Š” ์„ ์–ธํ˜•(Declarative UI) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ด๋Š” UI๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝํ• ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์–ด๋–ค ๋ชจ์Šต์ผ์ง€๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋ชจ์Šต์ผ์ง€์— ๋Œ€ํ•œ state๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด React๊ฐ€ ์•Œ์•„์„œ ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•ด์ค๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š”  UI Component์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š”๋ฐ ์˜จ ์‹ ๊ฒฝ์„ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  React์˜ Hook์€ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ(state)์™€ ๋ผ์ดํ”„์‚ฌ์ดํด(lifecycle)์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. 

 

1. useState – ์ƒํƒœ(State) ๊ด€๋ฆฌ

import { useState } from "react";

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

  return (
    <div>
      <p>ํ˜„์žฌ ๊ฐ’: {count}</p>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
}

๋™์ž‘ ์›๋ฆฌ

  1. useState(0) → count = 0์œผ๋กœ ์ดˆ๊ธฐํ™”.
  2. setCount ํ˜ธ์ถœ ์‹œ React๊ฐ€ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ + ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง.
  3. ์ƒˆ๋กœ ๋ Œ๋”๋ง๋  ๋•Œ count๋Š” ์ตœ์‹  ๊ฐ’์œผ๋กœ ๋ฐ˜์˜๋จ.

ํŠน์ง•

  • ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋ฉด ํ™”๋ฉด์ด ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๊ทธ๋ ค์ง.
  • ํ•œ ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ.
const [name, setName] = useState("Jisang");
const [age, setAge] = useState(30);


 

2. useEffect – ๋ถ€์ˆ˜ํšจ๊ณผ(Side Effect) ์ฒ˜๋ฆฌ

๊ธฐ๋ณธ ์„ค๋ช…

React ์ปดํฌ๋„ŒํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ Œ๋”๋ง → ํ™”๋ฉด ํ‘œ์‹œ๊นŒ์ง€๋งŒ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์™ธ์—:

  • ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ (API ์š”์ฒญ)
  • DOM ์ง์ ‘ ์กฐ์ž‘
  • ํƒ€์ด๋จธ ์„ค์ •

๋“ฑ์€ **๋ถ€์ˆ˜ํšจ๊ณผ(= side effect)**๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Hook์ด useEffect์ž…๋‹ˆ๋‹ค.

import { useState, useEffect } from "react";

function Timer() {
  const [count, setCount] = useState(0);

  // count๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋จ
  useEffect(() => {
    console.log("count๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:", count);
  }, [count]);

  return (
    <div>
      <p>{count}์ดˆ</p>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
}

useEffect ๊ตฌ์กฐ

useEffect(() => {
  // ์‹คํ–‰ํ•  ์ฝ”๋“œ
  return () => {
    // cleanup (์ •๋ฆฌ ์ž‘์—…)
  };
}, [์˜์กด์„ฑ๋ฐฐ์—ด]);
  • [] (๋นˆ ๋ฐฐ์—ด): ๋งˆ์šดํŠธ๋  ๋•Œ 1๋ฒˆ๋งŒ ์‹คํ–‰ (ex: API ํ˜ธ์ถœ)
  • [count]: count๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์‹คํ–‰
  • ์ƒ๋žต ์‹œ: ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์‹คํ–‰(โš ๏ธ๋นˆ ๋ฐฐ์—ด๊ณผ ์ƒ๋žต์€ ๋‹ค๋ฆ„ ์ฃผ์˜!)

์˜ˆ: ๋งˆ์šดํŠธ ์‹œ API ํ˜ธ์ถœ

useEffect(() => {
  fetch("/api/data")
    .then(res => res.json())
    .then(data => console.log(data));
}, []);   // ์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰

์˜ˆ: ํƒ€์ด๋จธ ์„ค์ • & ์ •๋ฆฌ

useEffect(() => {
  const timer = setInterval(() => {
    console.log("1์ดˆ๋งˆ๋‹ค ์‹คํ–‰");
  }, 1000);

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

์˜์กด์„ฑ ๋ฐฐ์—ด

Effect ์•ˆ์—์„œ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ์™ธ๋ถ€ ๊ฐ’(๋ณ€์ˆ˜, ํ•จ์ˆ˜)์€ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค

์—ฌ๊ธฐ์„œ ์™ธ๋ถ€ ๊ฐ’์ด๋ž€:

  • props
  • state
  • ์ปดํฌ๋„ŒํŠธ ๋ฐ”๊นฅ์—์„œ ์„ ์–ธ/์ •์˜๋œ ๋ณ€์ˆ˜, ํ•จ์ˆ˜(useCallback์œผ๋กœ ๊ฐ์‹ธ์ง€ ์•Š์•˜๋‹ค๋ฉด ๋งค ๋ Œ๋”๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ๋จ)

๋ฆฌ์—‘ํŠธ๋Š” ์ด๋ฒคํŠธ๋กœ ์ธํ•ด re-rendering์„ ๋งŽ์ด ํ•ฉ๋‹ˆ๋‹ค. re-rendering์‹œ ํŠน์ • ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์‹คํ–‰๋˜๋Š” Hook์ด useEffect์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ํ•„์ˆ˜๋กœ ๋“ค์–ด๊ฐ€์•ผ ํ•˜์ง€๋งŒ ์•ˆ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค.

  • ์˜์กด์„ฑ ๋ฐฐ์—ด์— ํ•„์š”ํ•œ ๋ณ€์ˆ˜๊ฐ€ ์•ˆ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ
    • re-rendering ์‹œ ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์—๋„ useEffect ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•„์„œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜์ง€ ์•Š์Œ
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์— ํ•„์š”ํ•œ ํ•จ์ˆ˜๊ฐ€ ์•ˆ๋“ค์–ด๊ฐ„ ๊ฒฝ์šฐ
    • ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋œ ํ•จ์ˆ˜๋ฅผ useEffect์—์„œ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋„ฃ์ง€ ์•Š์œผ๋ฉด, re-rendering ํ•  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง → ํ•„์ˆ˜
    • ์ปดํฌ๋„ŒํŠธ ๋ฐ”๊นฅ์— ์„ ์–ธ๋œ ์œ ํ‹ธ ํ•จ์ˆ˜๋ผ๋ฉด ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋„ฃ์„ ํ•„์š” ์—†์Œ

 

์ •๋ฆฌ๋œ ๊ทœ์น™

  1. Effect ์•ˆ์—์„œ ์“ฐ๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜/ํ•จ์ˆ˜๋ฅผ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋„ฃ๋Š”๋‹ค.
  2. ๋‹ค๋งŒ, ๋ถˆ๋ณ€(immutable) ๋ณด์žฅ๋˜๋Š” ๊ฒƒ์€ ์ƒ๋žต ๊ฐ€๋Šฅ.
    • ์˜ˆ: importํ•œ ์™ธ๋ถ€ ํ•จ์ˆ˜, ์ƒ์ˆ˜, ref (useRef๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜)
  3. ํ•จ์ˆ˜๊ฐ€ ๋งค๋ฒˆ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ตฌ์กฐ๋ผ๋ฉด → useCallback์œผ๋กœ ๊ฐ์‹ธ๊ณ  ๋„ฃ๋Š”๋‹ค.
  4. ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์— ์ •์˜๋œ ํ•จ์ˆ˜๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋„ฃ๋”๋ผ๋„ ํ•จ์ˆ˜ ์ฐธ์กฐ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ฌ์‹ค์ƒ []์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค(ํ•ญ์ƒ ๊ฐ™์€ ์ฐธ์กฐ๋ผ์„œ).
  5. useEffect์—์„œ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ๋  ๋•Œ ํ˜ธ์ถœ๋จ.
  6. ESLint์˜ react-hooks/exhaustive-deps ๊ทœ์น™์„ ๊ธฐ๋ณธ์œผ๋กœ ๋”ฐ๋ฅด๋Š” ๊ฒŒ ์•ˆ์ „.

 

3. useCallback

๊ฐœ๋…

  • ํŠน์ • ํ•จ์ˆ˜๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(caching)ํ•˜๋Š” Hook
  • ์˜์กด์„ฑ์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ•œ ๊ฐ™์€ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉ
  • ์ฆ‰, ๋ถˆํ•„์š”ํ•œ re-rendering ๋ฐฉ์ง€ ๋ชฉ์ ์—์„œ ์‚ฌ์šฉ๋จ
  • comst memoizedCallback = useCallback(์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด);
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋“ค์–ด๊ฐ€์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ณ€ํ–ˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ์ •์˜ํ•ด์„œ ๋ฆฌํ„ดํ•จ

์˜ˆ์‹œ

import React, { useState, useCallback } from "react";

function Child({ onClick }: { onClick: () => void }) {
  console.log("Child ๋ Œ๋”๋ง");
  return <button onClick={onClick}>Click</button>;
}

export default function Parent() {
  const [count, setCount] = useState(0);

  // โœ… count๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งŒ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋จ
  const handleClick = useCallback(() => {
    setCount((c) => c + 1);
  }, []);

  return (
    <div>
      <p>Count: {count}</p>
      <Child onClick={handleClick} />
    </div>
  );
}

๋งŒ์•ฝ useCallback์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด Parent๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค handleClick ํ•จ์ˆ˜๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. count๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ•œ handleClick์€ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— useCallback์œผ๋กœ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  count๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งŒ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

4. useMemo

๊ฐœ๋…

  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜๋œ value๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ›…
  • ์—ฐ์‚ฐ๋Ÿ‰์ด ๋†’์€ ์ž‘์—…์ด ๋งค๋ฒˆ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • const memoizedValue = useMemo(๊ฐ’ ์ƒ์„ฑ ํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด)
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ณ€ํ–ˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์ƒˆ๋กœ ๊ฐ’ ์ƒ์„ฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ฒฐ๊ด๊ฐ’ ๋ฐ˜ํ™˜

์˜ˆ์‹œ

const memoizedValue = useMemo(() => {
  return complexCalculation(a, b);
}, [a, b]);

 

useMemo vs useCallback

๊ตฌ๋ถ„ useMemo useCallback
๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๋Œ€์ƒ ๊ฐ’ (Value) ํ•จ์ˆ˜ (Function)
๋ฐ˜ํ™˜๊ฐ’ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๊ฐ’ ํ•จ์ˆ˜ ์ž์ฒด
์ฃผ์š” ๋ชฉ์  ๋ฌด๊ฑฐ์šด ๊ณ„์‚ฐ ๊ฒฐ๊ณผ ์บ์‹ฑ ํ•จ์ˆ˜ ์žฌ์ƒ์„ฑ ๋ฐฉ์ง€
์‚ฌ์šฉ ์˜ˆ์‹œ const list = useMemo(() => items.filter(...), [items]) const onClick = useCallback(() => setCount(c+1), [c])
  • ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜๊ณ  ์‹ถ๋‹ค ๐Ÿ‘‰ useMemo
  • ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์บ์‹ฑํ•˜๊ณ  ์‹ถ๋‹ค ๐Ÿ‘‰ useCallback

 

5. useRef

๊ฐœ๋…

  • mutableํ•œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” Hook
  • .current ํ”„๋กœํผํ‹ฐ๋กœ ์ ‘๊ทผ
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ re-rendering๋˜๋”๋ผ๋„ ๊ฐ™์€ ๋ ˆํผ๋Ÿฐ์Šค ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • const refContainer = useRef(์ดˆ๊ธฐ๊ฐ’);

์˜ˆ์‹œ

1. DOM ์š”์†Œ ์ง์ ‘ ์ ‘๊ทผ

function InputFocus() {
  const inputRef = useRef<HTMLInputElement>(null);

  const focusInput = () => {
    inputRef.current?.focus(); // DOM ์š”์†Œ ์ง์ ‘ ์ ‘๊ทผ
  };

  return (
    <>
      <input ref={inputRef} type="text" />
      <button onClick={focusInput}>Focus</button>
    </>
  );
}


2. ๋ Œ๋”๋ง๊ณผ ๋ฌด๊ด€ํ•œ ๊ฐ’ ์ €์žฅ

function Timer() {
  const intervalRef = useRef<number | null>(null);

  useEffect(() => {
    intervalRef.current = window.setInterval(() => {
      console.log("tick");
    }, 1000);

    return () => {
      if (intervalRef.current) clearInterval(intervalRef.current);
    };
  }, []);

  return <p>Timer Running...</p>;
}


3. ์ƒํƒœ ๋ณ€๊ฒฝ ์—†์ด ๊ฐ’ ๊ธฐ์–ตํ•˜๊ธฐ

function Example() {
  const renderCount = useRef(0);
  renderCount.current += 1;

  return <p>๋ Œ๋”๋ง ํšŸ์ˆ˜: {renderCount.current}</p>;
}

 


 

์ •๋ฆฌ

React ์ฝ”๋“œ์—์„œ Hook์„ ๋ณผ ๋•Œ useState๋ฅผ ๋งŒ๋‚˜๋ฉด ์–ด๋–ค ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  useEffect๋Š” ์–ด๋–ค ๋ถ€๊ฐ€ํšจ๊ณผ๋ฅผ ์‹คํ–‰ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋ฌด์—‡์ธ์ง€๋ฅผ ํ™•์ธํ•˜๋ฉด UI๋ฅผ ์ฒดํฌํ•  ๋•Œ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Hook์ž์ฒด๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ์™€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ํ‘œ์ค€ ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— React์—๋งŒ ๊ตญํ•œ๋˜๋Š” ๊ฐœ๋…์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ธฐ๋ฐ˜์˜ ๋™์ž‘๋ฐฉ์‹์—์„œ๋„ Hook์„ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ๋ณ€ํ™”๋ฅผ ์•Œ๋ฆฌ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ €๋„ ์•„์ง์€ State Hook์ด ์ต์ˆ™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋‹ค์–‘ํ•œ ์ฝ”๋“œ์™€ ์‹คํ–‰๋˜๋Š” UI๋ฅผ ๋ณด๋ฉด์„œ ์ต์ˆ™ํ•ด์ง€๋ ค๊ณ  ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์„œ๋ฒ„์™€ ๋‹ค๋ฅด๊ฒŒ UI๋Š” ๋ˆˆ์— ๋ฐ”๋กœ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ต์ˆ™ํ•ด์ง€๋Š”๋ฐ ์˜ค๋ž˜๊ฑธ๋ฆฌ์ง€๋Š” ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. React๋ฅผ ๋‹ค๋ฃจ๋‹ค๊ฐ€ ํ—ท๊ฐˆ๋ฆฌ๋ฉด ๋‹ค์‹œ ์™€์„œ ๋ณด๊ณ  ์ต์ˆ™ํ•ด์ง€๋Š” ํŒจํ„ด์„ ๋ฐ˜๋ณตํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(Just do it).

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด > React & NextJS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

React์™€ SPA ๊ทธ๋ฆฌ๊ณ  Component  (0) 2025.09.10
'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/React & NextJS' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • React์™€ SPA ๊ทธ๋ฆฌ๊ณ  Component
์„œ์•„๋ž‘๐Ÿ˜ƒ
์„œ์•„๋ž‘๐Ÿ˜ƒ
Just Do It๐Ÿ’ช
  • ์„œ์•„๋ž‘๐Ÿ˜ƒ
    G-Stack
    ์„œ์•„๋ž‘๐Ÿ˜ƒ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์ „์ฒด๋ณด๊ธฐ (144)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (78)
        • C++ ๊ธฐ์ดˆ (28)
        • C++ ์‘์šฉ (18)
        • Python (18)
        • JavaScript & NodeJS (0)
        • Go (12)
        • React & NextJS (2)
        • Java (0)
      • AI (2)
      • ์ปดํ“จํ„ฐ ๊ตฌ์กฐ & ์šด์˜์ฒด์ œ (31)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (12)
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (5)
      • ๋„คํŠธ์›Œํฌ (3)
      • ๋””์ž์ธํŒจํ„ด (5)
      • ์„œ๋น„์Šค & ํˆด (7)
      • ํŠธ๋ Œ๋“œ&์ด์Šˆ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

    • G์Šคํƒ์˜ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์Šคํƒ
    pointer
    ์กฐ๊ฑด๋ฌธ
    component
    init
    ๋ฐ˜๋ณต๋ฌธ
    c++
    ์ƒ์†
    ๋ฐฐ์—ด
    ์ปดํ“จํ„ฐ
    fork
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    c
    ํŒจํ‚ค์ง€
    Thread
    STD
    ํŒŒ์ด์ฌ
    ํŒŒ์ผ์ž…์ถœ๋ ฅ
    ํฌ์ธํ„ฐ
    ํ•จ์ˆ˜
    cpu
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ํ•˜๋“œ๋””์Šคํฌ
    ๋ฉ”๋ชจ๋ฆฌ
    go
    ์žฌ๊ท€
    ๋ณ€์ˆ˜
    ๋””์ž์ธํŒจํ„ด
    ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ
    RAM
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
์„œ์•„๋ž‘๐Ÿ˜ƒ
๋ฆฌ์•กํŠธ State Hook๊ณผ ์ƒํƒœ, ์ƒ๋ช…์ฃผ๊ธฐ
์ƒ๋‹จ์œผ๋กœ

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