[React] useEffect

Na Jeongยท2022๋…„ 11์›” 29์ผ
0

react

๋ชฉ๋ก ๋ณด๊ธฐ
6/11
post-thumbnail

๐Ÿ““useEffect

Data Fetching, ๊ตฌ๋… ๋“ฑ์˜ side effect๋Š” ๋งค์šฐ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๋‹ค๋ค„์•ผ ํ•œ๋‹ค.
๋ฆฌ์•กํŠธ์—์„œ side effect๋Š” ์–ธ์ œ ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ• ๊นŒ ?

๐Ÿ“™React์—์„œ side effect์˜ ์˜ฌ๋ฐ”๋ฅธ ๋ฐœ์ƒ ์‹œ์ 

const App = () => {
	return <h1>Hello World</h1>
};

์œ„์˜ ์ฝ”๋“œ์—์„œ Hello Worldํ˜•ํƒœ์˜ JSX๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ๋ Œ๋”๋ง ํ•œ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ ??
๊ฐ€์žฅ ๋จผ์ € ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ƒ๊ฐ์€ 'ํ•จ์ˆ˜์˜ return๋ฌธ ์œ„์— ํ•˜๊ณ ์‹ถ์€ ๋™์ž‘์„ ๋„ฃ์–ด๋‘์ž'์ด๋‹ค.

const App = () => {
	const doSideEffect = () => {
    	//do some side effect
    };
    
    doSideEffect();
    
    return <h1>Hello World</h1>;
};

ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์ด ๋žœ๋”๋ง ๋‹จ๊ณ„์—์„œ side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
1. side effect๊ฐ€ ๋ Œ๋”๋ง์„ blockingํ•œ๋‹ค.
2. ๋งค ๋žœ๋”๋ง๋งˆ๋‹ค side effect๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค.

๋ฌด์Šจ๋ง์ธ๊ฐ€ํ•˜๋ฉด !

๐Ÿ”ฅside effect๊ฐ€ ๋ Œ๋”๋ง์„ blocking

const App = () => {
	const doSideEffect = () => {
    	//do some side effect
    };
    
    doSideEffect();
    
    return <h1>Hello World</h1>;
};

๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ”๋“œ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ App ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋Š” doSideEffect()๋™์ž‘์ด ๋๋‚  ๋•Œ๊นŒ์ง€ JSX๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ JSX๋ฅผ returnํ•˜๊ธฐ ์ „๊นŒ์ง€๋Š” UI๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์ƒ์— ๋žœ๋”๋ง ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋ Œ๋”๋ง์„ ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฉˆ์ถฐ์žˆ๊ฒŒ ๋œ๋‹ค.

์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ UI๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ธฐ๊นŒ์ง€ ์˜ค๋žœ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๊ณง ์‚ฌ์šฉ์ž์—๊ฒŒ ์ข‹์ง€ ๋ชปํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๐Ÿ”ฅ๋งค ๋žœ๋”๋ง๋งˆ๋‹ค side effect๊ฐ€ ์ˆ˜ํ–‰

ํŠน์ •ํ•œ side effect๋“ค์€ ๋งค๋ฒˆ ์‹คํ–‰๋  ํ•„์š”๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ธ์Šคํƒ€๊ทธ๋žจ์—์„œ ํ”ผ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์•„์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ™”๋ฉด์ด ์žˆ๋‹ค. ํ”ผ๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ตœ์ดˆ์— ํ”ผ๋“œ ๋ฐ์ดํ„ฐ๋“ค์„ ๊ฐ€์ ธ์˜ค๋Š”(Data Fetching) side effect๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ƒ๊ฐ์„ ํ•ด๋ณด๋ฉด, ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ์˜ค๋Š” side effect๋Š” ๋งค ๋žœ๋”๋ง๋งˆ๋‹ค ์ˆ˜ํ–‰๋  ํ•„์š”๋Š” ์—†๋‹ค.

const App = () => {
	//data fetching side effect
    
    getFeeds();
    
    return FeedList;
};

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

์ฆ‰, App์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ํ˜ธ์ถœ๋˜๊ณ  ๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์‹œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰์‹œํ‚จ๋‹ค.
๊ทธ ๋ง์€ ๋‹ค์‹œ ํ•œ๋ฒˆ getFeeds() side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

