ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

web/react hook

useEffect

dev_been94 2024. 12. 14. 12:01
728x90
๋ฐ˜์‘ํ˜•

useEffect

 

๐ŸŽฏ useEffect๋ž€ ๋ฌด์—‡์ผ๊นŒ?

useEffect๋Š” **"๋ถ€์ˆ˜ ํšจ๊ณผ(Effect)"**๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์˜ˆ์š”.
๋ถ€์ˆ˜ ํšจ๊ณผ๋ž€?
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ํ•จ๊ป˜ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ถ”๊ฐ€ ์ž‘์—…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Ÿฐ ์ž‘์—…๋“ค์ด ์žˆ์–ด์š”:

  1. ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ (API ํ˜ธ์ถœ)
  2. ๋ธŒ๋ผ์šฐ์ €์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ (์˜ˆ: ํƒ€์ดํ‹€ ๋ณ€๊ฒฝ)
  3. ํƒ€์ด๋จธ๋‚˜ ๊ตฌ๋… ์„ค์ •ํ•˜๊ธฐ

์ด๋Ÿฐ ์ž‘์—…๋“ค์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๊ฒŒ ํ•ด์•ผ๊ฒ ์ฃ ?
๋ฐ”๋กœ ๊ทธ๋•Œ useEffect๊ฐ€ ํ•„์š”ํ•ด์š”!

 

๐Ÿ  ์ง‘์•ˆ์ผ ์ด์•ผ๊ธฐ๋กœ ์ดํ•ดํ•˜๊ธฐ

์ง‘์— ์†๋‹˜์ด ์˜ค๋ฉด ์ง‘์„ ์ฒญ์†Œํ•ด์•ผ ํ•˜์ž–์•„์š”? ๐Ÿงน

  • ์ง‘(์ปดํฌ๋„ŒํŠธ)์ด ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๊ฑฐ๋‚˜ ๋ฐ”๋€” ๋•Œ
  • **"์ฒญ์†Œํ•˜๊ธฐ(๋ถ€์ˆ˜ ํšจ๊ณผ)"**๋ผ๋Š” ์ผ์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜์ฃ .

useEffect๋Š” ์ด๋Ÿฐ "์ง‘์•ˆ์ผ" ๊ฐ™์€ ์ถ”๊ฐ€ ์ž‘์—…์„ ๋งก์•„์ฃผ๋Š” ์นœ๊ตฌ์˜ˆ์š”.

 

๐Ÿ› ๏ธ useEffect ๊ธฐ๋ณธ ์˜ˆ์‹œ

์ž, ์ด์ œ ์‹ค์ œ ์ฝ”๋“œ๋กœ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”!
ํ™”๋ฉด์— ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ "Hello World"๋ผ๋Š” ๋ฌธ๊ตฌ๋ฅผ ๋ธŒ๋ผ์šฐ์ € ํƒ€์ดํ‹€์— ํ‘œ์‹œํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import React, { useEffect } from "react";

function Welcome() {
  useEffect(() => {
    // ์ด ์•ˆ์— ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ ์–ด์š”
    document.title = "Hello World!"; // ๋ธŒ๋ผ์šฐ์ € ํƒญ ์ œ๋ชฉ์„ ๋ณ€๊ฒฝํ•ด์š”
  });

  return <h1>์•ˆ๋…•ํ•˜์„ธ์š”! ๐Ÿ‘‹</h1>;
}

export default Welcome;

 

๐Ÿ” ์ฝ”๋“œ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ๊นŒ?

  1. useEffect(() => { ... })
    • useEffect๋Š” ํ•จ์ˆ˜ ์•ˆ์— ๋ถ€์ˆ˜ ํšจ๊ณผ(์ด ๊ฒฝ์šฐ ํƒ€์ดํ‹€ ๋ณ€๊ฒฝ)๋ฅผ ์‹คํ–‰ํ•ด์š”.
    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  2. document.title = "Hello World!"
    • ๋ธŒ๋ผ์šฐ์ €์˜ ํƒญ ์ œ๋ชฉ์„ ๋ฐ”๊ฟ”์ฃผ๋Š” ์ฝ”๋“œ์˜ˆ์š”.
  3. ๊ฒฐ๊ณผ
    • ํ™”๋ฉด์— <h1>์ด ํ‘œ์‹œ๋˜๊ณ ,
    • ๋ธŒ๋ผ์šฐ์ € ํƒญ ์ œ๋ชฉ์ด "Hello World!"๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.

 

