โญ๏ธ useEffect :)

zooyahoยท2022๋…„ 6์›” 2์ผ
0

study with me

๋ชฉ๋ก ๋ณด๊ธฐ
19/19
post-thumbnail
post-custom-banner

๐Ÿ“ Effect

  • effect(or side effect)๋ž€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ์–ด๋‚˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ ๋œปํ•จ. ์˜ˆ๋ฅผ๋“ค์–ด http๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์ €์žฅ์†Œ(๋กœ์ปฌ์ €์žฅ์†Œ ๋“ฑ)์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ์—์„œ ํƒ€์ด๋จธ๋‚˜ ๊ฐ„๊ฒฉ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„œ๋ฒ„์— ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ์ž ์žฌ์  ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋ฆฌ์•กํŠธ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š์Œ. ๋ฆฌ์•กํŠธ๋Š” ui๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ• ์ด๊ธฐ ๋•Œ๋ฌธ.
  • ์˜ˆ๋ฅผ๋“ค์–ด state๊ฐ’์„ http๋ฆฌํ€˜์ŠคํŠธ๋กœ ๋ณด๋‚ด๊ณ  ๊ทธ์—๋Œ€ํ•œ http๋ฆฌํ€˜์ŠคํŠธ ์‘๋‹ต์œผ๋กœ ์–ด๋–ค state๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฌดํ•œ๋ฃจํ”„๋กœ ๋น ์งˆ ์ˆ˜ ์žˆ์Œ. ๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๋Š” ์ง์ ‘์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์— ๋“ค์–ด๊ฐ€์„œ๋Š” ์•ˆ๋จ!!
  • ๊ทธ๋Ÿฌ๋ฏ€๋กœ effect๋Š” ์ผ๋ฐ˜์ ์ธ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•จ -> ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ useEffectํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

โญ๏ธ useEffect

  • useEffect(()=>{..}, [dependencies])

๐Ÿ“Ž ์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜

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

๐Ÿ“ clean up function

return ()=>{};

  • effectํ•จ์ˆ˜๊ฐ€ ์ฒ˜์Œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ , effectํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ ๋•Œ๋งˆ๋‹ค effectํ•จ์ˆ˜ ์ „์— ์‹คํ–‰๋จ!
  • ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜ ์—†์–ด์งˆ๋•Œ return์˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•จ.

๐Ÿ“Ž๋‘๋ฒˆ์งธ ์ธ์ˆ˜(์˜์กด์„ฑ)

  • ์˜์กด์„ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐ์—ด, ๋นˆ๊ฐ’์ผ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์•ฑ์ด ์‹คํ–‰๋ ๋•Œ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋จ.
  • ์˜์กด์„ฑ์— ์ถ”๊ฐ€ํ•  ํ•ญ๋ชฉ: effect ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  "๊ฒƒ๋“ค"์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ(๋˜๋Š” ์ผ๋ถ€ ์ƒ์œ„ ๊ตฌ์„ฑ ์š”์†Œ)๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜์–ด ์ด๋Ÿฌํ•œ "๊ฒƒ๋“ค"์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์— ์ •์˜๋œ ๋ณ€์ˆ˜๋‚˜ ์ƒํƒœ, ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์— ์ •์˜๋œ props ๋˜๋Š” ํ•จ์ˆ˜๋Š” ์ข…์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค.
  • ์˜์กด์„ฑ์— ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ํ•ญ๋ชฉ:์ƒํƒœ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. (์ง€๋‚œ ๊ฐ•์˜์—์„œ ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ setFormIsValid ์‚ฌ์šฉ): React๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๋ฏ€๋กœ ์ข…์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ "๋‚ด์žฅ" API ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. fetch(), ๋‚˜ localStorage ๊ฐ™์€ ๊ฒƒ๋“ค ๋ง์ด์ฃ  (๋ธŒ๋ผ์šฐ์ €์— ๋‚ด์žฅ๋œ ํ•จ์ˆ˜ ๋ฐ ๊ธฐ๋Šฅ, ๋”ฐ๋ผ์„œ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ): ์ด๋Ÿฌํ•œ ๋ธŒ๋ผ์šฐ์ € API/์ „์—ญ ๊ธฐ๋Šฅ์€ React ๊ตฌ์„ฑ ์š”์†Œ ๋ Œ๋”๋ง ์ฃผ๊ธฐ์™€ ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿ‘พ #01 [] :์—†๋Š” ์˜์กด์„ฑ

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