์ž‘์€ UI ์—…๋ฐ์ดํŠธ ๋ฐœ์ƒ ์‹œ ๋งˆ๋‹ค ๋งค๋ฒˆ ๋ชจ๋“  ํ”ผ๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ๊ฐ€์ ธ์˜จ๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ ๋™์ž‘์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ๋น„ํšจ์œจ์ ์ด๋‹ค.

๐Ÿ”ฅ์ •๋ฆฌํ•˜์ž๋ฉด

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

์œ„ ๋‘๊ฐ€์ง€ ์กฐ๊ฑด์„ ์ถฉ์กฑ์‹œํ‚ค๋ฉด์„œ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
์ด ๋‘๊ฐ€์ง€๋ฅผ ์ถฉ์กฑ์‹œํ‚ค๋ฉด์„œ side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด useEffect ๋ผ๋Š” hook์ด๋‹ค.

๐Ÿ“™useEffect ์‚ฌ์šฉ๋ฒ•

useEffect๋Š” ๋ฆฌ์•กํŠธ์—์„œ side effect๋ฅผ ํŽธ๋ฆฌํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” hook์ด๋‹ค.
์‚ฌ์šฉ๋ฒ•์€,
useEffect(์ฝœ๋ฐฑํ•จ์ˆ˜);

useEffect๋Š” ํ•จ์ˆ˜์ด๊ณ , ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง„๋‹ค. ์šฐ๋ฆฌ๋Š” useEffect์— ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ํŠน์ •ํ•œ side effect๋ฅผ ์ˆ˜ํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

const App = () => {
	doSideEffect();
    
    return <h1>Hello World</h1>
};

์œ„ ์ฝ”๋“œ๋Š” useEffect์—†์ด side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ฝ”๋“œ์ด๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” side effect๋ฅผ ๋žœ๋”๋ง ์ „์— ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋Š” ๋ Œ๋”๋ง์„ blockingํ•˜๊ธฐ์— ์ข‹์ง€ ์•Š๊ธฐ์— ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ useEffect๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

import { useEffect } from 'react';

const App = () => {
  // ์ฝ”๋“œ ์ƒ๋žต

  useEffect(doSideEffect);

  return <h1>Hello, Wecoder</h1>;
};

side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ”๋กœ ํ›„์ฒ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ useEffect์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ–ˆ๋‹ค.
์œ„์™€ ๊ฐ™์ด useEffect์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๊ณง๋ฐ”๋กœ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๋žœ๋”๋ง์ด ์™„๋ฃŒ๋œ ํ›„์— ํ˜ธ์ถœ๋œ๋‹ค.
์ฆ‰, ๋žœ๋”๋ง์„ blocking ํ•˜์ง€ ์•Š๊ณ  side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ“™์กฐ๊ฑด๋ถ€๋กœ side effect ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ

useEffect๋ฅผ ํ†ตํ•ด์„œ ๋žœ๋”๋ง์ด ๋ชจ๋‘ ์™„๋ฃŒ๋˜๊ณ  ๋‚œ ํ›„ side effect๋ฅผ ์‹คํ–‰ํ•œ๋‹ค๋Š” ์š”๊ตฌ์‚ฌํ•ญ์€ ์ถฉ์กฑ๋˜์—ˆ์ง€๋งŒ ์•„์ง๋„ ๋งค ๋žœ๋”๋ง๋งˆ๋‹ค side effect๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋ณ€ํ•จ์ด ์—†๋‹ค.
ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑํ•  ๋•Œ๋งŒ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ ?

useEffect๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์™ธ์— ์˜์กด์„ฑ ๋ฐฐ์—ด์ด๋ผ๋Š” ๋‘๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„๋‹ค.
์˜์กด์„ฑ ๋ฐฐ์—ด์€ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ์ด๋‹ค. ์ด ๋ฐฐ์—ด์ด side effect์˜ ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅด ๊ฒฐ์ •์ง“๋Š” ์กฐ๊ฑด์ด๋‹ค.

useEffect(์ฝœ๋ฐฑ ํ•จ์ˆ˜, ์˜์กด์„ฑ ๋ฐฐ์—ด)

