Synchronizing with Effects

date
2026-01-21
order
3
link
  • Synchronizing with Effects โ€“ React

You will learn

  • effect๋ž€ ๋ฌด์—‡์ธ์ง€
  • effect์™€ ์ด๋ฒคํŠธ์˜ ์ฐจ์ด
  • ์ปดํฌ๋„ŒํŠธ์—์„œ effect๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋ถˆํ•„์š”ํ•œ effect ์žฌ์‹คํ–‰์„ ๊ฑด๋„ˆ๋›ฐ๋Š” ๋ฐฉ๋ฒ•
  • ์™œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ effect๊ฐ€ ๋‘ ๋ฒˆ ์‹คํ–‰๋˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€

์ดํŽ™ํŠธ๋ž€?

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—๋Š” ๋‘ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค.

  • ๋ Œ๋”๋ง ์ฝ”๋“œ : ์ˆœ์ˆ˜ ํ•จ์ˆ˜
  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ : side effect ์œ ๋ฐœ

๊ทธ๋Ÿฐ๋ฐ ์ด ๋‘๊ฐ€์ง€๋กœ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ฑ„ํŒ…๋ฐฉ ์ž…์žฅ๊ณผ ๊ฐ™์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋„ ์žˆ๋‹ค. ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง ์ฝ”๋“œ์— ํฌํ•จ๋  ์ˆ˜ ์—†๊ณ , ๋”ฑํžˆ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋Š”๊ฒƒ๋„ ์–ด์ƒ‰ํ•˜๋‹ค.

์ด๋Ÿด๋•Œ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ Effect๋‹ค. ๋ Œ๋”๋ง๋„ ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๋ผ๋ฉด ๋ Œ๋”๋ง์ด๋ผ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ.

์ดํŽ™ํŠธ์˜ ์ฃผ ์‚ฌ์šฉ ๋ชฉ์ ์€ ๋ฆฌ์•กํŠธ ๋ฐ–์˜ ์™ธ๋ถ€ ์‹œ์Šคํ…œ(๋ธŒ๋ผ์šฐ์ € DOM api, ๋„คํŠธ์›Œํฌ, ํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋“ฑ)๊ณผ์˜ ์†Œํ†ต์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฌํ•œ ๋ชฉ์ ์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๊ฒƒ์ด ์ข‹๋‹ค.

์ดํŽ™ํŠธ ์ž‘์„ฑํ•˜๊ธฐ

1. ์ดํŽ™ํŠธ ์ •์˜

  • ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์— ์ž‘์„ฑํ•œ๋‹ค.
  • ์ดํŽ™ํŠธ๋Š” ํ™”๋ฉด์ด ์—…๋ฐ์ดํŠธ ๋œ ํ›„์— ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ๋”œ๋ ˆ์ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • useEffect ํ›… ์•ˆ์— ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋จผ์ € ๋ Œ๋”๋ง ์ฝ”๋“œ์˜ ์ˆœ์ˆ˜์„ฑ์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•จ์ด๊ธฐ๋„ ํ•˜์ง€๋งŒ, ๋ Œ๋”๋ง ์ด์ „์—๋Š” ์ดํŽ™ํŠธ์—์„œ ์‚ฌ์šฉํ•  DOM ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

๊ธฐ๋ณธ์ ์œผ๋กœ ์ดํŽ™ํŠธ๋Š” ๋ชจ๋“  ๋ Œ๋”๋ง๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š”๋ฐ, ๋งŽ์€ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•˜๊ฑฐ๋‚˜(ํ‚ค๋ณด๋“œ ์ž…๋ ฅ๋งˆ๋‹ค ์ฑ„ํŒ… ์„œ๋ฒ„์— ์—ฐ๊ฒฐ), UI๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฐ๋‹ค(ํ‚ค๋ณด๋“œ ์ž…๋ ฅ๋งˆ๋‹ค fade-in ์• ๋‹ˆ๋ฉ”์ด์…˜). ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์ดํŽ™ํŠธ ์‹คํ–‰์„ ์œ ๋ฐœํ•˜๋Š” ๋ณ€์ˆ˜๋“ค์„ ๋„ฃ์–ด ์ดํŽ™ํŠธ ์‹คํ–‰์„ ํŠน์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ํด๋ฆฐ์—… ํ•จ์ˆ˜

