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

React | UseEffect() ๋ฅผ ์“ฐ๋Š” ์ด์œ 

by pajiyeee 2023. 3. 28.

state, props ๋ฅผ ํ™œ์šฉํ•ด ์›ํ•˜๋Š” UI ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ
์›ํ•˜๋Š” ํ™”๋ฉด์„ ์™„์ „ํžˆ ๊ตฌํ˜„ํ•˜๊ธฐ์— ๋ถ€์กฑํ•จ์ด ์žˆ๋‹ค.
 

๐Ÿ“ŒuseEffect ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ?

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

๐Ÿ“Œ๊ทธ๋Ÿผ Side Effect๋Š” ๋ญ˜๊นŒ?

๋ถ€์ž‘์šฉ์ด๋ผ๋Š” ๋œป์„ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ ์ข€ ๋” ํ’€์–ด ๋งํ•˜๋ฉด ๋ถ€์ˆ˜์ ์ธ ํšจ๊ณผ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ฝ”๋“œ์—์„œ ์ฃผ์š”ํ•œ ํšจ๊ณผ์— ๋”ฐ๋ผ์„œ ๋ฐœ์ƒํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ํšจ๊ณผ๋ผ๊ณ  ํ•œ๋‹ค.
ํ•จ์ˆ˜์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š”๋ฐ Input ์„ ๋ฐ›์•„ Output ์„ ์‚ฐ์ถœํ•˜๋Š” ๊ฒƒ ์ด์™ธ์˜ ๋ชจ๋“  ๋™์ž‘์„ ๋งํ•œ๋‹ค.
 
 
์ˆœ์ˆ˜ ํ•จ์ˆ˜ : side effect ๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜
์ธํ’‹์„ ๋ฐ›์•„ ์•„์›ƒํ’‹์„ ๋‚ด๋Š” ํ–‰์œ„ ์™ธ์˜ ๋‹ค๋ฅธ ํ–‰์œ„ ์—†์Œ

const sum = (x) => {
  return x + 1;
};

 
 
side Effect ๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜ : ํ•จ์ˆ˜ ๋‚ด๋ถ€ ๊ฐ’์ด ์•„๋‹Œ ์™ธ๋ถ€ ๊ฐ’๋„ ์ฝ์–ด์˜ฌ ๋•Œ

const num = 1;

const sum = (x) => {
  return x + num;
};

 
์™ธ๋ถ€์˜ ๋ณ€์ˆ˜๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ
DOM์„ ์กฐ์ž‘ํ•˜๊ณ , consoleํŒจ๋„๋กœ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ๋„
ํ•จ์ˆ˜ ์™ธ๋ถ€์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— side effect๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค.

const printNum = (x) => {
  console.log(x);
};

const changeTitle = (newTitle) => {
  const title = document.getElementById("title");

  title.innerText = newTitle;

 
 
side effect๋Š” ํ•จ์ˆ˜ ๋™์ž‘์˜ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ค์›Œ ์œ ์ง€๋ณด์ˆ˜๋„ ์–ด๋ ค์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐํ”ผํ•ด์•ผ ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด๋‘๊ณ  ์ €์žฅํ•ด๋‘” ๊ฐ’์„ ์ฝ์–ด์˜ค๋Š” ํ–‰์œ„๋Š” ํ•„์š”ํ•˜๊ณ 
์–ด๋–ค ๊ฐ’๋„ ์™ธ๋ถ€๋กœ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์„ ๋ฐฐ์ œํ•  ์ˆ˜ ์—†๋‹ค.

โœ…side effect๋Š” ํ”ผํ•  ์ˆ˜ ์—†๊ณ  useEffect๋กœ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด ์œ ์ง€๋ณด์ˆ˜์— ์•…์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

 
 
 

๐Ÿ“ŒReact์—์„œ Side Effect๋Š”?

๋ฆฌ์—‘ํŠธ์—์„œ ๋ Œ๋”๋ง์€ state, props ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ UI๋ฅผ ๊ทธ๋ ค๋‚ด๋Š” ํ–‰์œ„๋กœ UI๋Š” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋Š” state, props ๋ฅผ ํ†ตํ•ด JSX๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ฒƒ์ด ๋ณธ์งˆ์ ์ธ ์—ญํ• ์ด์ง€๋งŒ, ๊ทธ ์™ธ์˜ side effect๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
 

โœ… side effect๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

 
1. Data Fetching
ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ๋ฐฑ์—”๋“œ API๋ฅผ ํ†ตํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ํ–‰์œ„๋Š” ํ•„์ˆ˜์ ์ธ ํ–‰์œ„์ด๋‹ค.
๊ทผ๋ฐ ์ด๊ฒƒ๋„ ์™ธ๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— side effect ๋‹ค.
*FE์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” side effect ๋‹ค.
 
2. DOM์— ์ ‘๊ทผ ๋ฐ ์กฐ์ž‘
react๊ฐ€ DOM ์กฐ์ž‘์„ ์ฒ˜๋ฆฌํ•ด์ฃผ์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ DOM์— ์ ‘๊ทผํ•  ์ผ์ด ๋งŽ์ง€ ์•Š์ง€๋งŒ, ํŠน์ • ์ƒํ™ฉ์—์„œ๋Š” ์ง์ ‘ DOM์„ ์กฐ์ž‘ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
 
3. ๊ตฌ๋…(Subscribe)
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ตฌ๋…์€ ์–ด๋–ค ๊ฒƒ์„ ๊ณ„์† ๊ด€์ฐฐํ•˜๋‹ค๊ฐ€ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํŠน์ •ํ•œ ์•ก์…˜์„ ์ทจํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๋ณดํŽธ์ ์œผ๋กœ, ์‹œ๊ฐ„์„ ๊ตฌ๋…ํ•œ๋‹ค.
-setTimeout : ์‹œ๊ฐ„์„ ๊ตฌ๋…ํ•˜๋ฉด์„œ ํŠน์ •ํ•œ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค.
-setInterval : ์ผ์ • ์‹œ๊ฐ„๋งˆ๋‹ค ํŠน์ • ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค.
์™ธ๋ถ€์˜ ๊ฐ’์˜ ๋ณ€ํ™”๋ฅผ ๊ด€์ฐฐํ•˜๊ณ  ๋งž์ถฐ ๋™์ž‘์„ ํ•˜๊ธฐ์— side effect