๐Ÿค” TIL 8์ฃผ์ฐจ React / Side Effect

lim1313ยท2021๋…„ 9์›” 6์ผ
1

๋ถ€ํŠธ์บ ํ”„ TIL

๋ชฉ๋ก ๋ณด๊ธฐ
28/49

React ๋งˆ์šดํŠธ, ์—…๋ฐ์ดํŠธ ๊ณผ์ • / ๋ผ์ดํ”„ ์‚ฌ์ดํด

  1. Render phrase์—์„œ ๋ฆฌ์•กํŠธ๋Š” ์ƒˆ๋กœ์šด props์™€ state๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ Virtual DOM์— ๋ฐ˜์˜ํ•  ๋ถ€๋ถ„์„ ๊ณ„์‚ฐํ•˜๋ฉฐ, Virtual-DOM์„ ์ƒ์„ฑํ•œ๋‹ค.
    (์ถ”๊ฐ€๋กœ ๊ฐฑ์‹ ์˜ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•œ๋‹ค.)
    ํ•œ๋งˆ๋””๋กœ state์™€ props๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์–ด๋–ค ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚˜์•ผ ํ•˜๋Š”์ง€ ๋ฆฌ์•กํŠธ๊ฐ€ ํŒŒ์•…ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

  2. ์ปดํฌ๋„ŒํŠธ๋ฅผ DOM์— ๋งˆ์šดํŠธํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.(ํŠธ๋ฆฌ์— ์‚ฝ์ž…)

  3. ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” componentDidMount(ํ•œ๋ฒˆ๋งŒ)๊ฐ€, function ์ปดํฌ๋„ŒํŠธ์—์„œ useEffect ์•ˆ์—์„œ state๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๋‹ค๋ฉด, ๋ณ€๊ฒฝ๋œ state๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ค์‹œ render์™€ commit ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๊ณผ์ •

Side Effect

ํ•จ์ˆ˜ ๋‚ด์—์„œ ์–ด๋–ค ๊ตฌํ˜„์ด ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” Side Effect๊ฐ€ ์žˆ๋‹ค๊ณ  ์ด์•ผ๊ธฐํ•œ๋‹ค.

  • ํ•จ์ˆ˜ ์™ธ์ ์ธ ๊ฒƒ์— ์˜ํ–ฅ์„ ์ฃผ๋ฉด ์•ˆ๋œ๋‹ค
  • ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค(์˜ˆ์ธก๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค)

Pure Function ์ˆœ์ˆ˜ ํ•จ์ˆ˜

์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ž€, ์˜ค์ง ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๋งŒ์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ํ•จ์ˆ˜์˜ ์ž…๋ ฅ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ, ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์—†๋‹ค. ๋˜ํ•œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š”, ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ˆœ์ˆ˜ ํ•จ์ˆ˜์—๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ๊ฐ™์€ Side Effect๊ฐ€ ์—†๋‹ค. ์ˆœ์ˆ˜ ํ•จ์ˆ˜์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š”, ์–ด๋– ํ•œ ์ „๋‹ฌ ์ธ์ž๊ฐ€ ์ฃผ์–ด์งˆ ๊ฒฝ์šฐ, ํ•ญ์ƒ ๋˜‘๊ฐ™์€ ๊ฐ’์ด ๋ฆฌํ„ด๋จ์„ ๋ณด์žฅํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์ด๊ธฐ๋„ ํ•˜๋‹ค.

  • ํ•จ์ˆ˜ ์™ธ์ ์ธ ๊ฒƒ์— ์˜ํ–ฅ์„ ์ฃผ๋ฉด ์•ˆ๋œ๋‹ค
  • ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค (์˜ˆ์ธก ๊ฐ€๋Šฅํ•ด์•ผํ•œ๋‹ค)

React์—์„œ Side-Effect ์ฒ˜๋ฆฌ

side effect๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜์ฒ˜๋ฆฌ

