[React] useEffect()

๊ถŒ์šฉ์ค€ยท2023๋…„ 12์›” 6์ผ
0

useEffect()

๐Ÿ“Œ ์ •์˜

React์—์„œ ์ œ๊ณตํ•˜๋Š” ํ›… ์ค‘ ํ•˜๋‚˜๋กœ, ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ side effects๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. side effects๋ž€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง๊ณผ๋Š” ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ จ์ด ์—†๋Š” ์ž‘์—…๋“ค์„ ์˜๋ฏธํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ๊ตฌ๋… ์„ค์ •, ์ˆ˜๋™์œผ๋กœ DOM ์กฐ์ž‘ ๋“ฑ์ด ์žˆ๋‹ค.

โ—๏ธํŠน์ง•

- useEffect๋Š” component๊ฐ€ mount,unmount,update ๋์„ ๋•Œ ํŠน์ • ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋œ ํ›„์— ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ํ•จ์ˆ˜๋Š” ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฌผ์ด ํ™”๋ฉด์— ํ‘œ์‹œ๋œ ์ดํ›„์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

- useEffect์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋˜๊ธฐ ์ „์ด๋‚˜ ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ์ง์ „์— ์ •๋ฆฌ(clean-up) ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ ์˜ˆ์‹œ ์ฝ”๋“œ

๊ธฐ๋ณธ ๊ตฌ์กฐ

useEffect(() => {
    // ์—ฌ๊ธฐ์— side effect๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ ์ž‘์„ฑ
    // ...

    // clean-up ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Œ
    return () => {
      // ์ •๋ฆฌ(clean-up) ์ฝ”๋“œ ์ž‘์„ฑ
      // ...
    };
  }, [/* dependency ๋ฐฐ์—ด */]);![](https://velog.velcdn.com/images/kwonyongyong/post/174d9451-2725-49bb-bb18-381fa657f371/image.jpeg)

mount ์˜ˆ์‹œ ์ฝ”๋“œ

import React, { useEffect } from 'react';

function MountExample() {
  useEffect(() => {
    console.log('์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋จ');

    // ์—ฌ๊ธฐ์— ๋งˆ์šดํŠธ ์‹œ์— ์ˆ˜ํ–‰ํ•  ์ž‘์—… ์ž‘์„ฑ
    // ์˜ˆ: ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ์ดˆ๊ธฐํ™” ๋“ฑ
    // ...

    // clean-up ํ•จ์ˆ˜
    return () => {
      console.log('์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋จ');
      // ๋งˆ์šดํŠธ ์‹œ์— ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ์ •๋ฆฌ(clean-up) ์ฝ”๋“œ ์ž‘์„ฑ
      // ...
    };
  }, []); // ๋นˆ ๋ฐฐ์—ด์ด๋ฏ€๋กœ ์ฒ˜์Œ ๋งˆ์šดํŠธ๋  ๋•Œ๋งŒ ์‹คํ–‰๋จ

  return (
    <div>
      {/* ์ปดํฌ๋„ŒํŠธ์˜ ๋‚˜๋จธ์ง€ ๋‚ด์šฉ */}
    </div>
  );
}

export default MountExample;

update ์˜ˆ์‹œ ์ฝ”๋“œ

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

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

  useEffect(() => {
    console.log('์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ๋จ');

    // ์—ฌ๊ธฐ์— ์—…๋ฐ์ดํŠธ ์‹œ์— ์ˆ˜ํ–‰ํ•  ์ž‘์—… ์ž‘์„ฑ
    // ์˜ˆ: ์ƒํƒœ ๋ณ€๊ฒฝ, ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹  ๋“ฑ
    // ...

    // clean-up ํ•จ์ˆ˜ (์ด ๊ฒฝ์šฐ, ์—…๋ฐ์ดํŠธ ์‹œ์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ)
  }, [count]); // count๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋จ

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

export default UpdateExample;

unmount ์˜ˆ์‹œ ์ฝ”๋“œ

import React, { useEffect } from 'react';

function UnmountExample() {
  useEffect(() => {
    console.log('์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋จ');

    // ์—ฌ๊ธฐ์— ๋งˆ์šดํŠธ ์‹œ์— ์ˆ˜ํ–‰ํ•  ์ž‘์—… ์ž‘์„ฑ
    // ์˜ˆ: ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ, ์ดˆ๊ธฐํ™” ๋“ฑ
    // ...

    // clean-up ํ•จ์ˆ˜
    return () => {
      console.log('์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋จ');
      // ๋งˆ์šดํŠธ ์‹œ์— ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ์ •๋ฆฌ(clean-up) ์ฝ”๋“œ ์ž‘์„ฑ
      // ...
    };
  }, []); // ๋นˆ ๋ฐฐ์—ด์ด๋ฏ€๋กœ ์ฒ˜์Œ ๋งˆ์šดํŠธ๋  ๋•Œ๋งŒ ์‹คํ–‰๋จ

  // ์ปดํฌ๋„ŒํŠธ์˜ ๋‚˜๋จธ์ง€ ๋‚ด์šฉ

  return (
    <div>
      {/* ์ปดํฌ๋„ŒํŠธ์˜ ๋‚˜๋จธ์ง€ ๋‚ด์šฉ */}
    </div>
  );
}

export default UnmountExample;
profile
Brendan Eich, Jordan Walke, Evan You, ๊ถŒ์šฉ์ค€

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