react

[React] useEffect ์ •๋ฆฌ

yjenis 2024. 6. 12. 16:08

 

 

๐Ÿ”‘ [keyword]
  1. ์„ค์ • ํ•จ์ˆ˜
    1-1. ์ •๋ฆฌ ํ•จ์ˆ˜
  2. ์˜์กด์„ฑ ๋ฐฐ์—ด

 

๐Ÿ“บ ์ฐธ๊ณ  ๊ฐ•์˜

React Hooks์— ์ทจํ•œ๋‹ค - useEffect ๊น”๋”ํ•˜๊ฒŒ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ | ๋ฆฌ์•กํŠธ ํ›…์Šค ์‹œ๋ฆฌ์ฆˆ

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ Mount, Update, Unmount๋  ๋•Œ, ํŠน์ •์ž‘์—…์„ ์ฒ˜๋ฆฌ์‹œ์ผœ์ค„ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด useEffect๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ useEffect ํ›…์€ ์ธ์ž๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
    • ์ฝœ๋ฐฑํ•จ์ˆ˜๋ž€ ๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜
  • ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜๋ฆฌํ•  ์ž‘์—…์„ ์ž…๋ ฅํ•ด์ค๋‹ˆ๋‹ค.
useEffect(()=>{})

 

  1. ํ•˜๋‚˜์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋งŒ ๋ฐ›๋Š” ๊ฒฝ์šฐ
  2. ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฐฐ์—ด(dependencies)

๋ฐฐ์—ด์ด ๋นˆ ๋ฐฐ์—ด์ผ ๋•Œ

  • ํ™”๋ฉด์— ์ฒซ ๋ Œ๋”๋ง ๋  ๋•Œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

clean up- ์ •๋ฆฌ

  • ์ฒซ ๋ฒˆ์งธ ์ธ์ž return ๊ฐ’์— ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

clean up ์ฐธ๊ณ  ์ฝ”๋“œ

// App.js
import { useState,useEffect } from "react";
import Timer from "./component/Timer";

function App() {
  const[showTimer,setShowTimer]=useState(false);

  return (
    <div>
      {showTimer && <Timer/>}
      <button onClick={()=>setShowTimer(!showTimer)}>Toggle Timer</button>
    </div>
  );
}

export default App;
// Timer.js
import React, {useEffect} from "react";

const Timer=()=>{

    useEffect(()=>{
        const timer=setInterval(()=>{
            console.log("ํƒ€์ด๋ฉฐ ๋Œ์•„๊ฐ€๋Š” ์ค‘")
        },1000)

        return ()=>{
            // ์ •๋ฆฌ์ž‘์—… ์ฝ”๋“œ
            clearInterval(timer)
            console.log('ํƒ€์ด๋จธ๊ฐ€ ์ข…๋ฃŒ๋จ')
        }
    },[])

    return(
        <div>
            <span>ํƒ€์ด๋จธ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฝ˜์†”์„ ๋ณด์„ธ์š”!</span>
        </div>
    )
}

export default Timer;

 

 

๐Ÿ—ฏ๏ธ ๊ณต์‹ ๋ฌธ์„œ