function UserProfile({ name }) {
  const message = `${name}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!`; //ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’ ์ƒ์„ฑ

// BAD
  document.title = `${name}์˜ ๊ฐœ์ธ์ •๋ณด`; //ํ•จ์ˆ˜ ์™ธ๋ถ€์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” Side-effect ์ฝ”๋“œ
  return <div>{message}</div>;
}

์œ„์˜ ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฌด๊ด€ํ•œ document.title์„ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ๋‹ค.

์œ„์˜ ์ฝ”๋“œ๋ฅผ useEffect()๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

function UserProfile({ name }) {
  const message = `${name}๋‹˜ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!`;

  //Side-Effect ์ฝ”๋“œ๋ฅผ UseEffect๋กœ ๋ถ„๋ฆฌ
  useEffect(() => {
    document.title = `${name}์˜ ๊ฐœ์ธ์ •๋ณด`; 
  }, [name]);
  return <div>{message}</div>;
}

์ฐธ๊ณ )
useEffect์™€ Side-Effect


Hook / useEffect

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด ์ค‘ componentDidMount์™€ componentDidUpdate, ComponentWillUnMount์˜ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ๋‹ค.

์ปดํฌ๋„ŒํŠธ๊ฐ€ Render๋œ ํ›„, useEffect๊ฐ€ ์‹คํ–‰๋œ๋‹ค.


๐Ÿค”

useEffect๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ ์ƒ๊ธด ๊ถ๊ธˆ์ฆ

(์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋‚˜ ์ •ํ™•ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค)

1. fetch API๋Š” ์™œ ์ˆœ์ˆ˜ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๊ณ , Side Effect๊ฐ€ ์žˆ๋Š”๊ฐ€?

์šฐ์„ , Side Effect์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€.

  • Side Effect๋Š” ํ•จ์ˆ˜ ์‹คํ–‰์ด ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ์ด๋‹ค.

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

์ˆœ์ˆ˜ํ•จ์ˆ˜๋Š” ์˜ค์ง ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๋งŒ์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์ฆ‰, ์ •๋ฆฌํ•˜๋ฉด ์ˆœ์ˆ˜ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋™์ผํ•œ ์ธ์ž๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฒฝ์šฐ ํ•ญ์ƒ ๊ฐ™์€ ๊ฐ’์ด ๋‚˜์™€์•ผ ํ•œ๋‹ค.(์˜ˆ์ธก์ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.)

  • ๋ถ€์ˆ˜์ ์ธ ํšจ๊ณผ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ์•ˆ ๋œ๋‹ค.

  • return ๊ฐ’์œผ๋กœ๋งŒ ์†Œํ†ตํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, fetch์˜ ๊ฒฝ์šฐ๋Š” ์–ด๋– ํ•œ๊ฐ€?

fetch๋Š” ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฐ›์€ URL๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๊ฒŒ ๋˜๋Š”๋ฐ,

  1. ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒฝ์šฐ ์‘๋‹ต๋ฐ›๋Š” ์†๋„๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ณ , ์‘๋‹ต์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ˆœ์ˆ˜ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฒƒ์ด๋‹ค.

  2. ๋˜ํ•œ, ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์—, side effect๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๊ณ , react์—์„œ๋Š” ๋ณดํ†ต fetch๋กœ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋กœ state๊ฐ’์„ ๋ณ€๊ฒฝํ•ด ์ค€๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ•จ์ˆ˜ ์™ธ๋ถ€์˜ setState๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  state๋ฅผ ๋ณ€๊ฒฝํ•ด ์ค€ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, side effect๊ฐ€ ์žˆ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋•Œ๋ฌธ์—, fetch๋Š” useEffect์•ˆ์— ์จ์ฃผ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ Side Effect๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด useEffect ์•ˆ์— ์จ์ฃผ๋Š” ๊ฒƒ์ผ๊นŒ?