์ดํŽ™ํŠธ๋Š” ๋ฆฌ์•กํŠธ ์™ธ๋ถ€์™€ ์†Œํ†ตํ•˜๋Š” ์ฐฝ๊ตฌ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ˜๋“œ์‹œ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์™€ ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๊ฐ™์ง€ ์•Š๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก, ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ, ์›น์†Œ์ผ“ ์—ฐ๊ฒฐ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋“ค์€ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์ ธ๋„(์–ธ๋งˆ์šดํŠธ) ๊ณ„์† ๋‚จ์•„์žˆ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ํ•ด์ง€ํ•ด์ฃผ๋Š” ํด๋ฆฐ์—… ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

ref ๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค

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

๋ฐ์ดํ„ฐ ํŒจ์นญ์‹œ ๊ณ ๋ คํ•  ์ 

๋ฌธ์„œ์—์„œ๋„ ์ดํŽ™ํŠธ ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ถ”์ฒœํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋งŽ์ด ์‚ฌ์šฉํ•ด์˜จ ํŒจํ„ด์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋šœ๋ ทํ•œ ๋‹จ์ ์ด ์žˆ์–ด์„œ TanStack Query, useSWR๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฆฌ์•กํŠธ ํ’€์Šคํƒ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

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

์˜ˆ์‹œ ๋ฌธ์ œ

1,2 ๋ฒˆ ๋ฌธ์ œ๋Š” ์‰ฌ์›Œ์„œ ์ƒ๋žต.

3. Strict Mode


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

  useEffect(() => {
    function onTick() {
      setCount(c => c + 1);
    }

    setInterval(onTick, 1000);
  }, []);

  return <h1>{count}</h1>;
}

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Strict Mode๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ดํŽ™ํŠธ๋ฅผ ๋‘ ๋ฒˆ ์‹คํ–‰ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ setCount(c=>c+1)์ด ๋‘ ๋ฒˆ์”ฉ ์‹คํ–‰๋˜๋ฉด์„œ ์นด์šดํ„ฐ๊ฐ€ ์ดˆ๋‹น 2 ์”ฉ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๋Š”๊ฒƒ.

4. Race Condition ๋ฌธ์ œ

export default function Page() {
  const [person, setPerson] = useState('Alice');
  const [bio, setBio] = useState(null);

  useEffect(() => {
    setBio(null);
    fetchBio(person).then(result => {
      setBio(result);
    });
  }, [person]);

  return (

์ด๋ ‡๊ฒŒ ์ดํŽ™ํŠธ์—์„œ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ํŒจ์นญ์„ ํ•˜๋ฉด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ ˆ์ด์Šค ์ปจ๋””์…˜ ๋ฌธ์ œ๋‹ค. person1 ์„ ์„ ํƒํ–ˆ๋‹ค๊ฐ€ person2๋กœ ๊ณง๋ฐ”๋กœ ๋ฐ”๊ฟจ๋Š”๋ฐ, person1์— ๋Œ€ํ•œ ์š”์ฒญ์˜ ์‘๋‹ต์ด ๋” ๋Šฆ๊ฒŒ ๋„์ฐฉํ•˜๋ฉด person = person2 ์ธ ์ƒํƒœ์ด์ง€๋งŒ bio = person1Bio๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ.

useEffect(() => {
    let ignore = false;
    setBio(null);
    fetchBio(person).then(result => {
      if (!ignore) {
        setBio(result);
      }
    });
    return () => {
      ignore = true;
    }
  }, [person]);

๊ทธ๋ž˜์„œ ๋น„๋™๊ธฐ ๋ฐฉ์‹์˜ ๋ฐ์ดํ„ฐ ํŒจ์นญ์—์„  ignore ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.