useEffect(setup, dependencies?)
  • useEffect๋Š” ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” React Hook์ž…๋‹ˆ๋‹ค.
    • ์ผ๋ถ€ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์™ธ๋ถ€์‹œ์Šคํ…œ: React์— ์˜ํ•ด ์ปจํŠธ๋กค๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ์ฝ”๋“œ
        • ๋ช‡๋ช‡ ์ปดํฌ๋„ŒํŠธ๋“ค์€ ํŽ˜์ด์ง€์— ํ‘œ์‹œ๋˜๋Š” ๋™์•ˆ ๋„คํŠธ์›Œํฌ๋‚˜ ๋ธŒ๋ผ์šฐ์ € API, ๋˜๋Š” ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์—ฐ๊ฒฐ์ด ์œ ์ง€๋˜์–ด์•ผ ํ•จ
        • setInterval()์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ํƒ€์ด๋จธ ๋˜๋Š” clearInterval().
        • window.addEventListener()์„ ์ด์šฉํ•œ ์ด๋ฒคํŠธ ๊ตฌ๋… ๋˜๋Š” window.removeEventListener().
        • animation.start()์™€ ๊ฐ™์€ ์„œ๋“œ ํŒŒํ‹ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API ๋˜๋Š” animation.reset().
      • ์˜ˆ๋ฅผ ๋“ค์–ด React์˜ state์„ ๊ธฐ์ค€์œผ๋กœ React์™€ ์ƒ๊ด€์—†๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ์–ดํ•˜๊ฑฐ๋‚˜, ์„œ๋ฒ„ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ๋•Œ ๋ถ„์„ ๋ชฉ์ ์˜ ๋กœ๊ทธ๋ฅผ ์ „์†กํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Effect๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ Œ๋”๋ง ํ›„ ํŠน์ • ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ React ์™ธ๋ถ€์˜ ์‹œ์Šคํ…œ๊ณผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜

  • setup(์„ค์ •)
    • Effect์˜ ๋กœ์ง์ด ํฌํ•จ๋œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • ์„ค์ • ํ•จ์ˆ˜๋Š” ์„ ํƒ์ ์œผ๋กœ clean up(์ •๋ฆฌ) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • React๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์— ์ถ”๊ฐ€๋œ ์ดํ›„์— ์„ค์ • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜์กด์„ฑ์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์—ˆ์„ ๊ฒฝ์šฐ,
      • (์„ค์ • ํ•จ์ˆ˜์— ์ •๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์—ˆ๋‹ค๋ฉด)
      • React๋Š” ์ด์ „ ๋ Œ๋”๋ง์— ์‚ฌ์šฉ๋œ ๊ฐ’์œผ๋กœ ์ •๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ ํ›„
      • ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ์„ค์ • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์ œ๊ฑฐ๋œ ๊ฒฝ์šฐ์—๋„ ์ •๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๐Ÿน <ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํด๋ฆฐ์—… ํ•จ์ˆ˜ ์ถ”๊ฐ€> - ์ผ๋ถ€ Effect๋Š” ์ˆ˜ํ–‰ ์ค‘์ด๋˜ ์ž‘์—…์„ ์ค‘์ง€, ์ทจ์†Œ ๋˜๋Š” ์ •๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, “์—ฐ๊ฒฐ”์€ “์—ฐ๊ฒฐ ํ•ด์ œ”๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, “๊ตฌ๋…”์€ “๊ตฌ๋… ์ทจ์†Œ”๊ฐ€ ํ•„์š”ํ•˜๊ณ , “๋ถˆ๋Ÿฌ์˜ค๊ธฐ(fetch)“๋Š” “์ทจ์†Œ” ๋˜๋Š” “๋ฌด์‹œ”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ์— Effect์—์„œ *ํด๋ฆฐ์—… ํ•จ์ˆ˜(cleanup function)*๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ๋ฐฐ์šฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

React๋Š” ์„ค์ • ํ•จ์ˆ˜์™€ ์ •๋ฆฌ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ ์„ค์ • ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค (๋งˆ์šดํŠธ ์‹œ).
  2. ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์•„๋ž˜ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ๋จผ์ € ์ •๋ฆฌ ์ฝ”๋“œ๊ฐ€ ์˜ค๋ž˜๋œ props์™€ state์™€ ํ•จ๊ป˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
    • ์ดํ›„, ์„ค์ • ์ฝ”๋“œ๊ฐ€ ์ƒˆ๋กœ์šด props์™€ state์™€ ํ•จ๊ป˜ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  3. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ์ œ๊ฑฐ๋œ ์ดํ›„์— ์ •๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค (๋งˆ์šดํŠธ ํ•ด์ œ ์‹œ).

 

๐ŸŠ ์ฐธ๊ณ  ์ฝ”๋“œ

const [counter,setValue]=useState(0);
  const [keyword, setKeyword]=useState("");
  const onClick=()=>setValue((prev)=>prev+1);
  const onChange=(event)=> setKeyword(event.target.value);
  useEffect(()=>{
    console.log("I run only once.");
  },[keyword]);
  useEffect(()=>{
    console.log("I run when 'keyword' changes.");
  },[]);
  useEffect(()=>{
    console.log("I run when 'counter' changes.");
  },[counter]);
  useEffect(()=>{
    console.log("I run when 'keyword&counter' changes.");
  },[keyword,counter]);
 useEffect(() => {
    getMovie();
  }, [id]);
useEffect(()=>{
    fetch("<https://api.coinpaprika.com/v1/tickers>")
    .then((response)=> response.json())
    .then((json)=>{
      setCoins(json);
      setLoading(false);
    })
  },[]);