ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React] useEffect ์ •๋ฆฌ
    react 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);
        })
      },[]);
    

     

Designed by Tistory.