useEffect์˜ ๋™์ž‘ ๋ฐฉ์‹
์ฒซ ๋ฒˆ์งธ ๋žœ๋”๋ง ์ดํ›„์—๋Š” ๋ฌด์กฐ๊ฑด useEffect์— ์ „๋‹ฌ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‹ค์Œ ๋žœ๋”๋ง๋ถ€ํ„ฐ๋Š” ์•„๋ž˜์˜ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋™์ž‘ํ•œ๋‹ค.

  1. ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋งค ๋žœ๋”๋ง๋งˆ๋‹ค ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  2. ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์ „๋‹ฌ๋˜์—ˆ๋‹ค๋ฉด ์˜์กด์„ฑ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ๊ฒ€์‚ฌํ•œ๋‹ค.
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์žˆ๋Š” ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ด์ „ ๋žœ๋”๋ง๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋‹ฌ๋ผ์กŒ๋‹ค๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์— ์žˆ๋Š” ๊ฐ’์ด ์ด์ „ ๋žœ๋”๋ง๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋ชจ๋‘ ๋‹ค ๊ฐ™๋‹ค๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ฆ‰, useEffect์—์„œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์‹คํ–‰์‹œํ‚ฌ ๋™์ž‘์„ ๊ฒฐ์ •ํ•˜๊ณ  ๋‘ ๋ฒˆ์ฉจ ์ธ์ž์ธ ์˜์กด์„ฑ ๋ฐฐ์—ด์€ ์‹คํ–‰์‹œํ‚ฌ ํƒ€์ด๋ฐ์„ ๊ฒฐ์ •์ง“๋Š”๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“™Rendering & Effect Cycle

์ถœ์ฒ˜: https://dmitripavlutin.com/react-useeffect-explanation/

์œ„์˜ ๊ทธ๋ฆผ์€ useEffect์™€ React Component๊ฐ€ ๋ Œ๋”๋ง ๋˜๋Š” ๊ณผ์ •์„ ํ•จ๊ผ ๋„์‹ํ™” ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์ด๋‹ค.

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง๊ณผ useEffect๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ณผ์ •์„ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜๋ฉด,
1. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋œ๋‹ค. (์ตœ์ดˆ๋กœ ์ง„ํ–‰๋˜๋Š” ๋ Œ๋”๋ง์€ ๋ธŒ๋ผ์šฐ์ €์— ์ฒ˜์Œ์œผ๋กœ ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณด์˜€๋‹ค๋Š” ์˜๋ฏธ๋กœ mount๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.)
2. useEffect ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค (side effect)
3. ์ปดํฌ๋„ŒํŠธ์˜ state ๋˜๋Š” props๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•œ๋‹ค. (update)
4. useEffect๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ž์— ๋“ค์–ด์žˆ๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ํ™•์ธํ•œ๋‹ค.
- ๋งŒ์•ฝ ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜, ์˜์กด์„ฑ ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ๊ฐ’ ์ค‘ ์ด์ „ ๋ Œ๋”๋ง๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋ณ€๊ฒฝ๋œ๊ฐ’์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. (side effect)
- ์˜์กด์„ฑ ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ๊ฐ’ ์ค‘ ์ด์ „ ๋ Œ๋”๋ง๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ์—†๋‹ค๋ฉด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.
- state ๋˜๋Š” props๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด 3 - 4 ๊ณผ์ • ๋ฐ˜๋ณต
5. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋” ์ด์ƒ ํ•„์š” ์—†์–ด์ง€๋ฉด ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง„๋‹ค. (์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์˜ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์กŒ๋‹ค๋Š” ์˜๋ฏธ๋กœ unmount๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.)

๐Ÿ““Clean Up

๐Ÿ“™Clean Up์˜ ํ•„์š”์„ฑ

๋ถˆํ•„์š”ํ•˜๊ฒŒ ๊ณ„์†ํ•ด์„œ side effect๊ฐ€ ๋‚จ์•„์žˆ์–ด์„œ ๋น„ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๊ณ , ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์ด ์˜๋„ํ•œ ๋Œ€๋กœ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€์†์ ์œผ๋กœ ๋‚จ์•„์žˆ๊ฒŒ๋˜๋Š” side effect๋ฅผ ๋ฐ˜๋“œ์‹œ clean upํ•ด์ค˜์•ผ ํ•œ๋‹ค.