function App() {
  const [counter, setCounter] = useState(0);
  const onClick = () => {
    setCounter((prev) => prev + 1);
  };
  console.log("i run all the time");
  useEffect(()=>{
    console.log("i run only once!");
  });

  return (
    <div>
      <h1>{counter}</h1>
      <button onClick={onClick}>click</button>
    </div>
  );
}
export default App;

๐Ÿ‘‰๐Ÿป ๋ฒ„ํŠผ์„ ํด๋ฆญํ• ๋•Œ๋งˆ๋‹ค effect ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋จ.

๐Ÿ‘พ #02 [] : ๋นˆ ์˜์กด์„ฑ

useEffect(()=>{
    console.log("i run only once!");
  },[]);

๐Ÿ‘‰๐Ÿป ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋ ๋•Œ effectํ•จ์ˆ˜๊ฐ€ 'ํ•œ๋ฒˆ' ์‹คํ–‰๋จ.
๐Ÿ‘‰๐Ÿป state๊ฐ€ ๋ณ€ํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋ Œ๋”๋ง ๋˜๋”๋ผ๋„ effectํ•จ์ˆ˜๋ฅผ ์‹คํ–‰๋˜์ง€ ์•Š์Œ!!

๐Ÿ‘พ #03

function App() {
  const [counter, setCounter] = useState(0);
  const [keword, setKeyword] = useState("");

  const onClick = () => setCounter((prev) => prev + 1);
  const onChange = (event) => setKeyword(event.target.value);

  console.log("i run all the time");
  // ๊ฒ€์ƒ‰์ฐฝ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ผ์„ ๋•Œ, ๊ฒ€์ƒ‰ API๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด,,
  useEffect(() => {
    console.log("CALL THE API...");
  }, []);
  console.log("SEARCH FOR", keyword);

  return (
    <div>
      <input
        value={keword}
        type="text"
        placeholder="Search here"
        onChange={onChange}
      />
      <h1>{counter}</h1>
      <button onClick={onClick}>click</button>
    </div>
  );
}

๐Ÿ‘‰๐Ÿป ๊ฒ€์ƒ‰์ฐฝ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ผ์„ ๋•Œ, ๊ฒ€์ƒ‰ API๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด, ๊ฒ€์ƒ‰์ฐฝ์— ์ž…๋ ฅํ• ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ์‹คํ–‰๋˜์–ด ์„ฑ๋Šฅ์— ์ข‹์ง€ ์•Š์Œ.

๐Ÿ‘พ #04 [keyword]

useEffect(()=>{
    console.log("SEARCH FOR", keyword);
  }, [keyword]);

๐Ÿ‘‰๐Ÿป [keyword]์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด, keyword๊ฐ€ ๋ณ€ํ™”ํ• ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น effectํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ , ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์Œ!
๐Ÿ‘‰๐Ÿป ์ปดํฌ๋„ŒํŠธ์˜ state๋กœ ์ธํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋ Œ๋”๋ง ๋˜๋”๋ผ๊ณ  ์ดํŽ™ํŠธํ•จ์ˆ˜๋Š” ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ ์‹คํ–‰๋˜๋Š” ๊ฒƒ!!

๐Ÿ‘พ #05 '๋””๋ฐ”์šด์‹ฑ'๊ธฐ์ˆ : ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ฒƒ

useEffect(() => {
  const time = setTimeout(()=>{
    if (keyword !== "" && keyword.length > 5) {
      console.log("SEARCH FOR", keyword);
    }
  };, 300); 
  return(()=> clearTimeout(time));  
  }, [keyword]);

