๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”‘Code/React

React | useEffect() ๋ฅผ ์จ๋ณด์ž

by pajiyeee 2023. 3. 28.

๋ฆฌ์•กํŠธ์˜ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ ์ž ํ–ˆ์„ ๋•Œ
์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ•จ์ˆ˜๋ฅผ return๋ฌธ ์œ„์— ๋งŒ๋“ค์–ด ํ˜ธ์ถœํ•˜๋ฉด ์–ด๋–จ๊นŒ?
๋ Œ๋”๋ง ์ˆœ์„œ๋Š” sideEffect๊ฐ€ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๋ฆฌํ„ดํ•  ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.
 

const Component = () => {
  
  const sideEffect = () => {
    ์‚ฌ์ด๋“œ๋ฆฌํŒฉํŠธ ์‹คํ–‰ ๋‚ด์šฉ;
  };
  
  sideEffect();
  
  return (
    ๋ฆฌํ„ดํ•  ๊ฐ’
  );
}

 
 

์—ฌ๊ธฐ์—” ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์ƒ๊ธด๋‹ค.

1.side effect ๊ฐ€ ๋ Œ๋”๋ง์„ Blocking ํ•œ๋‹ค.
์ฝ”๋“œ๋Š” ์œ„์—์„œ ์•„๋ž˜๋ฐฉํ–ฅ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
sideEffect๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ํ•จ์ˆ˜๋ผ๋ฉด
side effect๊ฐ€ ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋ธŒ๋ผ์šฐ์ € ์ƒ์—์„œ๋Š” UI๊ฐ€ ๋ Œ๋”๋ง ๋˜์ง€ ๋ชปํ•˜๊ณ  ๋ฉˆ์ถ”๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด์— UI๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ธฐ๊นŒ์ง€ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ค ์ข‹์ง€ ์•Š์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
 
2.๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค Side Effect๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค.
๋ฆฌ์•กํŠธ์—์„œ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.
ํŠน์ • ์ƒํ™ฉ์—์„œ๋งŒ ํ•„์š”ํ•œ side effect๊ฐ€ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ๊ณ„์† ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋‹ค.
 
 
 

๊ทธ๋ ‡๋‹ค๋ฉด Side Effect ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์‹œ์ ์—์„œ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฑด?

1. ๋ Œ๋”๋ง์ด ๋ชจ๋‘ ์™„๋ฃŒ๋˜๊ณ  ๋‚œ ํ›„ side effect ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
side effect ๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋œ๋‹ค๋ฉด ํ™”๋ฉด UI๊ฐ€ ๋ Œ๋”๋ง ๋˜๋Š” ์‹œ๊ฐ„์ด ๋А๋ ค์ง€์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
 
2. side effect๋ฅผ ์›ํ•  ๋•Œ๋งŒ ์กฐ๊ฑด์„ ๊ฑธ์–ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
๋งค๋ฒˆ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค side effect๊ฐ€ ์›ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ ๊ฐ™์ด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„ ๋” ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋‹ค.
 

 

โœ… ์ด๋Ÿฌํ•œ ์กฐ๊ฑด๋“ค์„ ์ถฉ์กฑ ์‹œํ‚ค๋Š” ๊ฒŒ useEffect๋ผ๋Š” hook ์ด๋‹ค.

 

useEffect(() => {์ฝœ๋ฐฑํ•จ์ˆ˜}, [์˜์กด์„ฑ๋ฐฐ์—ด])

useEffect ๋ฅผ ์“ธ ๋•Œ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์™€, ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๊ฐ™์ด ์จ์ค€๋‹ค.
 
์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์–ด๋–ค ๋™์ž‘์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋ฐ, ์‚ฌ์ด๋“œ ์ดํŒฉํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์–ด๋–ค ๊ฑธ ์‹คํ–‰์‹œํ‚ฌ์ง€ ๋‹ด๋Š”๋‹ค.
์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์—ญํ• ์€ ๋‹ค๋ฅธ UI๋“ค์ด ๋จผ์ € ๋ Œ๋”๋ง๋˜๊ณ  useEffect ํ•จ์ˆ˜๋ฅผ ๋งจ ๋‚˜์ค‘์— ์‹คํ–‰ํ•œ๋‹ค.
 
์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์จ์ค„ ๋•Œ ํ™”๋ฉด blocking ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์ง€๋งŒ,
ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ์—๋„ ๋ณ€ํ•˜๋Š” ๊ฐ’์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๊ฐ™์ด ์‹คํ–‰๋œ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ๋‚จ๋Š”๋‹ค.
 
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ™์ด ์จ์ฃผ๋Š” ๊ฒƒ์ด ์˜์กด์„ฑ ๋ฐฐ์—ด์ด๋‹ค.
์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์€ '์ด์ „ ๋ Œ๋”๋ง๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋™์ผํ•œ๊ฐ€?' ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.
์ฒซ ๋ฒˆ์งธ ๋ Œ๋”๋ง์—์„œ๋Š” ๋ฌด์กฐ๊ฑด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ
๋‘ ๋ฒˆ์งธ ๋ Œ๋”๋ง๋ถ€ํ„ฐ๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ๊ฐ’์ด ๋ณ€ํ–ˆ์œผ๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.
((((๋งŒ์•ฝ ๋นˆ ๋ฐฐ์—ด [ ] ์„ ์จ์ค€๋‹ค๋ฉด ๋งจ ์ฒ˜์Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ณ  ๊ทธ ์ดํ›„๋ก  ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.))))
 
 
 
 