useEffect(() => {
	const cntTime = () => {
    	console.log('100ms๊ฐ€ ์ง€๋‚จ');
    };
    
    setInterval)cntTime, 100);
}, []);

์œ„์˜ side effect๋Š” claen up์ด ํ•„์š”ํ•˜๋‹ค.
์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด setInterval ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ 100ms๋งˆ๋‹ค cntTime ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๋นˆ ๋ฐฐ์—ด์ด ์ „๋‹ฌ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ๋žœ๋”๋ง ์ดํ›„์— side effect๊ฐ€ ์‹คํ•ธ๋œ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ด side effect๋ฅผ clean up ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount ๋˜๋Š” ๊ฒฝ์šฐ ๋“ฑ setInterval์„ ํ†ตํ•œ ๊ตฌ๋…์ด ํ•„์š” ์—†์–ด์ง„ ์ƒํ™ฉ์—์„œ๋„ ๊ณ„์†ํ•ด์„œ ์ฝ˜์†”์ด ์ถœ๋ ฅ์ด ๋œ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด,

useEffect(() => {
  const button = document.getElementById('consoleButton'); // 1

  const printConsole = () => {
    console.log('button clicked');
  }; // 2

  button.addEventListener('click', printConsole); // 3
});

useEffect์— ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์•˜์„ ๋•Œ side effect๊ฐ€ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.
์œ„์˜ ์ฝ”๋“œ๋Š” ์•„๋ž˜์˜ ์ˆœ์„œ๋กœ ๋™์ž‘์„ ํ•˜๊ณ  ์žˆ๋‹ค.

  1. document.getElementById ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด์„œ consoleButton์ด๋ž€ ID๋ฅผ ๊ฐ€์ง„ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์™€์„œ button ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ๋‹ค.
  2. printConsole ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  3. button์— ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค printConsole์ด ์‹คํ–‰๋˜๋„๋ก button์— eventListener๋กœ ๋“ฑ๋กํ•œ๋‹ค.

์ด side effect๋Š” ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง์ด ๋  ๋•Œ๋งˆ๋‹ค button์— eventListener๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค. ์ฆ‰ eventListener๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ค‘์ฒฉ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

๋”ฐ๋ผ์„œ, ์ฒซ ๋ Œ๋”๋ง ์ดํ›„์—๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ฝ˜์†”์ด ํ•œ๋ฒˆ๋งŒ ์ถœ๋ ฅ๋˜์ง€๋งŒ, ๋‘ ๋ฒˆ์งธ ๋ Œ๋”๋ง์ด ๋˜๋ฉด ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๊ฐ€ ํ•œ๋ฒˆ ๋” ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง์ด ๋  ๋•Œ๋งˆ๋‹ค ์ฝ˜์†” ์ถœ๋ ฅ ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ clean up์ด ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค.

๐Ÿ“™Clean Up ๋ฐฉ๋ฒ•

useEffect๋Š” side effect๋ฅผ clean up ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์ค€๋‹ค.
useEffect์—์„œ side effect๋ฅผ clean up ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” useEffect์— ์ „๋‹ฌํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ claen up์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋ฉด ๋œ๋‹ค.

useEffect(() => {
  const button = document.getElementById('consoleButton');

  const printConsole = () => {
    console.log('button clicked');
  };

  button.addEventListener('click', printConsole);

  // side effect๋ฅผ clean up ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.
  const removeEventListener = () => {
    button.removeEventListener('click', printConsole);
  };

  // clean up ํ•จ์ˆ˜๋ฅผ return ํ•œ๋‹ค.
  return removeEventListener;
});

์œ„์˜ ์ฝ”๋“œ๋กœ ๋ณด๋ฉด side effect๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ์—ˆ๋‹ค.
useEffect๋Š” clean up ํ•จ์ˆ˜๋ฅผ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ์— ํ˜ธ์ถœํ•œ๋‹ค.
1. ๋‹ค์Œ side effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์ „
2. ์ปดํฌ๋„ŒํŠธ๊ฐ€ unmount ๋  ๋•Œ

profile
๋Š์ž„์—†์ด ๋…ธ๋ ฅํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž (โธโธโขโธโธ) เท†

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