๐Ÿ‘‰๐Ÿป '๋””๋ฐ”์šด์‹ฑ'๊ธฐ์ˆ : ์ผ์ •๋Ÿ‰์˜ ํ‚ค ์ž…๋ ฅ์„ ์ˆ˜์ง‘ํ•˜๊ฑฐ๋‚˜ ํ‚ค ์ž…๋ ฅ ํ›„ ์ผ์ • ์‹œ๊ฐ„๋™์•ˆ ์ผ์‹œ ์ค‘์ง€๋˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ. ์˜ˆ๋ฅผ๋“ค์–ด 3์ดˆ๋™์•ˆ ์ž…๋ ฅํ•œ ๊ฐ’๋“ค์˜ ์œ ํšจ์„ฑ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ , 3์ดˆ ํ›„์— ์œ ํšจ์„ฑ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋ฒˆ๋งŒ ํ•จ.
๐Ÿ‘‰๐Ÿป clearTimeout(): ๋‹ค์Œ์— ํ‚ค๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ์ „์— ์žˆ๋˜ ์‹œ๊ฐ„์„ ์ง€์›Œ์•ผํ•จ. ๊ทธ๋ž˜์•ผ ์ƒˆ๋กœ์šด ์‹œ๊ฐ„์ด ์„ค์ •๋จ. -> ๋งˆ์ง€๋ง‰์— ์ž…๋ ฅํ•œ ๊ฒƒ๋ถ€ํ„ฐ 3์ดˆ๊ฐ€ ์ง€๋‚˜๊ณ  ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š”๊ฒƒ์ž„.(๋งˆ์ง€๋ง‰ ํƒ€์ด๋จธ๋งŒ ์™„๋ฃŒ๋จ.)
๐Ÿ‘‰๐Ÿป return ()=>{}; : ์ฒ˜์Œ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ , effectํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ ๋•Œ๋งˆ๋‹ค ์ „์— ์‹คํ–‰๋จ!
๐Ÿ‘‰๐Ÿป โญ๏ธ 3์ดˆ ๋™์•ˆ ์œ ํšจ์„ฑ๊ฒ€์‚ฌ๋Š” ์•ˆํ•˜์ง€๋งŒ, ํ‚ค์ž…๋ ฅ ๋ ๋•Œ๋งˆ๋‹ค(์›๋ž˜๋Š” ์ดํŽ™ํŠธํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด์•ผ ํ•จ) returnํ•จ์ˆ˜๋Š” ์‹คํ–‰๋จ!! -> ๋ฆฌํ„ดํ•จ์ˆ˜๋Š” ์ดํŽ™ํŠธํ•จ์ˆ˜ ์‹คํ–‰์ „์— ์‹คํ–‰ํ•œ๋Š” ํ•จ์ˆ˜๋‹ˆ๊นŒ!!

๐Ÿ‘พ #06 Hello์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ

import React, { useState } from "react";

function Hello() {
  useEffect(()=>{
    console.log("created :)");
    return ()=>{
      console.log("destroyed :(")
    };
  }, [])
  
  return <p>Hello</p>;
}

function App() {
  const [showing, setShowing] = useState(false);
  const onClick = () => {
    setShowing((prev) => !prev);
  };

  return (
    <div>
      {showing ? <Hello /> : null}
      <button onClick={onClick}>{!showing ? "Hide" : "Show"}</button>
    </div>
  );
}
export default App;

๐Ÿ‘‰๐Ÿป ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด Hello๊ฐ€ ๋ณด์—ฌ์ง€๊ณ  ์—†์–ด์ง€๋Š” ์ฝ”๋“œ.
๐Ÿ‘‰๐Ÿป return ()=>{}; : Hello ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜ ์—†์–ด์งˆ๋•Œ return์˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•จ.
๐Ÿ‘‰๐Ÿป ์˜ˆ๋ฅผ๋“ค์–ด์„œ ์ปดํฌ๋„ŒํŠธ ์•ˆ์— ๋‘๊ฐœ์˜ useEffect ํ›…์ด ์žˆ๊ณ  ํ•จ์ˆ˜์•ˆ์— return์ด ์žˆ๋‹ค๊ณ  ํ–ˆ์„๋•Œ, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†์–ด์ง€๋ฉด ํ•ด๋‹น ๋‘๊ฐœ์˜ ํ›… ๋ฆฌํ„ด์ด ๋ชจ๋‘ ์‹คํ–‰๋จ!

profile
์ฆ๊ฒ๊ฒŒ ๊ฐœ๋ฐœํ•˜์ž ์ฅฌ์•ผํ˜ธ๐Ÿ‘ป
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€