2. Side Effect๋Š” ์™œ useEffect ์•ˆ์—์„œ ์‹คํ–‰์‹œ์ผœ์•ผ ํ•˜๋Š”๊ฐ€?

์™ธ๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€(Side Effect) state, prop์ด ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ์˜ ์ดˆ๊ธฐ๊ฐ’์„ ๋ฐ”ํƒ•์œผ๋กœ Virtual-DOM์„ ์ƒ์„ฑํ•˜๊ณ (render phrase) ์‹ค์ œ DOM์— ๋งˆ์šดํŠธ ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ ๋ณ€๊ฒฝ๋œ state๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‹ค์‹œ render์™€ commit ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๊ณผ์ •์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด, ์•„์˜ˆ render ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋ฉด(๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋งŒ๋“ค๊ณ ) ๋˜๋Š”๋ฐ ์™œ ๊ตณ์ด ๋‘๋ฒˆ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

๊ฒฐ๋ก ๋ถ€ํ„ฐ ์ด์•ผ๊ธฐํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋œ๋‹ค.

๊ฐ€์ƒ๋”์„ ๊ทธ๋ฆฌ๋Š” ๊ณผ์ •์—์„œ๋Š” ์˜ค์ง ์ปดํฌ๋„ŒํŠธ์˜ "์ˆœ์ˆ˜ํ•œ ๋ถ€๋ถ„"๋งŒ ํฌํ•จ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ์ธ ์ด์ „ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ์™€ ์ด๋ฒˆ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•ด ๋ฐ”๋€ ๊ฒƒ๋งŒ ๋น„๊ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Side Effect๋ฅผ ์•ผ๊ธฐํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ€์ƒ๋”์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •(render phrase)์— ํฌํ•จ๋˜๋ฉด ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ๋งˆ๋‹ค Virtual-DOM์„ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ ์š”์ฒญ์˜ ๊ฒฝ์šฐ์—๋Š” ๋™๊ธฐ์ ์œผ๋กœ ๋„คํŠธ์›Œํฌ ์‘๋‹ต์„ ๋ฐ›์•„์•ผ๋งŒ ๋‹ค์Œ ๊ณผ์ •์ด ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ฆฌ์•กํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ์ˆœ์ˆ˜ํ•œ ๋ถ€๋ถ„์„ ์‚ฌ์šฉํ•ด ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๊ณ  ๋‚œ ํ›„ ๋ถ€์ˆ˜ํšจ๊ณผ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ์ดํ›„์— ์ปดํฌ๋„ŒํŠธ ๊ฐฑ์‹ ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ๋‹ค์‹œ ๋ชจ๋“  ๊ณผ์ •์„ ๊ฑฐ์ณ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ๋„ ๊ฐ€์ƒ๋”์„ ํ™œ์šฉํ•ด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธ ํ•˜์—ฌ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

์ฐธ๊ณ )
https://oowgnoj.dev/react/side-effect

3. ์—ฌ๋Ÿฌ๊ฐœ์˜ useEffect๋Š” ์–ด๋–ค ์ˆœ์„œ๋กœ ์‹คํ–‰๋˜๋Š”๊ฐ€?

์ด ์งˆ๋ฌธ์˜ ์‹œ์ž‘์€ useEffect๊ฐ€ ๋งˆ์น˜ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ์„œ์˜€๋‹ค. ํ•˜์ง€๋งŒ, useEffect๊ฐ€ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, life cycle์— ๋”ฐ๋ผ ๋žœ๋”๋ง ๋œ ํ›„์— ์‹œ์ž‘๋˜๋Š” hook์ธ ๊ฒƒ์ด๋‹ค.

์ฆ‰, useEffect๋Š” ๋žœ๋”๋ง ํ›„ ์‹คํ–‰๋˜๊ณ , ์—ฌ๋Ÿฌ ๋ฆฌ์•กํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

https://ko.reactjs.org/docs/hooks-effect.html#example-using-hooks


profile
start coding

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