โฐ useEffect์—์„œ ์‹คํ–‰ ์‹œ์  ์ œ์–ดํ•˜๊ธฐ

"๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์–ธ์ œ ์‹คํ–‰ํ• ์ง€"๋„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์š”.
useEffect์—๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์ด๋ผ๋Š” ๊ฒŒ ์žˆ๊ฑฐ๋“ ์š”.

 

1. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ๋งŒ ์‹คํ–‰

useEffect(() => {
  console.log("์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ฌ์–ด์š”!");
}, []); // ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋นˆ ๋ฐฐ์—ด์ด๋ฉด, ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ผ์š”

 

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ์ฒ˜์Œ ๋‚˜ํƒ€๋‚  ๋•Œ๋งŒ ์‹คํ–‰๋ผ์š”.
  • ์ด๋•Œ [] ์•ˆ์— ์•„๋ฌด๊ฒƒ๋„ ์—†์œผ๋ฉด ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

2. ํŠน์ • ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ ์‹คํ–‰

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

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

  useEffect(() => {
    console.log(`ํ˜„์žฌ ์นด์šดํŠธ: ${count}`);
  }, [count]); // count ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋ผ์š”

  return (
    <div>
      <p>์นด์šดํŠธ: {count}</p>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
}

export default Counter;

 

 

์„ค๋ช…:

  • count ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค useEffect ์•ˆ์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ผ์š”.
  • ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์„œ count๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด ์ฝ˜์†”์— "ํ˜„์žฌ ์นด์šดํŠธ"๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

 

3. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ์ •๋ฆฌ ์ž‘์—…ํ•˜๊ธฐ

์˜ˆ๋ฅผ ๋“ค์–ด, ํƒ€์ด๋จธ๋‚˜ ๊ตฌ๋… ์„ค์ •์„ ํ•ด๋†“์•˜๋‹ค๋ฉด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ **์ •๋ฆฌ(clean-up)**๋ฅผ ํ•ด์ค˜์•ผ ํ•ด์š”.

import React, { useEffect } from "react";

function Timer() {
  useEffect(() => {
    const timer = setInterval(() => {
      console.log("ํƒ€์ด๋จธ ์‹คํ–‰ ์ค‘...");
    }, 1000);

    // ์ •๋ฆฌ(clean-up) ํ•จ์ˆ˜
    return () => {
      clearInterval(timer); // ํƒ€์ด๋จธ๋ฅผ ์ •๋ฆฌํ•ด์š”
      console.log("ํƒ€์ด๋จธ๊ฐ€ ์ •๋ฆฌ๋˜์—ˆ์–ด์š”!");
    };
  }, []);

  return <p>โฐ ํƒ€์ด๋จธ ์‹คํ–‰ ์ค‘...</p>;
}

export default Timer;

 

์„ค๋ช…:

  • setInterval๋กœ ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜์ง€๋งŒ,
  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ clearInterval์„ ์‚ฌ์šฉํ•ด์„œ ํƒ€์ด๋จธ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿš€ ์ •๋ฆฌํ•˜์ž๋ฉด!

  1. useEffect๋Š” ๋ถ€์ˆ˜ ํšจ๊ณผ(์ถ”๊ฐ€ ์ž‘์—…)๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋„๊ตฌ์˜ˆ์š”.
  2. ์‹คํ–‰ ์‹œ์ ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์š”:
    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋‚˜ํƒ€๋‚  ๋•Œ๋งŒ ์‹คํ–‰: useEffect(..., [])
    • ํŠน์ • ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ ์‹คํ–‰: useEffect(..., [๊ฐ’])
    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ์ •๋ฆฌ ์ž‘์—…: return ์•ˆ์— ์ •๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์š”.
728x90
๋ฐ˜์‘ํ˜•

'web > react hook' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

useImperativeHandle  (0) 2024.12.14
useId  (0) 2024.12.14
useDeferredValue  (0) 2024.12.14
useDebugValue  (0) 2024.12.14
useContext  (0) 2024.12.14
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/01   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•
250x250