roqkf

[React] Effect Hook ๋ณธ๋ฌธ

๐Ÿ’ป Development/React

[React] Effect Hook

ahyeon7 2022. 12. 11. 21:45

Side Effect

  • ํ•จ์ˆ˜ ๋‚ด์—์„œ ์–ด๋–ค ๊ตฌํ˜„์ด ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” Side Effect๊ฐ€ ์žˆ๋‹ค๊ณ  ์ด์•ผ๊ธฐํ•œ๋‹ค. React์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ fetch๋ฅผ ์‚ฌ์šฉํ•ด API๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•ด DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•  ๋•Œ Side Effect๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

์ „์—ญ ๋ณ€์ˆ˜ foo๋ฅผ bar๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ˆ˜์ •ํ•˜๋Š” ์˜ˆ์ œ

let foo = 'hello';

function bar() {
  foo = 'world';
}

bar(); // bar๋Š” Side Effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค!

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

Pure Function

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

Immutableํ•œ ๋ฉ”์†Œ๋“œ ์ด์šฉํ•œ ์˜ˆ์ œ

function upper(str) {
  return str.toUpperCase(); // toUpperCase ๋ฉ”์†Œ๋“œ๋Š” ์›๋ณธ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (Immutable)
}

upper('hello') // 'HELLO'

upper ํ•จ์ˆ˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์€ str์˜ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์›๋ณธ str์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Š” ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ž…๋ ฅ๋งŒ์œผ๋กœ ํ•จ์ˆ˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ๊ณ  ์žˆ์œผ๋ฉฐ ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿค” Math.random()์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค! ์™œ์ผ๊นŒ?

  • ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ’์ด ์˜ˆ์ธก์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค! ๋งค๋ฒˆ ๋˜‘๊ฐ™์€ ๊ฐ’์ด ๋ฆฌํ„ด๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿค” ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ fetch API๋ฅผ ์ด์šฉํ•ด AJAX ์š”์ฒญ์„ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ์ด ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค. ์™œ์ผ๊นŒ?

  • Ajax ์š”์ฒญ์€ ์™ธ๋ถ€ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Effect Hook

  • useEffect๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ Side effect๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” Hook ์ž…๋‹ˆ๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ์—์„œ ์‹คํ–‰ํ•˜๋Š” Side effect๋Š” ๋ธŒ๋ผ์šฐ์ € API๋ฅผ ์ด์šฉํ•˜์—ฌ, ํƒ€์ดํ‹€์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ

useEffect(ํ•จ์ˆ˜)

  • useEffect์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด์—์„œ side effect๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
  • useEffect์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐฐ์—ด๋กœ, ์ด ๋ฐฐ์—ด์—์„œ๋Š” ์กฐ๊ฑด์„ ๋‹ด๊ณ  ์žˆ๋‹ค. ์กฐ๊ฑด์€ boolean ํ˜•ํƒœ์˜ ํ‘œํ˜„์‹์ด ์•„๋‹Œ, ์–ด๋–ค ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ๋ฅผ ์˜๋ฏธํ•˜๋ฏ€๋กœ ๋ฐฐ์—ด์—๋Š” ์–ด๋–ค ๊ฐ’์˜ ๋ชฉ๋ก์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ์ข…์†์„ฑ ๋ฐฐ์—ด์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.