๐Ÿ“Œ ์ฝ”๋“œ๋กœ  useEffect( ) ๋ Œ๋”๋ง ์‚ฌ์ดํด ์•Œ์•„๋ณด๊ธฐ

์•„๋ž˜ ์—ฐ์Šต์„ ํ†ตํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

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

function App() {
  const [count, setCount] = useState(0);
  const [text, setText] = useState("");

  useEffect(() => {
    console.log("1");
  }, [count, text]);
  //count์™€ text๊ฐ€ ๋ณ€ํ•  ๋•Œ ์ด ์ฝœ๋ฐฑํ•จ์ˆ˜ ํ˜ธ์ถœ
  
  useEffect(() => {console.log("2");
  }[]);
  //๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์„ ๊ฒƒ

  console.log("3");
  
  return (
    <div>
      <div className="wrapper">
        <h1>Count: {count}</h1>
        <button onClick={() => setCount(count + 1)}>Up</button>
      </div>
      <input value={text} onChange={(e) => setText(e.target.value)} />
    </div>
  );
}

export default App;

 
์—ฌ๊ธฐ์„œ ๋ฌธ์ œ!

Q. ๋จผ์ € App์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ์— ํ•ด๋‹นํ•˜๋Š” UI ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ  ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ Œ๋”๋ง์ด ๋ ๊นŒ?

 

1๋ฒˆ

useEffect(() => {
    console.log("2");
  }, [count, text]);

 

2๋ฒˆ

useEffect(() => {console.log("3");
  }[]);

 

3๋ฒˆ

console.log("1");

 

Answer

์ฒ˜์Œ์— ํ™”๋ฉด ์ง„์ž… ์‹œ

๋ชจ๋“  UI๊ฐ€ ๋‹ค ๋ Œ๋”๋ง๋˜์ง€๋งŒ useEffect๊ฐ€ ์“ฐ์ธ ํ•จ์ˆ˜๋Š” ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—
3 -> 1 -> 2 ์ˆœ์„œ๋กœ ์ฐํžŒ๋‹ค.
 

๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋˜๋Š” Input ์— ํ…์ŠคํŠธ ์ž…๋ ฅ ์‹œ

๋นˆ ๋ฐฐ์—ด์„ ์˜์กด์„ฑ ๋ฐฐ์—ด๋กœ ๋„ฃ์–ด์ค€ 2๋ฒˆ์€ ํ•ด๋‹นํ•˜์ง€ ์•Š๊ณ ,
3๋ฒˆ๊ณผ ํด๋ฆญ์ด๋‚˜ input ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๋Š” 1๋ฒˆ์€ ํ™”๋ฉด์— ์‹คํ–‰ ๋œ๋‹ค.
3 -> 1

 

 

useEffect ์ผ์„ ๋•Œ Rendering Cycle

1๏ธโƒฃ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง๋œ๋‹ค. mount
2๏ธโƒฃ useEffect์—์„œ ์ฝœ๋ฐฑํ•จ์ˆ˜ ํ˜ธ์ถœํ•œ๋‹ค. side effect
3๏ธโƒฃ ์ปดํฌ๋„ŒํŠธ์˜ state/ props ๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ๋ฆฌ๋ Œ๋”๋ง๋œ๋‹ค. update
4๏ธโƒฃ useEffect์—์„œ ์˜์กด์„ฑ ๋ฐฐ์—ด ํ™•์ธํ•ด์„œ ๋งŒ์•ฝ ์ด์ „ ๋ Œ๋”๋ง๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋ณ€ํ™”๋œ ๊ฐ’์ด ์žˆ์œผ๋ฉด ์ฝœ๋ฐฑํ•จ์ˆ˜ ํ˜ธ์ถœ side effect
5๏ธโƒฃ state/ propd ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด 3๋ฒˆ๊ณผ 4๋ฒˆ๊ณผ์ • ๋ฐ˜๋ณตํ•œ๋‹ค.
6๏ธโƒฃ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋” ์ด์ƒ ํ•„์š” ์—†์–ด์ง€๋ฉด ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง„๋‹ค.unmount
 
 
 
์ง€๊ธˆ๊นŒ์ง€ useEffect๋ฅผ ์•Œ์•„๋ณด์•˜๋‹ค. 
๋‚ด ์ž‘์—…๋ฌผ์—๋Š” useEffect ๊ฐ€ ์ ์šฉ๋ ์ง€ ๊ถ๊ธˆํ•˜๊ธฐ๋„ ํ•˜๊ณ  ์•„์ง๊นŒ์ง„ ๋‘๋ ต๊ธฐ๋„ ํ•˜๋‹ค. 
๋นจ๋ฆฌ ์ต์ˆ™ํ•ด์กŒ์œผ๋ฉดใ…Žใ…Ž